Backtest nedir, nasıl yapılır? Sıfırdan doğru bir strateji testi
Backtest, bir strateji kuralının geçmiş veride nasıl davrandığını ölçmektir; doğru yapılması için kurallar önceden yazılır, veri temizlenir, komisyon ve kayma dahil edilir ve sonuç örneklem dışı veride tekrar test edilir. En sık hata, kuralı sonuca bakarak değiştirmektir. Yazı sıfırdan bir testi Python ile kurar ve sonuç tablosunun nasıl okunacağını gösterir.
Backtest nedir?
Backtest, kuralları kesin ve matematiksel olarak tanımlanmış bir trading stratejisinin geçmiş piyasa verileri üzerinde simüle edilerek nasıl bir performans sergilediğini ölçme yöntemidir. Temel mantık basittir: “Eğer bu kuralları geçmişte tavizsiz işletseydim, sistem nasıl bir risk profili çizerdi?” Bu süreç stratejinin gelecekte kesinlikle aynı sonuçları vereceğini garanti etmez; ancak mantıksal bir temeli olup olmadığını, piyasa sürtünmelerine dayanıp dayanamayacağını ve ne kadarlık bir sermaye erimesi (drawdown) riski taşıdığını anlamanın en nesnel yoludur.
Yazılımcılık refleksim bana her hipotezin test edilmesi gerektiğini söyler. Ne var ki finansal piyasalarda yapılan en yaygın hata, backtest sürecini bir “geleceği tahmin etme mucizesi” sanmaktır. Oysa kusurlu bir simülasyon, plansız işlem yapmaktan çok daha tehlikelidir; çünkü trader’a sahte bir matematiksel özgüven aşılar.
Doğru bir backtest kurgusu, parametreleri geçmişe uydurmak (curve-fitting) değil, kuralların dayanıklılığını ve istikrarını test etmektir. Bir strateji geçmiş veride hayatta kalamıyorsa canlı piyasada hiçbir şansı yoktur.
Doğru bir test için hangi sıra izlenir?
Geliştiricilerin düştüğü en büyük tuzak, veriyi önlerine açıp grafik üzerinde indikatör değerlerini değiştirerek geçmişe en uygun parametreyi aramaktır. Bu yaklaşım bilimsel değil, yanıltıcıdır. Doğru ve tarafsız bir backtest süreci şu katı sıralamayı izlemelidir:
- Hipotezin ve kuralların dondurulması: Teste başlamadan önce giriş, hedef ve geçersizlik kuralları yazılı olarak netleştirilir ve koda dökülür. Python ile Binance trading botu mimarisinde anlattığım gibi, sinyal mantığı yürütme kodundan tamamen bağımsız bir modül olarak tasarlanmalıdır.
- Veri setinin ikiye bölünmesi: Tarihsel veri en az iki bağımsız bloğa ayrılır:
- Örneklem İçi (In-Sample): Stratejinin test edildiği ve ilk parametre tutarlılığının ölçüldüğü dönem (örneğin ilk iki yıl).
- Örneklem Dışı (Out-of-Sample): Stratejinin daha önce hiç görmediği ve parametre ayarı bittikten sonra yalnızca bir kez doğrulama amacıyla çalıştırıldığı dönem (örneğin son altı ay).
- Piyasa sürtünmelerinin modele eklenmesi: Komisyon oranları, alış-satış spread farkları ve yürütme kayması (slippage) simülasyona dahil edilmeden hiçbir metrik hesaplanmaz.
- Sonuçların risk odaklı incelenmesi: Toplam sonuçtan ziyade en derin geri çekilme dönemi ve ardışık geçersizlik serileri analiz edilir.
Veri, komisyon ve kayma nasıl modellenir?
Backtest sonuçlarının canlı piyasayla örtüşmemesinin bir numaralı sebebi, sıfır maliyetli ve kusursuz bir emir akışı varsayımıdır. Canlı piyasada hiçbir işlem grafikte gördüğünüz ideal fiyat seviyesinden gerçekleşmez; her emir komisyon öder ve yüksek volatilite anlarında kaymaya (slippage) uğrar.
Gerçekçi bir modelleme için şu bileşenler simülasyona eklenmelidir:
- Borsa Komisyonu: Genellikle işlem hacmi üzerinden belirlenen borsa kesintisi (örneğin taker emirlerde on binde dört ila on binde yedi arasında bir oran) her giriş ve çıkışta bakiyeden düşülmelidir.
- Kayma (Slippage): Piyasa emri gönderildiğinde, emir defterindeki derinlik yetersizliği nedeniyle işlemin beklenen fiyattan daha kötü bir seviyede eşleşmesidir. Simülasyonda özellikle volatil mumlarda giriş ve çıkış fiyatlarına minimum bir oransal sapma payı eklenmelidir.
- Hayatta Kalma Yanlılığı (Survivorship Bias): Geçmiş veriyi seçerken yalnızca bugün var olan pariteleri değil, o dönemde işlem gören ancak sonradan delist edilmiş varlıkları da hesaba katmak gerekir.
Aşağıdaki sadeleştirilmiş Python örneği, komisyon ve kayma parametrelerini içeren temel bir döngü kurgusunu göstermektedir:
from dataclasses import dataclass
from typing import List, Dict, Any
@dataclass
class BacktestResult:
total_trades: int
targets_hit: int
invalidations_hit: int
max_drawdown_ratio: float
average_r_multiple: float
def run_backtest(
candles: List[Dict[str, Any]],
commission_rate: float = 0.0005,
slippage_rate: float = 0.0002,
) -> BacktestResult:
capital = 100.0 # Birim sermaye
peak_capital = capital
max_drawdown = 0.0
r_multiples = []
targets = 0
invalidations = 0
for i in range(20, len(candles) - 1):
current = candles[i]
next_candle = candles[i + 1]
# Örnek kural: Kapanış önceki en yükseği geçerse
if current["close"] > max(c["high"] for c in candles[i - 5 : i]):
entry = current["close"] * (1 + slippage_rate)
invalidation = min(c["low"] for c in candles[i - 5 : i]) * (1 - slippage_rate)
risk_distance = entry - invalidation
if risk_distance <= 0:
continue
target = entry + (risk_distance * 2.0)
# Giriş ve çıkış komisyonu, risk birimi (R) cinsinden
fee_r = (entry * commission_rate * 2) / risk_distance
# Sonraki mumda sonucun denetlenmesi
if next_candle["high"] >= target:
targets += 1
r_multiples.append(2.0 - fee_r)
capital += 2.0 - fee_r
elif next_candle["low"] <= invalidation:
invalidations += 1
r_multiples.append(-1.0 - fee_r)
capital -= 1.0 + fee_r
if capital > peak_capital:
peak_capital = capital
drawdown = (peak_capital - capital) / peak_capital
if drawdown > max_drawdown:
max_drawdown = drawdown
total_trades = targets + invalidations
avg_r = sum(r_multiples) / total_trades if total_trades > 0 else 0.0
return BacktestResult(
total_trades=total_trades,
targets_hit=targets,
invalidations_hit=invalidations,
max_drawdown_ratio=max_drawdown,
average_r_multiple=avg_r,
)
Aşırı uydurma nasıl anlaşılır?
Aşırı uydurma (overfitting ya da curve-fitting), bir modelin piyasadaki genel prensipleri öğrenmek yerine, geçmiş verideki tesadüfi fiyat gürültülerini ezberlemesi durumudur. Bir stratejinin onlarca farklı göstergeye ve çok sayıda karmaşık parametreye sahip olması durumunda aşırı uydurma riski zirveye çıkar.
Bir stratejide aşırı uydurma olduğunu ele veren temel işaretler şunlardır:
- Parametre kırılganlığı: Bir indikatör periyodu 20 iken harika sonuç veren strateji, periyot 21 veya 19 yapıldığında tamamen çöküyorsa kurallar piyasa dinamiğine değil, o verideki tesadüfi bir muma uydurulmuştur. Sağlam bir kural, parametre değişimlerine karşı geniş bir plato üzerinde kararlı davranır.
- Örneklem dışı uçurum: Örneklem içi dönemde kusursuz çalışan bir eğrinin, stratejinin daha önce görmediği örneklem dışı veride yatay veya aşağı yönlü bir seyre bürünmesi.
- Aşırı karmaşık filtreler: “Salı günleri hariç, RSI 34’ün altındayken ve hacim 1,3 katıyken” gibi yapay ve gerekçesiz kural yığınları.
ChatGPT ve Claude ile kripto analizi yazımda ele aldığım gibi, büyük dil modellerine strateji optimizasyonu yaptırırken en sık rastlanan hata da budur: Modeller geçmiş veriyi mükemmel gösterecek karmaşık kurallar uydurmakta ustadır ancak bu kuralların canlı piyasada karşılığı yoktur.
Sonuç tablosu nasıl okunur?
Bir backtest raporunu incelerken göz ardı edilmesi gereken ilk şey abartılı iddialardır. Profesyonel bir analizde odaklanılması gereken tek şey risk, tutarlılık ve sistemin dayanıklılık metrikleridir.
Aşağıdaki tablo, bir stratejinin örneklem içi ve örneklem dışı dönemlerde nasıl değerlendirilmesi gerektiğini varsayımsal bir sonuç dökümü üzerinden gösterir; sayılar gerçek bir testin çıktısı değil, okuma örneğidir:
| Değerlendirme Metriği | Örneklem İçi (In-Sample) | Örneklem Dışı (Out-of-Sample) | Sağlıklı Kabul Eşiği |
|---|---|---|---|
| Toplam Senaryo Sayısı | 420 | 180 | İstatistiki geçerlilik için en az 100 işlem |
| Hedefe Ulaşan / Geçersizlik Dağılımı | 1,40 katı | 1,25 katı | İki dönem arasında tutarlı dağılım |
| Ortalama R Çarpanı | 1,85 R | 1,70 R | Risk birimine göre en az 1,5 R beklentisi |
| Maksimum Geri Çekilme (Drawdown) | 0,14 oranında | 0,16 oranında | Sermayenin kabul edilebilir risk bandı |
| Ardışık Geçersizlik Serisi | 6 işlem | 7 işlem | Psikolojik dayanıklılık eşiği |
| Örneklem Tutarlılık Katsayısı | 1,00 (referans) | 0,88 | En az 0,75 tutarlılık oranı |
Bu tablodaki en kritik sütun, iki dönem arasındaki sapmadır. Eğer örneklem dışı veride ortalama R çarpanı veya geri çekilme oranı büyük bir sapma göstermiyorsa, stratejinin genel piyasa yapısına uyumlu olduğu kabul edilir. Trading risk yönetimi ilkelerine sadık kalındığında, ardışık yedi işlem geçersizlik görse bile hesap dimdik ayakta kalır.
Backtest bir garanti belgesi değil, geliştiricinin kendi varsayımlarıyla yüzleştiği bir laboratuvardır. Tıpkı bu sitede yer alan Analizler bölümünün şeffaf yöntem sayfasında olduğu gibi, her modelleme nesnel ve tarihli olarak kayıt altına alınmalıdır.
Kaynaklar
- Robert Pardo, “The Evaluation and Optimization of Trading Strategies”, John Wiley & Sons.
- Ernest P. Chan, “Quantitative Trading: How to Build Your Own Algorithmic Trading Business”, John Wiley & Sons.
- Backtrader Dokümantasyonu, “Backtrader Concepts and Architecture”: https://www.backtrader.com/ (erişim: 2026-09-28)
Anahtar çıkarımlar
- Kural, veriye bakmadan önce yazılır ve dondurulur.
- Komisyon ve kayma olmadan backtest sonucu anlamsızdır.
- Örneklem dışı test geçmeyen strateji canlıya çıkmaz.
Sık sorulan sorular
Backtest sonucu ne kadar güvenilir?
Kural önceden yazıldıysa, veri temiz ve maliyetler dahilse yön verir; kesinlik vermez. Aynı kuralın örneklem dışı veride ve farklı paritede benzer davranması güveni artırır. Tek dönemde parlak sonuç çoğu zaman aşırı uydurmadır.
Yasal uyarı
Bu sitede yer alan bilgi, yorum ve analizler yatırım danışmanlığı kapsamında değildir. Yatırım danışmanlığı hizmeti, yetkili kuruluşlar tarafından kişilerin risk ve getiri tercihleri dikkate alınarak kişiye özel sunulmaktadır. Burada yer alan içerik genel niteliktedir ve kişisel durumunuza uygun olmayabilir.
Analiz kayıtları, yayınlanmış bir senaryo analizini ve piyasanın o senaryoya verdiği yanıtı belgeler; hesap hareketi veya kişisel işlem beyanı değildir. Bir kayıt, analizin belirli bir tarihte yayınlandığını gösterir; geçmiş kayıtlar gelecekteki sonuçların göstergesi değildir. Kripto varlıklar yüksek fiyat oynaklığı taşır ve yatırılan tutarın tamamı kaybedilebilir.
Bu sitedeki hiçbir içerik alım, satım veya elde tutma çağrısı değildir. Yalnızca kendi araştırmanıza dayanarak ve gerekiyorsa yetkili bir danışmandan görüş alarak karar veriniz. Site sahibi, içeriğe dayanarak alınan kararlardan doğan sonuçlardan sorumlu değildir.
Yasal uyarının tamamı · metin sürümü 2026-09-28-v5
Hasan Çelik