Her sabah TradingView'ı açıp hisselere tek tek bakmaktan sıkılmıştım. Takip ettiğim 15-20 hissede destek-direnç kontrolü, hareketli ortalama durumu, RSI seviyeleri... Elle yapmak en az yarım saat sürüyordu. Sonra düşündüm: ben zaten Python otomasyonu yapıyorum, neden bunu da otomatikleştirmiyorum? 30 satır kodla başladığım iş, şimdi sabah kahvaltısında 500 hisseyi tarayan bir scripte dönüştü.
Başlamak İçin Ne Lazım?
Çok az şey. Python kurulu bir bilgisayar, bir terminal ve üç kütüphane: yfinance, pandas ve matplotlib. Hepsi ücretsiz. Kurulum tek satır:
pip install yfinance pandas matplotlib
yfinance, Yahoo Finance'in verilerine Python üzerinden erişmenizi sağlayan bir kütüphane. BIST hisseleri dahil dünya genelinde binlerce hissenin geçmiş verilerine ulaşabilirsiniz. BIST hisseleri için sembolün sonuna ".IS" ekliyorsunuz. Mesela Türk Hava Yolları için THYAO.IS, Garanti Bankası için GARAN.IS.
İlk Adım: Tek Bir Hissenin Verisini Çekmek
Diyelim ki THYAO'nun son 1 yıllık fiyat hareketini görmek istiyorsunuz. Kod şu kadar:
import yfinance as yf
hisse = yf.download("THYAO.IS", period="1y")
print(hisse.tail())
Bu kod size THYAO'nun son 1 yılındaki günlük açılış, kapanış, en yüksek, en düşük fiyatlarını ve işlem hacmini veriyor. Üç satır. İlk çalıştırdığımda ekranda bu tablonun belirmesi beni inanılmaz heyecanlandırmıştı. TradingView'da elle yaptığım işi Python 2 saniyede yapıyordu.
Birden fazla hisse çekmek de kolay. Sadece sembol listesini genişletiyorsunuz:
semboller = ["THYAO.IS", "GARAN.IS", "ASELS.IS", "BIMAS.IS", "SISE.IS"]
veriler = yf.download(semboller, period="6mo")
print(veriler["Close"].tail())
Hareketli Ortalama Hesaplamak
Teknik analiz yazımda 50 ve 200 günlük hareketli ortalamaları nasıl kullandığımı anlatmıştım. Python ile bunu hesaplamak tek satır:
import matplotlib.pyplot as plt
df = yf.download("THYAO.IS", period="2y")
df["MA50"] = df["Close"].rolling(window=50).mean()
df["MA200"] = df["Close"].rolling(window=200).mean()
plt.figure(figsize=(12, 6))
plt.plot(df["Close"], label="Kapanış", alpha=0.7)
plt.plot(df["MA50"], label="50 Günlük MA", linewidth=2)
plt.plot(df["MA200"], label="200 Günlük MA", linewidth=2)
plt.title("THYAO - Fiyat ve Hareketli Ortalamalar")
plt.legend()
plt.grid(True, alpha=0.3)
plt.savefig("thyao_analiz.png", dpi=150)
plt.show()
Bu kod THYAO'nun kapanış fiyatını, 50 ve 200 günlük hareketli ortalamalarını aynı grafik üzerinde çiziyor ve PNG olarak kaydediyor. Golden cross veya death cross oluşmuş mu, trendin yönü ne, hepsi bir bakışta görünüyor.
RSI Hesaplayıp Aşırı Alım/Satım Filtrelemek
RSI hesaplamak biraz daha fazla kod gerektiriyor ama karmaşık değil:
def rsi_hesapla(seri, periyot=14):
delta = seri.diff()
kazanc = delta.where(delta > 0, 0).rolling(window=periyot).mean()
kayip = (-delta.where(delta < 0, 0)).rolling(window=periyot).mean()
rs = kazanc / kayip
return 100 - (100 / (1 + rs))
df["RSI"] = rsi_hesapla(df["Close"])
print(f"THYAO Güncel RSI: {df['RSI'].iloc[-1]:.1f}")
Bu fonksiyonu bir kere yazıyorsunuz, sonra istediğiniz hisseye uyguluyorsunuz. 500 hisseyi döngüyle tarayıp RSI'ı 30'un altında olanları listelemek de mümkün. Elle yapılması saatler sürecek bir iş, Python ile 10-15 saniye.
Toplu Tarama: BIST 100'de Fırsat Avı
İşin heyecan verici kısmı burası. Diyelim ki BIST 100'deki tüm hisseleri tarayıp şu kriterlere uyanları bulmak istiyorsunuz: RSI 35'in altında (potansiyel aşırı satım) ve fiyat 200 günlük ortalamanın üstünde (uzun vadeli trend yukarı). Yani trendin güçlü olduğu ama kısa vadede düzeltme yapmış hisseler.
import pandas as pd
# BIST 100 sembollerinden bir kesit
semboller = ["THYAO.IS", "GARAN.IS", "ASELS.IS", "BIMAS.IS",
"SISE.IS", "TUPRS.IS", "EREGL.IS", "FROTO.IS",
"AKBNK.IS", "KCHOL.IS"]
sonuclar = []
for sembol in semboller:
try:
df = yf.download(sembol, period="1y", progress=False)
if len(df) < 200:
continue
df["MA200"] = df["Close"].rolling(200).mean()
df["RSI"] = rsi_hesapla(df["Close"])
son = df.iloc[-1]
if son["RSI"] < 35 and son["Close"] > son["MA200"]:
sonuclar.append({
"Sembol": sembol.replace(".IS", ""),
"Fiyat": round(son["Close"], 2),
"RSI": round(son["RSI"], 1),
"MA200": round(son["MA200"], 2)
})
except:
continue
print(pd.DataFrame(sonuclar))
Bu script her sabah çalıştırılabilir, hatta Python otomasyon yazımda anlattığım gibi zamanlı görev (cron job veya Task Scheduler) olarak ayarlanabilir. Sabah bilgisayarı açtığınızda sonuçlar sizi bekliyor olur.
"Python sizi daha iyi bir trader yapmaz. Ama daha hızlı ve daha disiplinli bir araştırmacı yapar. Karar yine sizin."
Verileri Excel'e Aktarmak
Her şeyi Python içinde yapmak zorunda değilsiniz. Çektiğiniz verileri Excel'e aktarıp orada da çalışabilirsiniz:
df.to_excel("thyao_veriler.xlsx", index=True)
Tek satır. Bionluk'ta mali analiz raporu hazırladığım müşteriler için de bu yöntemi kullanıyorum. Python ile veriyi çekip temizliyorum, Excel'de formatları düzenleyip sunuyorum. İki aracın güçlü yanlarını birleştirmek en verimli çalışma şekli.
Dikkat Edilmesi Gereken 3 Önemli Nokta
1. Veri Gecikmesi
yfinance ücretsiz bir servis ve verilerde 15-20 dakika gecikme olabiliyor. Gün sonu analizi için sorun değil ama gün içi alım-satım kararları için güvenilir değil. Anlık veri gerekiyorsa profesyonel veri sağlayıcılara (Matriks, ForInvest gibi) bakmanız gerekir.
2. Backtest ile Gerçek Piyasa Farkı
Geçmiş verilerle bir strateji test edip harika sonuçlar almak kolay. "Şu kurallara göre alsaydım, 2 yılda %80 kazanırdım" diye sevinen çok kişi gördüm. Ama geçmiş veride slippage (fiyat kayması), komisyon maliyeti ve psikolojik baskı yok. Gerçek piyasada sonuçlar her zaman daha mütevazı olur. Paper trading ile (sanal para) en az birkaç ay test edin.
3. Overfit Tuzağı
Stratejinizi geçmiş veriye çok fazla uydurmak (overfitting) en yaygın hatalardan biri. RSI 32.7'nin altı ve MA47'nin üstündeyken al gibi aşırı spesifik kurallar geçmişte mükemmel çalışır ama gelecekte işe yaramaz. Basit ve genel kurallar, karmaşık olanlardan daha dayanıklıdır.
Yapay Zeka ile Birleştirmek
Prompt mühendisliği yazımda anlattığım gibi, yapay zekayı Python kodlama sürecine de dahil edebilirsiniz. Claude'a "yfinance ile BIST 30 hisselerinin son 6 aylık kapanış verilerini çekip, Bollinger Bandı hesaplayan bir Python scripti yaz" gibi spesifik bir talimat verdiğinizde, çalışır kod üretiyor. Siz de bu kodu kendi ihtiyaçlarınıza göre düzenliyorsunuz.
Ben artık yeni bir analiz fikri aklıma geldiğinde önce Claude'a taslak kodu yazdırıyorum, sonra test edip düzeltiyorum. Sıfırdan yazmaya göre 3-4 kat hızlı. ChatGPT ile para kazanma yazımda bahsettiğim verimlilik artışı burada da geçerli.
Bugün Deneyebileceğiniz 3 Pratik
- Yukarıdaki ilk kod bloğunu kopyalayıp çalıştırın. Takip ettiğiniz bir hissenin son 1 yıllık verisini çekin ve
.tail()ile son 5 güne bakın. - Hareketli ortalama kodunu kullanarak takip ettiğiniz 3-5 hissenin grafiğini çizin. Golden cross veya death cross oluşmuş mu kontrol edin.
- RSI fonksiyonunu yazıp portföyünüzdeki hisselerin güncel RSI değerlerini hesaplayın. Aşırı alım veya satım bölgesinde olan var mı bakın.
Sıkça Sorulan Sorular
Python ile BIST hisse verilerini çekmek için ne gerekiyor?
yfinance ile çekilen BIST verileri güvenilir mi?
Python bilmeden borsa analizi yapılabilir mi?
Erman Ergeç
Bankacılık geçmişiyle Python otomasyonu, mali analiz ve borsa veri analizi konularında içerik ve danışmanlık hizmeti sunan freelancer.
Python Otomasyon Hizmeti →