Kendi ticaret stratejinizi oluşturmak, kumar oynamakla sistematik bir iş yürütmek arasındaki köprüdür. Geçmiş verileri kullanmak (backtesting), gerçek sermayenizi bir algoritmaya emanet etmeden önce tüm olası hataları kağıt üzerinde yapmanıza olanak tanır.
Bu yazıda, bir fikir bulmaktan modern bir teknoloji yığını kullanarak bu fikrin sağlamlığını test etmeye kadar olan süreci adım adım inceleyeceğiz.
1. Temel: Fikirden Algoritmaya
Her strateji bir hipotez ile başlar. Bu, piyasa davranışı hakkında net bir ifadedir. Örneğin: "Bir varlığın fiyatı, anormal bir hacimle bir saat içinde %5 düşerse, kısa vadeli bir tepki yükselişi olasılığı yüksektir."
Başlangıç için strateji türleri:
- Mean Reversion (Ortalamaya Dönüş): Fiyatın ortalama değerinden çok fazla saptığı anları bulmak.
- Trend Following (Trend Takibi): Hareket yönü onaylandığında işleme girmek (hareketli ortalamalar veya seviye kırılımları kullanarak).
- Arbitraj: Aynı varlığın farklı platformlardaki fiyat farklarından yararlanmak.
- İstatistiksel Arbitraj: Farklı varlıklar arasındaki korelasyonları aramak.
2. Geçmiş Verilerin Toplanması
Testin kalitesi doğrudan verinin kalitesine bağlıdır.
"Çöp girerse çöp çıkar" (Garbage in, garbage out).
Veriler nereden alınır?
- Borsa API'leri: Binance, Coinbase veya Bybit geçmiş mum verilerine (OHLCV) erişim sağlar.
- Uzmanlaşmış Servisler: Yahoo Finance (hisseler), CoinMetrics (kripto), Glassnode (on-chain veriler).
- Hazır Veri Setleri: Kaggle veya GitHub'daki özel repolar.
Tablo: Veri Türleri ve Kullanım Alanları
| Veri Türü | Açıklama | Kullanım Amacı |
|---|---|---|
| OHLCV | Açılış, Yüksek, Düşük, Kapanış, Hacim | Klasik teknik analiz, orta vadeli stratejiler. |
| Orderbook (L2) | Emir defteri, limit emirler | Scalping, HFT, likidite analizi. |
| Tick Data | Her bir bireysel işlem | Süper hassas backtest, arbitraj. |
| Alternative Data | Sosyal medya, haberler, raporlar | Duyarlılık analizi, temel yaklaşım. |
3. Test Araçları
Yeni başlayanlar için görsel platformlar, profesyoneller için ise programlama dilleri uygundur.
- TradingView (Pine Script): Bir fikri görselleştirmenin en hızlı yolu. Yerleşik strateji test cihazı, karlılığı doğrudan grafik üzerinde gösterir.
- Python (Kütüphaneler):
- Pandas: Veri manipülasyonu için.
- Backtrader veya VectorBT: Backtest için güçlü motorlar.
- ccxt: Kripto borsalarına bağlanmak için.
Basit Bir Python Kodu Örneği (VectorBT)
Bu kod, iki hareketli ortalamanın kesişimini kontrol eder:
import vectorbt as vbt
import pandas as pd
# Verileri indiriyoruz
data = vbt.YFData.download('BTC-USD', start='2023-01-01')
close = data.get('Close')
# Stratejiyi tanımlıyoruz: Hızlı MA (10) yavaş olanı (50) yukarı keserse
fast_ma = vbt.MA.run(close, 10)
slow_ma = vbt.MA.run(close, 50)
entries = fast_ma.ma_crossed_above(slow_ma)
exits = fast_ma.ma_crossed_below(slow_ma)
# Backtest'i çalıştırıyoruz
pf = vbt.Portfolio.from_signals(close, entries, exits, init_cash=1000)
print(pf.total_return())4. Verimlilik Metrikleri
Sadece "Toplam Kar"a bakmayın. Büyük karlar, tüm bakiyeyi kaybetme riskiyle birlikte gelebilir.
- Drawdown (Düşüş): Bakiyenin zirveden yerel dip noktasına kadar yaşadığı maksimum kayıp. Eğer düşüş %50 ise, başlangıç noktasına dönmek için %100 kar etmeniz gerekir.
- Sharpe Ratio (Sharpe Oranı): Elde edilen getirinin, alınan riske değip değmediğini gösterir. 1.0 üzerindeki değerler iyi kabul edilir.
- Win Rate (Kazanma Oranı): Karlı işlemlerin yüzdesi. Önemli: %30 kazanma oranına sahip bir strateji, eğer karı zararından kat kat fazlaysa (Risk/Reward) son derece karlı olabilir.
- Profit Factor: Brüt karın brüt zarara oranı.
5. Gizli Tuzaklar (Az Bilinen Detaylar)
Yeni başlayanların çoğu, başarılı testlerden sonra gerçek parayla işlem yaparken burada "çakılır".
Look-ahead Bias (Geleceğe Bakma Hatası)
Algoritmanız yanlışlıkla gelecekteki verileri kullanır. Örneğin, günün ortalama fiyatını hesaplayıp sabah saatlerinde bu fiyata göre alım kararı vermek. Gerçek hayatta sabahleyin akşam fiyatının ne olacağını bilemezsiniz.
Survivorship Bias (Hayatta Kalma Yanlılığı)
Stratejiyi sadece şu an zirvede olan coin veya hisselerde test etmek. İflas eden ve borsalardan silinen yüzlerce projeyi unutuyorsunuz. Test, o dönemde var olan tüm varlık yelpazesi üzerinde yapılmalıdır.
Kayma ve Komisyonlar (Slippage)
Teoride 100 dolardan aldınız. Ancak gerçek piyasada likidite eksikliği nedeniyle emriniz 100.5 dolardan gerçekleşti ve borsa %0.1 komisyon aldı. 1000 işlem yapıldığında bu durum, karlı bir stratejiyi zarara dönüştürür.
6. Gelişmiş Test Yöntemleri: Dayanıklılık Testi
İlk backtest "yakışıklı" bir getiri grafiği sunduktan sonra, stratejiyi stres testlerine sokmak gerekir. Piyasa bir bukalemun gibi sürekli değiştiği için geçmiş veriler üzerinde basit bir tur atmak asla yeterli değildir.
Walk-Forward Analizi (WFA)
Bu, "kayan" bir test yöntemidir. Verilerinizi belirli bloklara ayırırsınız:
- In-Sample (Eğitim): Strateji parametrelerini optimize edersiniz (örneğin, en uygun MA uzunluğunu seçersiniz).
- Out-of-Sample (Test): Bu parametreleri, algoritmanın henüz "görmediği" bir sonraki veri kesitinde test edersiniz.
Ardından pencereyi ileri kaydırırsınız. Eğer strateji tüm bu "görünmez" bölümlerde istikrarlı bir sonuç veriyorsa, gerçekten yaşama şansı var demektir.
Monte Carlo Simülasyonu
İşlemlerinizin sırasını binlerce kez rastgele bir şekilde karıştırırsınız.
- Amaç: Arka arkaya gelen zarar serilerinin (Drawdown) kasanızı sıfırlama ihtimalini öğrenmektir.
Eğer 10.000 simülasyondan 500'ünde iflas gerçekleşiyorsa, ortalama getirisi çok yüksek olsa bile bu strateji aşırı riskli kabul edilir ve saatli bir bombadır.
7. Optimizasyon ve "Aşırı Öğrenme" (Overfitting)
Bir araştırmacı için en tehlikeli tuzak Overfitting yani aşırı uyumdur. Bu, parametreleri o kadar mükemmel seçtiğiniz bir durumdur ki; algoritma geçmişi adeta "ezberler" ama yeni veriler karşısında çuvallar.
Aşırı uyumdan nasıl kaçınılur:
- Az parametre çok huzur: Kodda ne kadar çok indikatör ve "eğer/ise" kuralı varsa, piyasa gürültüsüne (noise) takılma riskiniz o kadar artar.
- Parametre Kararlılığı: Eğer strateji indikatör periyodu 20 iken harika çalışıyor ama 19 veya 21 olduğunda aniden zarar ediyorsa, o strateji kağıttan bir kaplandır. Ayarlar değiştikçe sonuçlar yumuşak bir şekilde değişmelidir.
- Mantıksal Dayanak: Her parametrenin ekonomik bir sebebi olmalıdır. "Çünkü geçmişte en çok parayı bu getirdi" demek, hüsrana davetiye çıkarmaktır.
8. Az Bilinen Konseptler: Backtesting'de MEV ve JIT Likiditesi
DeFi segmentinde (Uniswap v3/v4) çalışıyorsanız, blokzincirin kendine has yapısı nedeniyle standart backtest yöntemleri size yalan söyleyebilir.
- LVR (Loss Versus Rebalancing): Likidite sağlayıcıları için modern bir metrik. Komisyon gelirini, arbitrajcıların sizin likiditenizi kendi lehlerine (sizin aleyhinize) fiyatlardan çekip alması sonucu oluşan zararla karşılaştırır.
- JIT (Just-In-Time) Likiditesi: Büyük bir işlemden tam bir saniye önce havuza likidite eklenip işlem biter bitmez geri çekildiği bir stratejidir. Standart mum verilerinde (OHLCV) bunu yakalamak imkansızdır; olay bazlı verilere (Event-driven data) ihtiyacınız olur.
9. Pratik Kontrol Listesi: Koddan Borsaya Giden Yol
| Aşama | Eylem | Araç |
|---|---|---|
| 1. Hipotez | Giriş/çıkış koşullarının ve stop-loss mantığının tanımı. | Not Defteri / Obsidian |
| 2. Veri Toplama | Geçmiş mum veya tik verilerinin çekilmesi. | API (Binance/CCXT), Python |
| 3. Backtest | Stratejinin geçmiş veriler üzerinde ilk turu. | Backtrader, Pine Script |
| 4. Optimizasyon | Komisyon (0.1%+) ve kayma (slippage) hesabı. | Kod Parametreleri |
| 5. Doğrulama | Walk-Forward ve Monte Carlo testleri. | Python (scipy, numpy) |
| 6. Paper Trading | Gerçek zamanlı sanal hesap üzerinden ticaret. | TradingView / Demo Hesap |
| 7. Ölçeklendirme | Küçük bir gerçek sermaye ile canlıya geçiş. | API Anahtarları (Read/Write) |
10. Kod Örneği: Komisyon ve Kayma Hesabı
Profesyonel testlerde stratejiyi "cezalandırmak" hayati önem taşır. İşte mantığın şematik görünümü:
# İşlem maliyeti mantığı yalancı kodu
commission = 0.001 # İşlem başına %0.1
slippage = 0.0005 # %0.05 fiyat kayması
def execute_trade(price, size, side):
if side == 'buy':
effective_price = price * (1 + slippage)
cost = size * effective_price * (1 + commission)
elif side == 'sell':
effective_price = price * (1 - slippage)
revenue = size * effective_price * (1 - commission)
return effective_price, cost_or_revenue
Altın Kural: Eğer gerçekçi komisyonlar ve fiyat kaymaları eklendikten sonra stratejiniz kârlı halden zarara dönüyorsa, onu "kurcalayıp" kurtarmaya çalışmayın. Yeni bir fikir arayın. Piyasa, maliyetleri görmezden gelenleri asla affetmez.