Strateji05.04.2026schedule3 min read

Trend Following Nedir? BIST'te Nasıl Uygulanır?

Hareketli ortalama kesişimiyle trend takibinin mantığını, BIST'e özgü uyarlamalarını ve neden bu kadar çok sevilen ama sık yanlış kullanılan bir strateji olduğunu anlatıyoruz.

Algoritmik tradinge ilk adım attığımda elim hep trend following'e gitti. Basit görünüyor, mantıklı hissettiriyor, backtest'lerde iyi çıkıyor. "İşte bu" diyorsun. Sonra gerçek hesapta deniyorsun. O zaman anlıyorsun neden bu stratejinin "basit ama kolay değil" diye tarif edildiğini — çünkü asıl sınav rakamları değil, sinyale uymak.

Trend Following - Borsa Grafikleri

Trend Following Mantığı

Trend following'in özü tek cümlede: fiyat yükseliyorsa al, düşüyorsa sat. Momentum'a güvenmek. Bir varlığın hareket yönünü sürdürme eğiliminde olduğunu varsaymak.

Bu varsayımın arkasında hem davranışsal hem yapısal nedenler var. Davranışsal tarafta: yatırımcılar iyi haberlere aşamalı tepki verir, herkes aynı anda pozisyon almaz. Yapısal tarafta: kurumsal yatırımcılar büyük pozisyonları tek seferde alamaz, kademeli giriş trendi uzatır.

BIST özelinde bu dinamik hem güçlü hem kırılgan çalışır. Güçlü: özellikle 2020-2023 döneminde BIST tek yönlü trendler üretti. Kırılgan: BIST'in görece düşük derinliği ve yabancı yatırımcı duyarlılığı, trendleri ani ve sert kesilebilir yapıyor.

Hareketli Ortalama Kesişimi

En yaygın trend following aracı hareketli ortalama (MA) kesişimidir. Klasik kombinasyon: 50 günlük ve 200 günlük SMA. BIST'te deneyimlerime göre bu kombinasyon günlük veri için çok yavaş kalıyor. 20-50 günlük kombinasyon daha dengeli sinyal üretiyor — ama beraberinde daha fazla yanlış sinyal de getiriyor.

Python Kodu: Colab'da Çalışır

import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt

ticker = "THYAO.IS"
df = yf.download(ticker, start="2022-01-01", end="2025-01-01", progress=False)

df["MA20"] = df["Close"].rolling(window=20).mean()
df["MA50"] = df["Close"].rolling(window=50).mean()

df["Signal"] = 0
df.loc[df["MA20"] > df["MA50"], "Signal"] = 1

df["Position"] = df["Signal"].diff()

fig, ax = plt.subplots(figsize=(14, 6))
ax.plot(df["Close"], label="Kapanış", alpha=0.7, color="gray")
ax.plot(df["MA20"], label="MA20", color="blue", linewidth=1.2)
ax.plot(df["MA50"], label="MA50", color="orange", linewidth=1.2)

al_sinyalleri = df[df["Position"] == 1]
ax.scatter(al_sinyalleri.index, al_sinyalleri["Close"],
           marker="^", color="green", s=100, label="AL", zorder=5)

sat_sinyalleri = df[df["Position"] == -1]
ax.scatter(sat_sinyalleri.index, sat_sinyalleri["Close"],
           marker="v", color="red", s=100, label="SAT", zorder=5)

ax.set_title(f"{ticker} — MA20/MA50 Trend Takip Sistemi")
ax.legend()
ax.grid(alpha=0.3)
plt.tight_layout()
plt.show()

df["Return"] = df["Close"].pct_change()
df["StratReturn"] = df["Signal"].shift(1) * df["Return"]

kumulatif_strateji = (1 + df["StratReturn"]).cumprod().iloc[-1] - 1
kumulatif_bist = (1 + df["Return"]).cumprod().iloc[-1] - 1

print(f"Strateji getirisi : %{kumulatif_strateji*100:.1f}")
print(f"Buy & Hold getiri : %{kumulatif_bist*100:.1f}")

BIST Teknik Analiz Ekranı

BIST'e Özgü Uyarlamalar

Kodu çalıştırıp sinyallere baktığınızda bir sorun hemen göze çarpacak: çok fazla yanlış sinyal. BIST'te bunu azaltmak için uyguladığım filtreler:

Hacim filtresi: AL sinyali için ortalama hacmin en az 1,5 katı hacim şartı koy.

Trend gücü filtresi: MA'ların açısına bak. İki ortalama birbirine paralel hareket ediyorsa sinyal güvenilmez.

Seans saati: BIST'te ilk 30 dakika ve son 15 dakika volatil geçer. Bu pencerelerde sinyal almamak mantıklı.

Sonuç

  • Trend following basit kurallı ama demir gibi disiplin gerektiren bir yaklaşım. Sistem sizi kurtarmaz, siz sisteme uyarsanız kurtarır.
  • MA kesişimi tek başına yeterli değil; hacim ve trend gücü filtreleriyle desteklenmeli.
  • BIST'te bu stratejinin çalışmadığı dönem yatay ve choppy piyasalardır.
  • Bir sonraki adım: bu sinyallere Süpertrend veya RSI konfirmasyonu eklemek.

Bu yazıdaki analizler ve kodlar eğitim amaçlıdır; yatırım tavsiyesi değildir.