Fiyat Verisini Yüklemek: CSV Dosyaları ve Ücretsiz API'ler, Düzeltilmiş ve Düzeltilmemiş Fiyatlar, Eksik Değerler ve Saat Dilimleri
Fiyat dosyalarını ve API indirmelerini temiz bir DataFrame'e okuyun, bölünme ve temettü düzeltmelerinin nasıl çalıştığını anlayın ve boşlukları ile saat dilimlerini doğru şekilde ele alın.
Neler öğreneceksiniz
- Bir CSV dosyasının doğru tarihlerle bir DataFrame'e nasıl okunacağı ve olağan içe aktarma sorunlarını düzelten argümanlar.
- Ücretsiz veri API'lerinin size ne sunduğu, lisanslarının ve varsayılan ayarlarının ne anlama geldiği ve indirmelerin nasıl önbelleğe alınacağı.
- Bölünme ve temettü düzeltme faktörlerinin nasıl hesaplandığı ve bir geriye dönük testin neden düzeltilmiş fiyatlara, gerçek bir emrin ise neden düzeltilmemiş fiyatlara ihtiyaç duyduğu.
- Eksik değerlerin nasıl bulunup ele alınacağı ve çubuklarınızı kaydırmadan saat dilimlerinin nasıl atanıp dönüştürüleceği.
Açıklama
CSV dosyaları. Bir CSV (comma-separated values, virgülle ayrılmış değerler) dosyası, her çubuk için bir satır içeren düz metindir. Temel çağrı şudur:
df = pd.read_csv("data/raw/xyz.csv", parse_dates=["Date"], index_col="Date")
parse_dates metin sütununu zaman damgalarına dönüştürür, index_col ise onu indeks yapar. Sık kullanılan düzeltmeler: Almanca dışa aktarımlar için sep=";" ve decimal=",", 03.04.2025 gibi tarihler için dayfirst=True ve ayrıştırma yanlış olduğunda date_format="%d.%m.%Y". Yükledikten sonra df = df.sort_index() çalıştırın (bazı dışa aktarımlar en yeniden eskiye sıralıdır), df.index.is_unique değerini kontrol edin ve sütun adlarını df.columns = df.columns.str.lower() ile küçük harfe çevirin.
Ücretsiz API'ler. Bir API (application programming interface, uygulama programlama arayüzü), kodun bir sunucudan veri talep etmesini sağlar. İlk proje için olağan seçim yfinance kütüphanesidir (Yahoo Finance verisi): yf.download("SAP.DE", start="2015-01-01"); kişisel araştırma amaçlıdır ve doğruluğu garanti edilmez. Bir varsayılan önemlidir: 2026 itibarıyla auto_adjust=True geçerlidir; yani açılış, en yüksek, en düşük ve kapanış zaten bölünmeler ve temettüler için düzeltilmiştir ve "Adj Close" sütunu yoktur. auto_adjust=False ile bölünmeye göre düzeltilmiş OHLC ile birlikte temettüleri de içeren bir "Adj Close" sütunu alırsınız. Ücretsiz katmanları olan alternatifler arasında Stooq (CSV indirmeleri), Alpha Vantage ve Tiingo (kayıt ve API anahtarı gerekir, katı istek limitleri vardır) bulunur; koşullar değişir, bu yüzden güncel şartları kontrol edin. 12. ders anahtar yönetimini ve istek limitlerini ele alıyor. Kaynak ne olursa olsun, ham indirmeyi bir kez data/raw/ klasörüne (CSV veya Parquet) kaydedin ve dosya üzerinden çalışın; sağlayıcılar geçmiş veriyi revize eder ve limitler kısıtlıdır.
Düzeltilmiş ve düzeltilmemiş. "Sistematik Trading" kursu, bölünmelerin ve temettülerin geriye dönük testleri neden bozduğunu açıklamıştı; burada düzeltmenin nasıl çalıştığını görüyoruz. n'e 1 bölünmede önceki her fiyat n'e bölünür (ve hacim n ile çarpılır). Hak kesim tarihi t günü olan nakit temettü D için standart yöntem, t gününden önceki tüm fiyatları 1 − D ÷ C faktörüyle çarpar; burada C, hak kesim tarihinden önceki son günün kapanışıdır. Düzeltmeler geriye doğru birikir. Sonuçlar: düzeltilmiş geçmiş her yeni temettüyle değişir ve yüzde getiriler doğruyken euro cinsinden fiyat seviyeleri doğru değildir. Kural: geriye dönük testi düzeltilmiş veriyle yapın, gerçek emirleri düzeltilmemiş fiyatlarla verin ve ikisini asla tek bir hesaplamada karıştırmayın.
Eksik değerler. pandas boşlukları NaN olarak işaretler. Onları df.isna().sum() ile bulun. Birkaç fiyat boşluğunu df["close"].ffill() ile ileriye doğru doldurmak kabul edilebilir; ancak hacmi asla ileriye doğru doldurmayın ve fiyatları asla enterpolasyonla doldurmayın, çünkü enterpolasyon gelecekteki değeri kullanır ve ileriye bakma yanlılığı yaratır (7. ders). Aksi hâlde satırları df.dropna(subset=["close"]) ile silin ve kaç tane olduğunu kaydedin. Eski fillna(method="ffill") sözdiziminin pandas 2.1'den beri kullanımdan kaldırıldığını ve yeni kodda kullanılmaması gerektiğini unutmayın; .ffill() yazın.
Saat dilimleri. Günlük çubuklar nadiren saat dilimine ihtiyaç duyar; gün içi veriler ise her zaman duyar. tz_localize("Europe/Berlin"), saatleri değiştirmeden saat dilimi bilgisi olmayan bir indekse saat dilimi iliştirir; tz_convert("America/New_York") ise saatleri değiştirir. UTC verisini yanlışlıkla Berlin'e atamak, her çubuğu fark ettirmeden bir veya iki saat kaydırır; bu yüzden sağlayıcının belgelerini kontrol edin. Yaz saati uygulaması tarihleri Avrupa ile ABD arasında farklılık gösterir; yanlış işlenen zaman damgaları enstrümanları tam da bu dönemlerde birbirinden kaydırır.
Çözümlü örnek
Varsayımsal örnek: bir hisse pazartesi günü €50.00'dan kapanıyor. €1.00 tutarındaki bir temettünün hak kesim tarihi salıdır ve hisse o gün €49.50'den kapanıyor. Ücretler ve vergiler dikkate alınmamıştır.
Düzeltme faktörü = 1 − 1.00 ÷ 50.00 = 0.98. Salıdan önceki tüm fiyatlar 0.98 ile çarpılır: pazartesi kapanışı 50 × 0.98 = €49.00 olur; önceki haftadan €48.00'lık bir kapanış 48 × 0.98 = €47.04 olur.
Hak kesim tarihi boyunca getiri: düzeltilmemiş (49.50 − 50.00) ÷ 50.00 = −1.0%; bu, yanlış biçimde bir kayıp gibi görünür. Düzeltilmiş (49.50 − 49.00) ÷ 49.00 = +1.02%; bu ise €0.50'lık fiyat kaybına karşılık alınan €1.00 nakdi doğru şekilde yansıtır (€50 üzerinde net +€0.50; küçük fark, düzeltilmiş tabanın €49 olmasından kaynaklanır).
Şimdi 2'ye 1 bölünme: öncesinde ham kapanışlar 100, 102, 104, sonrasında 52, 53. Bölünme öncesi fiyatları 2'ye bölmek 50, 51, 52, 52, 53 verir; kesintisiz bir seri. Bu yapılmazsa pct_change() bölünme gününde −50%'lik bir getiri bildirir; hiç yaşanmamış bir çöküş.
Sık yapılan hata
info(), head(), tail(), isna().sum() ve kapanış fiyatının bir çizgi grafiğine ayırın.Uygulama etkinliği
Kâğıt üzerinde: bir hissenin iki gün boyunca €90.00 ve €93.00 kapanışları var, ardından 3'e 1 bölünme gerçekleşiyor, sonra €31.00 ve €30.38 kapanışları geliyor (varsayımsal). €30.38 kapanışının olduğu gün €0.60 tutarındaki bir temettünün hak kesim tarihidir ve bundan önceki kapanış €31.00'dır. (a) Bölünme öncesi iki kapanışın bölünmeye göre düzeltilmiş değerlerini yazın. (b) Temettü düzeltme faktörünü hesaplayın ve hak kesim tarihinden önceki üç kapanışın tamamına uygulayın. (c) €31.00 kapanışından €30.38 kapanışına ham ve tam düzeltilmiş getiriyi belirtin.
Çözümü göster
(a) 3'e bölün: €90.00 → €30.00 ve €93.00 → €31.00.
(b) Faktör = 1 − 0.60 ÷ 31.00 = 0.98065 (yuvarlanmış). Uygulandığında: 30.00 × 0.98065 = €29.42; 31.00 × 0.98065 = €30.40; hak kesim öncesi €31.00 kapanışı da €30.40 olur. €30.38 kapanışı değişmez.
(c) Ham: (30.38 − 31.00) ÷ 31.00 = −2.00%. Düzeltilmiş: (30.38 − 30.40) ÷ 30.40 = −0.07%; bu, neredeyse yataydır: fiyat yaklaşık temettü tutarı kadar düştü, dolayısıyla hisse sahibi toplam getiri açısından neredeyse hiçbir şey kaybetmedi.
Sınırlamalar: sağlayıcılar faktörleri farklı şekilde yuvarlar ve bazıları farklı bir referans fiyat kullanır; tek bir sağlayıcının düzeltilmiş serisini tutarlı biçimde kullanın.
Önemli çıkarımlar
parse_datesveindex_colile yükleyin, ardından sıralayın, benzersizliği kontrol edin ve sütun adlarını standartlaştırın.- Bir kez indirin, ham veriyi yerel olarak kaydedin ve API'nin lisansını ve düzeltme varsayılanlarını okuyun (yfinance: 2026 itibarıyla
auto_adjust=True). - Bölünme faktörü 1 ÷ n, temettü faktörü 1 − D ÷ C'dir ve geriye doğru uygulanır; geriye dönük testi düzeltilmiş fiyatlarla yapın, işlemi düzeltilmemiş fiyatlarla gerçekleştirin.
- En fazla birkaç fiyat boşluğunu ileriye doğru doldurun, asla enterpolasyon yapmayın, hacmi asla ileriye doğru doldurmayın ve saat dilimlerini sağlayıcının gerçek saat dilimiyle bir kez atayın.
Sonraki adım
5. ders fiyatları getirilere dönüştürüyor: basit ve logaritmik getiriler, kümülatif getiriler, yıllıklandırılmış getiri ve volatilite ve kayan pencereler.
Öz değerlendirme
Soruları yanıtlayın, ardından yanıtlarınızı kontrol edin. İstediğiniz kadar tekrar deneyebilirsiniz.
Kendi tekrarınız için otomatik öz değerlendirme. Cevaplarınız tarayıcınızda kontrol edilir; bunları görmez ve değerlendirmeyiz. Bu bir sınav veya yeterlilik değildir.
İlerlemeniz
“Tamamlandı” yalnızca dersi bitirdiğinizi işaretlediğiniz anlamına gelir. Anlayışınızın bir sınavı değildir. İlerleme ve notlar yalnızca bu cihazdaki bu tarayıcıda saklanır — bir hesapta değil.