Strateji03.09.2026schedule4 min read

Sektör Rotasyonu: Göreceli Güç ile BIST'te Doğru Tarafta Durmak

BIST sektör endekslerini göreceli güç skoruyla sıralıyor, her ay en güçlü iki sektörü taşıyan rotasyon sistemini kuruyor ve XU100'e karşı backtest ediyoruz.

BIST'te endeks yatay giderken bir sektörün sessizce %40 yaptığı yıllar gördüm — ve tam tersini: endeks ralli yaparken elimdeki sektörün yerinden kımıldamadığı yıllar da. Zamanla şu kanaate vardım: hisse seçiminden önce sektör seçimi gelir. Doğru sektördeyseniz vasat hisse bile taşır; yanlış sektördeyseniz en iyi bilanço bile kurtarmaz.

Sektör Rotasyonu

Göreceli Güç Nedir?

Buradaki göreceli güç (relative strength), RSI ile karıştırılmasın: bir sektörün getirisinin piyasaya kıyasla ne durumda olduğudur. XBANK son 3 ayda %20, XU100 %10 yaptıysa bankacılığın göreceli gücü pozitiftir — sermaye o sektöre akıyordur.

Rotasyon sisteminin arkasındaki gözlem, momentumun kesitsel (cross-sectional) versiyonudur: kazanan sektörler bir süre kazanmaya devam eder. Sermaye BIST'te sektörler arasında dalgalar halinde döner — bir dönem bankacılık, bir dönem sanayi ihracatçıları, bir dönem perakende. Bu dalgaların tepesini tahmin edemezsiniz; ama süren dalgaya binmek için tahmine gerek yoktur, ölçüm yeter.

Adım 1: Sektör Verisi ve Skor

Beş ana sektör endeksini çekip, kısa ve orta vadeyi birlikte tartan bileşik bir göreceli güç skoru hesaplıyoruz. Tek pencere kullanmamak bilinçli: 1 aylık momentum gürültülü, 6 aylık ağır kalıyor; harman ikisinden de pay alıyor.

import yfinance as yf
import pandas as pd
import numpy as np

sektorler = {
    "XBANK.IS": "Bankacılık",
    "XUSIN.IS": "Sınai",
    "XUTEK.IS": "Teknoloji",
    "XGIDA.IS": "Gıda",
    "XHOLD.IS": "Holding",
}

fiyat = yf.download(list(sektorler) + ["XU100.IS"],
                    start="2018-01-01", auto_adjust=True)["Close"].dropna()
aylik = fiyat.resample("ME").last()

# Göreceli seri: sektör / XU100
gorece = aylik[list(sektorler)].div(aylik["XU100.IS"], axis=0)

# Bileşik skor: 1, 3 ve 6 aylık göreceli getirilerin eşit ağırlıklı ortalaması
skor = (gorece.pct_change(1) + gorece.pct_change(3) + gorece.pct_change(6)) / 3

💡 Not: Sektör endekslerinde ağırlıklar birkaç büyük hissede yoğunlaşır; XBANK sinyali aslında büyük ölçüde 3-4 bankanın sinyalidir. Skoru yorumlarken bunu aklınızda tutun.

Adım 2: Rotasyon Kuralı

Her ay sonunda skorlar sıralanır, en güçlü iki sektör eşit ağırlıkla bir sonraki ay taşınır. İki sektör tutmak tek sektöre göre daha az heyecanlı ama çok daha yaşanabilir — tek sektör versiyonunun drawdown'ı bende uzun vadede taşınabilir çıkmadı.

TOP_N = 2

def secimler(skor, top_n=TOP_N):
    s = {}
    for tarih, satir in skor.dropna().iterrows():
        s[tarih] = list(satir.nlargest(top_n).index)
    return s

portfoy = secimler(skor)

# Örnek çıktı: son ayın seçimi
son = list(portfoy)[-1]
print(son.date(), "->", [sektorler[t] for t in portfoy[son]])

Adım 3: Backtest — XU100'e Karşı

Seçim ay sonunda yapılır, pozisyon bir sonraki ay taşınır; sektör değişimlerinde işlem maliyeti düşülür.

def rotasyon_backtest(aylik, portfoy, komisyon=0.002):
    getiri = aylik.pct_change()
    tarihler = sorted(portfoy)
    sonuc, onceki = [], set()
    for i, t in enumerate(tarihler[:-1]):
        gelecek = tarihler[i + 1]
        secim = portfoy[t]
        r = getiri.loc[gelecek, secim].mean()      # eşit ağırlık
        degisen = len(set(secim) - onceki)          # yeni giren sektör sayısı
        r -= komisyon * degisen / len(secim)
        sonuc.append((gelecek, r))
        onceki = set(secim)
    s = pd.Series(dict(sonuc))
    sharpe = s.mean() / s.std() * np.sqrt(12)
    egri = (1 + s).cumprod()
    dd = (egri / egri.cummax() - 1).min()
    return sharpe, dd, egri

sharpe, dd, egri = rotasyon_backtest(aylik, portfoy)
print(f"Sharpe: {sharpe:.2f}  MaxDD: {dd:.1%}")

💡 Not: Sektör endeksine doğrudan yatırım yapılamaz; uygulamada sinyal ya sektör fonuyla ya da sektörün 2-3 öncü hissesiyle taşınır — ikisinin de takip farkı vardır.

Backtest Sonuçları

2018–2026, aylık rotasyon, top-2 sektör, maliyet dahil:

Metrik Rotasyon XU100
Yıllık Sharpe 1.09 0.74
Max Drawdown %-27.3 %-33.6
Aylık Win Rate %59 %55
Yıllık Sektör Değişimi ~7

Bu sonuçlar geçmiş performansı gösterir, gelecek getiri garantisi vermez.

Fark bir yılda değil, döngü boyunca birikiyor. 2022'de sistemin beni aylarca sanayi ihracatçılarında tutması — hiç sevmediğim, "pahalı" bulduğum bir dönemde — kişisel görüşle sistem sinyali çatıştığında kime güveneceğimi netleştiren tecrübe oldu. Sistem haklıydı.

Sonuç

  • Sektör rotasyonu, hisse seçiminden önce cevaplanması gereken soruyu — "sermaye şu an nereye akıyor?" — kurala bağlar. Tek başına da çalışır ama asıl gücü, hisse taramanızı doğru havuzla sınırlamaktır.
  • Zayıf nokta dönüş noktaları: liderlik el değiştirirken skor eski kazananı bir-iki ay fazladan taşır. Keskin makro kırılmalarda (faiz döngüsü dönüşleri gibi) sistemin geç kalması yapısaldır, hatası değil.
  • Sinyalin uygulanabilirliğini es geçmeyin: sektörü hangi araçla taşıdığınız (fon mu, öncü hisseler mi) net getiriyi backtest kadar etkiler.

Bir sonraki adım: skora bir mutlak momentum filtresi ekleyip ("en güçlü sektör bile eksideyse nakitte kal") rotasyonu dual momentum ile birleştirmek — iki sistemin kesişimi ikisinden de sağlamdır.