SMA vs EMA vs WMA: Hangisi BIST'te Daha İyi Çalışıyor?
Üç hareketli ortalama türünün matematiksel farklarını, BIST hisseleri üzerinde sinyal kalitesini ve hangisinin hangi koşulda daha avantajlı olduğunu Python'la test ediyoruz.
"EMA mı SMA mı?" sorusu trading forumlarının klasiklerinden. Sonunda şuna karar verdim: doğru soru "hangisi daha iyi?" değil, "hangi koşulda hangisi daha uygun?"
Üç Ortalama, Üç Mantık
SMA (Simple Moving Average) — son N kapanışın aritmetik ortalaması. Her mum eşit ağırlık taşır. Yavaş tepki verir ama gürültüye duyarsızdır.
EMA (Exponential Moving Average) — son fiyatlara üstel olarak daha fazla ağırlık verir. SMA'ya göre daha hızlı tepki verir.
WMA (Weighted Moving Average) — son muma en büyük ağırlığı, önceki mumlara doğrusal olarak azalan ağırlığı verir.
Python Kodu
import yfinance as yf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
def wma(series, period):
weights = np.arange(1, period + 1)
return series.rolling(period).apply(
lambda x: np.dot(x, weights) / weights.sum(), raw=True
)
def crossover_backtest(df, kisa, uzun, komisyon=0.001):
df = df.copy()
df["Signal"] = (df[kisa] > df[uzun]).astype(int)
df["Return"] = df["Close"].pct_change()
df["StratReturn"] = df["Signal"].shift(1) * df["Return"]
df["Trade"] = df["Signal"].diff().abs()
df["StratReturn"] -= df["Trade"] * komisyon
df["Cumulative"] = (1 + df["StratReturn"]).cumprod()
toplam_getiri = df["Cumulative"].iloc[-1] - 1
gunluk_std = df["StratReturn"].std()
sharpe = (df["StratReturn"].mean() / gunluk_std) * np.sqrt(252) if gunluk_std > 0 else 0
rolling_max = df["Cumulative"].cummax()
drawdown = (df["Cumulative"] - rolling_max) / rolling_max
max_dd = drawdown.min()
return toplam_getiri, sharpe, max_dd, df["Cumulative"]
ticker = "THYAO.IS"
df = yf.download(ticker, start="2020-01-01", end="2025-01-01", progress=False)
df.columns = df.columns.droplevel(1) if isinstance(df.columns, pd.MultiIndex) else df.columns
df["SMA20"] = df["Close"].rolling(20).mean()
df["EMA20"] = df["Close"].ewm(span=20, adjust=False).mean()
df["WMA20"] = wma(df["Close"], 20)
df["SMA50"] = df["Close"].rolling(50).mean()
df["EMA50"] = df["Close"].ewm(span=50, adjust=False).mean()
df["WMA50"] = wma(df["Close"], 50)
sonuclar = {}
for tip in ["SMA", "EMA", "WMA"]:
getiri, sharpe, dd, cumul = crossover_backtest(df, f"{tip}20", f"{tip}50")
sonuclar[tip] = {"Getiri": getiri, "Sharpe": sharpe, "MaxDD": dd, "Cumul": cumul}
print(f"\n{'Yöntem':<6} {'Getiri':>10} {'Sharpe':>10} {'Max DD':>10}")
print("-" * 40)
for tip, s in sonuclar.items():
print(f"{tip:<6} {s['Getiri']*100:>9.1f}% {s['Sharpe']:>9.2f} {s['MaxDD']*100:>9.1f}%")
fig, ax = plt.subplots(figsize=(12, 5))
for tip, s in sonuclar.items():
ax.plot(s["Cumul"], label=f"{tip} 20/50")
bah = (1 + df["Close"].pct_change()).cumprod()
ax.plot(bah, label="Buy & Hold", linestyle="--", color="gray")
ax.set_title(f"{ticker} — SMA vs EMA vs WMA (20/50 Kesişim)")
ax.legend(); ax.grid(alpha=0.3)
plt.tight_layout()
plt.show()
Backtest Sonuçları
THYAO.IS, 2020-2024, günlük veri, %0,1 komisyon dahil:
| Yöntem | Toplam Getiri | Sharpe | Max Drawdown |
|---|---|---|---|
| SMA 20/50 | %112.4 | 1.09 | %-24.1 |
| EMA 20/50 | %118.7 | 1.14 | %-22.8 |
| WMA 20/50 | %115.2 | 1.11 | %-23.4 |
Bu sonuçlar geçmiş performansı gösterir, gelecek getiri garantisi vermez.
Peki Hangisi Ne Zaman?
SMA tercih et: Uzun vadeli trend tespitinde, gürültü fazla olan dönemlerde. Kurumsal yatırımcılar SMA kullandığı için kendi kendini gerçekleştiren seviyeler oluşur.
EMA tercih et: Kısa-orta vadeli işlemlerde, hızlı trend değişimlerini erken fark etmek istediğinde.
WMA tercih et: EMA ile SMA arasında bir denge istediğinde.
BIST'e Özgü Not
BIST'te yabancı kurumsal yatırımcılar EMA'yı, bireysel yatırımcılar SMA'yı tercih ediyor. Pratik yaklaşım: EMA ile sinyal üret, SMA ile seviye onayla.
Sonuç
- Üç yöntem arasındaki getiri farkı büyük değil; strateji tasarımı ve risk yönetimi bu seçimden çok daha belirleyici.
- EMA volatil piyasada biraz daha hızlı tepki verir; SMA gürültüyü daha iyi filtreler.
- Tek başına "en iyi ortalama" arayışı yanıltıcı — piyasa rejimi, hisse karakteri ve zaman dilimi seçimden çok daha belirleyici.
Bu yazıdaki analizler ve kodlar eğitim amaçlıdır; yatırım tavsiyesi değildir.