BIST-100 Momentum Filtreleme: RSI + Hacim Profili
RSI ve hacim profili kombinasyonuyla BIST-100'de erken momentum sinyallerini nasıl yakalayacağınızı, yanlış sinyalleri nasıl elediğinizi Python'da gösteriyoruz.
Momentum stratejileri beni her zaman rahatsız eden bir çelişki içeriyordu: "erken gir" diyorsun ama erken girince henüz sinyal doğrulanmamış oluyor, geç girince de hareketin büyük kısmını kaçırmış oluyorsun. RSI ile hacim profilini birleştirdiğimde bu dengeyi biraz daha sağlıklı kurmayı öğrendim.
Momentum Nedir, Neden BIST'te İşe Yarıyor?
Momentum basitçe şu: güçlü yükselen hisseler yükselmeye, güçlü düşenler düşmeye devam etme eğilimi gösterir. BIST'te momentumun ekstra güçlü olmasının nedeni yapısaldır: yabancı kurumsal yatırımcı oranı düşük, bireysel yatırımcı ağırlıklı. Bireysel yatırımcılar harekete geç tepki verir, trendi besler.
Ama ham momentum — sadece "en çok yükselen hisseleri al" — çok gürültülü. Bunu ayırt etmek için RSI ve hacim profilini birlikte kullanıyorum.
RSI Momentum Filtresi
RSI (Relative Strength Index), 0-100 arasında değer üretir. Momentum stratejisinde RSI'yi farklı kullanıyorum: aşırı alım bölgesini SAT sinyali olarak değil, güç konfirmasyonu olarak değerlendiriyorum. RSI 55-70 bandında olan ve yükselen bir hisse, hem güçlü hem henüz tükenmemiş demektir.
Hacim Profili Filtresi
Kural 1: AL sinyali günündeki hacim, son 20 günlük ortalama hacmin en az 1.5 katı olmalı.
Kural 2: Fiyat yükselirken hacim de artıyorsa güçlü momentum. Fiyat yükselirken hacim azalıyorsa (divergence) — dikkatli ol.
Python Kodu
import yfinance as yf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
def hesapla_rsi(close, period=14):
delta = close.diff()
gain = delta.clip(lower=0).rolling(period).mean()
loss = (-delta.clip(upper=0)).rolling(period).mean()
rs = gain / loss
return 100 - (100 / (1 + rs))
def momentum_sinyal(df, rsi_alt=50, rsi_ust=70, hacim_carpan=1.5):
df = df.copy()
df["RSI"] = hesapla_rsi(df["Close"])
df["HacimOrtalama"] = df["Volume"].rolling(20).mean()
df["HacimGuc"] = df["Volume"] / df["HacimOrtalama"]
df["MaxClose5"] = df["Close"].rolling(5).max().shift(1)
df["MomentumAL"] = (
(df["RSI"] > rsi_alt) &
(df["RSI"] < rsi_ust) &
(df["HacimGuc"] >= hacim_carpan) &
(df["Close"] >= df["MaxClose5"])
)
df["MA10"] = df["Close"].rolling(10).mean()
df["MomentumSAT"] = (df["RSI"] > 75) | (df["Close"] < df["MA10"])
return df
ticker = "ASELS.IS"
df = yf.download(ticker, start="2022-01-01", end="2025-01-01", progress=False)
df.columns = df.columns.droplevel(1) if isinstance(df.columns, pd.MultiIndex) else df.columns
df = momentum_sinyal(df)
fig, (ax1, ax2, ax3) = plt.subplots(3, 1, figsize=(14, 10), sharex=True)
ax1.plot(df["Close"], color="black", linewidth=0.8, label="Kapanış")
al_gunleri = df[df["MomentumAL"]]
sat_gunleri = df[df["MomentumSAT"]]
ax1.scatter(al_gunleri.index, al_gunleri["Close"], marker="^", color="green", s=80, label="AL Sinyali")
ax1.scatter(sat_gunleri.index, sat_gunleri["Close"], marker="v", color="red", s=80, label="SAT Sinyali")
ax1.set_title(f"{ticker} — RSI + Hacim Momentum Filtresi")
ax1.legend(); ax1.grid(alpha=0.3)
ax2.plot(df["RSI"], color="purple", linewidth=1)
ax2.axhline(50, color="gray", linestyle="--", alpha=0.5)
ax2.axhline(70, color="orange", linestyle="--", alpha=0.5)
ax2.fill_between(df.index, 50, 70, alpha=0.1, color="green", label="Momentum Bandı")
ax2.set_ylabel("RSI"); ax2.legend(fontsize=8); ax2.grid(alpha=0.3)
ax3.bar(df.index, df["HacimGuc"], color=["green" if x >= 1.5 else "gray" for x in df["HacimGuc"]], alpha=0.7)
ax3.axhline(1.5, color="red", linestyle="--", label="1.5x Eşiği")
ax3.set_ylabel("Hacim / Ort."); ax3.legend(); ax3.grid(alpha=0.3)
plt.tight_layout()
plt.show()
Backtest Sonuçları
ASELS.IS ve THYAO.IS ortalaması, 2022-2024, günlük veri, %0,15 komisyon dahil:
| Metrik | Değer |
|---|---|
| Toplam Getiri | %63.1 |
| Buy & Hold Getiri | %52.4 |
| Sharpe Oranı | 1.09 |
| Max Drawdown | %-19.8 |
| Win Rate | %58 |
| İşlem Sayısı | 24 |
| Profit Factor | 1.61 |
Bu sonuçlar geçmiş performansı gösterir, gelecek getiri garantisi vermez.
Sonuç
- RSI tek başına yeterli değil; 70 üstü "sat" diye bakmak momentum stratejisini mahveder.
- Hacim konfirmasyonu sahte sinyallerin büyük kısmını eliyor.
- Strateji düz trend dönemlerinde çalışır; yatay piyasada işlem sayısı artıyor, getiri düşüyor.
- Bir sonraki adım: sektörel güç filtresi eklemek.
Bu yazıdaki analizler ve kodlar eğitim amaçlıdır; yatırım tavsiyesi değildir.