Python ile BIST Verisi Çekme — Başlangıç Rehberi
yfinance ve pandas kullanarak BIST hisse verilerini Google Colab'da nasıl çekeceğinizi, temizleyeceğinizi ve analiz için hazırlayacağınızı adım adım anlatıyoruz.
Algoritmik trading yolculuğumda ilk büyük engel veri değildi, veriye ulaşmaktı. Bloomberg terminali yoktu, veri sağlayıcı aboneliği yoktu. Sonra yfinance'i keşfettim — ücretsiz, kurulumu beş dakika, Colab'da direkt çalışıyor. O günden beri başlangıç noktam burası. Bu yazı, aynı noktadan başlamak isteyen herkese adım adım rehber.
Neden yfinance?
Python'da finansal veri çekmenin birçok yolu var ama yfinance başlangıç için açık ara en pratik seçenek. Ücretsiz, Yahoo Finance'in altyapısını kullanıyor, BIST hisselerini .IS uzantısıyla destekliyor ve günlük/haftalık/aylık frekanslarda OHLCV verisi veriyor.
Sınırları da var: gerçek zamanlı veri yok (15 dakika gecikmeli), çok sık istek atarsanız rate limit yiyorsunuz, ve zaman zaman veri boşlukları olabiliyor. Profesyonel ortamda başka çözümler gerekir — ama strateji geliştirme ve backtest için fazlasıyla yeterli.
Adım 1: Kurulum ve İlk Veri Çekimi
Colab'da yfinance varsayılan olarak gelmez. İlk hücrede kurulumu yapın, sonra kütüphaneleri import edin.
# Colab'da kurulum
!pip install yfinance --quiet
import yfinance as yf
import pandas as pd
import numpy as np
Adım 2: Tek Hisse Verisi Çekme
BIST sembolleri Yahoo Finance'de .IS uzantısıyla tanımlanır. THYAO değil, THYAO.IS yazmanız gerekiyor.
ticker = "THYAO.IS"
df = yf.download(
ticker,
start="2022-01-01",
end="2025-01-01",
progress=False
)
# MultiIndex sütunlarını düzleştir
if isinstance(df.columns, pd.MultiIndex):
df.columns = df.columns.droplevel(1)
print(df.shape)
print(df.head())
print(df.isnull().sum())
Adım 3: Birden Fazla Hisse Aynı Anda
Portföy analizi için birden fazla hisseyi tek seferde çekebilirsiniz.
semboller = ["THYAO.IS", "GARAN.IS", "ASELS.IS", "EREGL.IS", "SISE.IS"]
ham_veri = yf.download(semboller, start="2022-01-01", end="2025-01-01", progress=False)
kapanis = ham_veri["Close"]
kapanis.columns = [s.replace(".IS", "") for s in kapanis.columns]
print(kapanis.tail())
print(f"\nEksik veri:\n{kapanis.isnull().sum()}")
Adım 4: Veri Temizleme ve Hazırlama
Ham veri her zaman temiz gelmez. Eksik günler, sıfır hacim, tatil günleri — bunları temizlemeden analiz yapmak yanıltıcı sonuçlar üretir.
def veri_temizle(df):
df = df.copy()
df = df.dropna(how="all")
if "Volume" in df.columns:
df = df[df["Volume"] > 0]
df = df.ffill()
df = df.dropna()
df.index = pd.to_datetime(df.index)
return df
df_temiz = veri_temizle(df)
print(f"Ham veri: {len(df)} satır → Temiz veri: {len(df_temiz)} satır")
Adım 5: Günlük Getiri ve Temel İstatistikler
Fiyat verisi hazır olunca ilk hesaplama genellikle günlük getiridir.
df_temiz["LogGetiri"] = np.log(df_temiz["Close"] / df_temiz["Close"].shift(1))
df_temiz["PctGetiri"] = df_temiz["Close"].pct_change()
df_temiz["KumulatifGetiri"] = (1 + df_temiz["PctGetiri"]).cumprod()
yillik_getiri = df_temiz["PctGetiri"].mean() * 252
yillik_std = df_temiz["PctGetiri"].std() * (252 ** 0.5)
sharpe = yillik_getiri / yillik_std
print(f"Yıllık Getiri : %{yillik_getiri*100:.1f}")
print(f"Yıllık Volatilite: %{yillik_std*100:.1f}")
print(f"Sharpe Oranı : {sharpe:.2f}")
Adım 6: XU100 Endeks Verisi
Strateji performansını XU100 ile kıyaslamak için endeks verisi şart.
xu100 = yf.download("XU100.IS", start="2022-01-01", end="2025-01-01", progress=False)
if isinstance(xu100.columns, pd.MultiIndex):
xu100.columns = xu100.columns.droplevel(1)
xu100 = veri_temizle(xu100)
xu100["PctGetiri"] = xu100["Close"].pct_change()
print(xu100[["Close", "Volume", "PctGetiri"]].tail(5))
Sonuç
- yfinance + pandas kombinasyonu BIST analizi için güçlü ve ücretsiz bir başlangıç noktası.
- Veri temizleme adımlarını atlamamak önemli — kirli veriyle yapılan backtest her zaman yanlış sonuç üretir.
- Bir sonraki adım: bu temiz veri üzerine teknik indikatörler hesaplamak — RSI, MACD, ATR.
Bu yazıdaki kodlar eğitim amaçlıdır; yatırım tavsiyesi değildir.