Forex backtest için Python — yığın, araştırma döngüsü ve dürüst uyarılar
MT5'in Strateji Test Aracı (Strategy Tester), stratejiniz onun varsayımlarına sığdığı sürece işini görür — basit giriş kuralları, tek bir enstrüman, zahmetli veri bağlantıları yok. Daha kendine özgü bir şey denediğinizde araç dar gelmeye başlar; sistematik işlem yapanların yıllardır geriye dönük testlerini (backtesting) Python'da tutmasının nedeni de budur. Gerekçeler açık: kurallar üzerinde tam kontrol, bilimsel düzeyde kütüphaneler, tek bir betik içinde her veri kaynağı ve fikir ile sermaye eğrisi arasındaki sürenin dakikalara indiği bir döngü.
İşlemciler Strateji Test Aracı'nın ötesine neden geçer
Strateji Test Aracı, tek bir uzmanı tek bir paritede ve tek bir zaman diliminde optimize etmekte iyidir — ve orada durur. Aracı kurum dışı veri ekleyin, birkaç pariteyi tek bir sinyalde birleştirin ya da bir sermaye düşüşü (drawdown) dağılımının yanında Sharpe oranı hesaplayın; sonunda Excel'de CSV dosyalarını yan yana yapıştırmaya başlarsınız. Python bu işi tek bir betiğe indirir: aracı kurum kotasyonları `pandas`'a akar, makro veriler aynı `merge` ile birleşir ve risk metrikleri akademik kütüphanelerden gelir. Bu zanaatı otomatikleştirmenin arka planı uygulamalı işlem rehberlerimizde yer alıyor; aynı işin temel kavramlar bölümündeki giriş niteliğindeki açıklamaları da işinize yarayacaktır.
Pratik teknoloji yığını
Yığın kısadır. Veri işleme `pandas` ve `numpy`'da yaşar — ilki zaman serisine ve M1'den H1'e yeniden örneklemeye sahiptir, ikincisi göstergelerin altındaki vektörleştirilmiş aritmetiği taşır. Geriye dönük test motoru genellikle Daniel Rodriguez'in `backtrader`'ıdır; olay güdümlü bir Strategy ve Cerebro tarzında çalışır. Yüzlerce parametre kombinasyonunu onlarca saniyede taramanız gerektiğinde ise Oleg Polakov'un `vectorbt`'sini kullanırsınız. Grafikler statik raporlar için `matplotlib`'ten, etkileşimli inceleme için `plotly`'den gelir. Geçmiş veriler günlük kapanışlar için `yfinance`, kripto için `ccxt` ve aracı kurum kotasyonları için resmi `MetaTrader5` paketi üzerinden akar. Yığının tamamı ücretsiz ve açık kaynaktır.
Araştırma döngüsü — kuraldan doğrulamaya
Bir proje, ayrı tutulması en doğru olan dört adımdan geçer. Birincisi, giriş ve çıkış kurallarını sade bir dille yazın — "EMA-50 eğimi pozitifken ve kapanış yirmi günlük yüksek seviyenin üzerine yazdığında alırım" diyemiyorsanız, editörü açmanın anlamı yoktur. İkincisi, bu kuralları vektörleştirilmiş `pandas` ifadelerine çevirin: tüm bir sütun boyunca tek bir koşul, çubuk çubuk döngü yok — on yıllık H1 verisinin saniyeler içinde test edilmesinin nedeni budur. Üçüncüsü, motoru tüm geçmiş üzerinde komisyon, kayma (slippage), bir zarar durdur (stop loss) ve kâr al (take profit) ile çalıştırın; sermaye eğrisini ve işlem listesini okuyun. Dördüncüsü — yeni başlayanların sessizce atladığı yer — örneklem dışında doğrulayın: son iki yılı ayırın, yalnızca önceki pencerede optimize edin, kararı dokunulmamış veriden okuyun. Yuvarlanan pencere mekaniğine risk yönetimi bölümünden ulaşabilirsiniz.
Python'un kendi başına yapmayacağı şeyler
Yeni bir kullanıcı `backtrader` belgelerini okur ve kütüphanenin her şeyi hallettiğini varsayar. Etmez. Varsayılan motor aracı kurumunuzun makas/spread'i hakkında hiçbir şey bilmez, bir haber bülteninin etrafında kotasyonların beş pip kaydığından habersizdir ve bir ECN hesabının her iki tarafta da lot başına yedi dolar aldığını bilmez. Bunları kendiniz yazarsınız — `commission`, `slippage_perc`, saate göre değişen özel bir spread modeli. İkinci sessiz tuzak veri kalitesidir: ücretsiz `yfinance` serileri hafta sonu boşlukları taşır ve Dukascopy tik verisi egzotik paritelerde eksik olabilir. Üçüncü günah pürüzsüz eğri sevgisidir: beş optimize edilmiş parametreli, örneklem içi bir geriye dönük test, siz bir değişkeni çıkarıp optimize edicinin hiç dokunmadığı veride eğriyi izleyene kadar neredeyse her zaman yıllık yüzde 200 reklamı yapar. Gerçekçi bir test, tipik olarak naif sürümün vaat ettiğinden yüzde 30 ila 50 daha az gösterir.
Açıklayıcı bir örnek — varsayımsal bir EUR/USD projesi
M15 çubukları kullanan, Londra açılışına dayalı bir EUR/USD stratejisi düşünün: fiyat saat 12:00'den (Türkiye saati / TSİ) sonra beş çubuklu yüksek seviyenin üzerine yazdığında EUR/USD alış / uzun pozisyon açın, alt seviyenin kırılmasında EUR/USD satış / kısa pozisyon açın; zarar durdur yirmi periyotluk ATR'nin 1,5 katında, kâr al ise zararın iki katında. 2018'den 2024'e kadar verileri `MetaTrader5` paketiyle çekersiniz, `pandas`'a yükler ve M15'e yeniden örneklersiniz. Lot başına altı dolar komisyon, haber pencereleri dışında sabit 0.8 pip spread ve bir pip rastgeleleştirilmiş giriş kayması ile yapılan geriye dönük test, yüzde 51 isabet oranı, 1.28 kâr faktörü, yüzde 14 maksimum sermaye düşüşü ve 0.9 Sharpe değeri döndürür. Geçmişi dört yıl örneklem içi ve iki yıl örneklem dışı olarak böldüğünüzde, örneklem dışı ortalama yaklaşık üçte bir düşer — devreye alma kararını makul bir zemine bırakır, göz kamaştıran bir şey değil. Yukarıdaki her sayı açıklayıcıdır; cevabın bir vaadini değil, biçimini gösterir.
"Python, finans sektörü için güçlü bir programlama dili ve ekosistem haline geldi — finansal verileri analiz etmekten algoritmik işleme ve risk yönetimine kadar her şey için." — Yves Hilpisch, Python for Finance: Mastering Data-Driven Finance, O'Reilly, 2018
Her rapora eşlik etmesi gereken dürüst uyarılar
Geriye dönük test kapandığında, kısa bir uyarı kutusu ekleyin. Birincisi: hangi spread'i varsaydığınız ve makro açıklamaları çevresinde onu genişletip genişletmediğiniz — NFP sırasında sabit 0.8 ile gerçekçi 2.5 pip arasındaki fark çoğu zaman edge'in tamamıdır. İkincisi: verinin ileriye bakma (look-ahead) önyargısından arınmış olup olmadığı, yani gerçek zamanda henüz bilmeyeceğiniz bir cari çubuk kapanışından bir gösterge hesaplayıp hesaplamadığınız. Üçüncüsü: aynı anda kaç parametre optimize ettiğiniz — beş, yuvarlanan pencerenin bile sizi korumayı bıraktığı eşiktir. Dördüncüsü: sonucun örneklem dışında mı hayatta kaldığı yoksa yalnızca tüm geçmişte mi. Bu dört cümle olmadan bir rapor denetim değil, pazarlamadır. ForexMechanics'teki işlemci atölyesi daha geniş araştırma rutinini ele alıyor.
Nereden başlamalı
- Python 3.11 veya daha yenisini `pandas`, `numpy`, `backtrader`, `matplotlib` ve resmi `MetaTrader5` paketiyle birlikte kurun — tek bir `pip install` tüm yığını getirir — ardından gerçekte işlem yaptığınız parite için iki yıllık H1 verisini indirip CSV olarak kaydedin, böylece sonraki tekrarlar kararlı bir yerel kaynaktan çalışır.
- Strateji kurallarını önce sade bir dille yazın — giriş, çıkış, zarar durdur ve kâr al için birer cümle — ve ancak ondan sonra bunları vektörleştirilmiş `pandas` ifadelerine çevirin; tüm testin çubuk çubuk döngü olmadan otuz satıra sığmasını hedefleyin ve bu aşamada parametre optimize etme dürtüsüne direnin.
- Geriye dönük testi gerçek komisyon, sabit bir spread ve bir pip rastgeleleştirilmiş kayma ile çalıştırın, ardından maliyetsiz bir sürümle karşılaştırın; aradaki fark, varsayılan edge'in ne kadarının orta fiyattan işlem yapmanın bir yan ürünü olduğunu söyler — maliyetler brüt kârın yarısından fazlasını yiyorsa, strateji canlı işlem için fazla incedir.
- Geçmişi dört yıl örneklem içi ve bir yıl örneklem dışı olarak bölün, örneklem içi pencerede en fazla iki parametre optimize edin, kazanan seti dondurun ve örneklem dışı testi bir kez çalıştırın; isabet oranı üçte birden fazla düşerse, daha iyi bir optimizasyon aramak yerine mantığı basitleştirin.
- Sade bir defter tutun — aynı depo içinde bir Markdown dosyası — ve her geriye dönük testten sonra dört cümle yazın: hangi spread'i kullandığınız, göstergelerin ileriye bakmaktan kaçınıp kaçınmadığı, kaç parametre ayarladığınız ve örneklem dışı sermayenin örneklem içinin yarısının üzerinde kalıp kalmadığı; bu günlük olmadan üç ay içinde hangi raporun dürüst olduğunu unutursunuz.
Kaynaklar ve bibliyografya
-
Backtrader Backtrader documentation — Introduction · oficjalna dokumentacja open-source'owej biblioteki Daniela Rodrigueza: model event-driven, klasy Strategy i Cerebro, integracja danych www.backtrader.com ↗
-
vectorbt vectorbt usage documentation · oficjalny przewodnik po wektorowym backtestowaniu w numpy/pandas — przykłady i sweep parametrów vectorbt.dev ↗
-
O'Reilly Media Yves Hilpisch — Python for Finance, 2nd Edition (2018) · kanoniczna pozycja o zastosowaniach Pythona w analityce finansowej, algorytmice i zarządzaniu ryzykiem www.oreilly.com ↗
-
MQL5 MetaTrader 5 Python Integration — official reference · oficjalne API pakietu MetaTrader5: pobieranie historycznych OHLC i tików, dostęp do konta i składanie zleceń z Pythona www.mql5.com ↗
-
pandas pandas — Time series / date functionality · referencja czasu w pandas: konwersje, resampling, indeksowanie i przesunięcia używane w każdym backteście pandas.pydata.org ↗
Sık sorulan sorular
Başlamak için ileri düzey Python bilgisine ihtiyacım var mı?
Temel Python yeterlidir — döngüler, listeler, fonksiyonlar, kütüphane içe aktarma ve bir CSV okuma. Geri kalan her şey pandas'tır ve onu yol boyunca öğrenirsiniz, çünkü her geriye dönük test projesi aynı birkaç işlemi kullanır: veriyi yükle, yeniden örnekle, bir gösterge hesapla, bir giriş koşulu tanımla, sonuçları topla. İlk strateji genellikle otuz satır koda sığar, dolayısıyla "Python'a tam hâkim olana" kadar beklemenin anlamı yoktur. Daha sağlıklı ritim iki ipi paralel tutmaktır: kısa bir temel kursu (günde bir saatten dört ila altı hafta) ve üzerinde pratik yaptığınız gerçek proje. Formüllerle bir Excel sayfası yazabiliyor ve bir fonksiyonun ne olduğunu anlıyorsanız, gereken asgariye sahipsiniz — pandas hesap tablosunu neredeyse tamamen değiştirir, daha hızlı çalışır ve işi düzgün biçimde örneklem dışında doğrulamanıza imkân verir.
Neden vectorbt yerine backtrader seçmeli — ya da tam tersi?
İki kütüphane farklı felsefeler izler. Backtrader olay güdümlüdür (event-driven): motor çubuk çubuk ilerler, Strategy sınıfınızdaki next() metodunu çağırır ve canlı işlemin gerçek akışını yansıtır — bu yüzden pozisyon yönetimi, takip eden zarar durdur (trailing stop) ya da kısmi çıkışlar eklemek doğrudandır. Bedeli hızdır: tek bir paritede on yıllık M5 verisi birkaç dakika sürebilir. Vectorbt ters yolu tutar — tüm stratejiyi pandas sütunları üzerinde vektörleştirilmiş işlemler olarak ifade edersiniz, motor her şeyi numpy aracılığıyla paralel hesaplar ve yüz parametrelik bir tarama onlarca saniyede biter. Bedeli ifade aralığıdır: portföy durumuna bağlı karmaşık giriş mantığını kodlamak daha zordur. Uygulamada işlemciler her ikisini de elinde tutar — hızlı keşif ve parametre taramaları için vectorbt, en iyi adayın gerçekçi bir komisyon ve kayma modeliyle nihai doğrulaması için backtrader.
Güvenilir geçmiş veriyi nereden alırım?
Üç kaynak, mantık sırasına göre. Birincisi, resmi MetaTrader5 paketi — geçmişi doğrudan kendi aracı kurumunuzdan alırsınız, böylece geriye dönük testteki spread, gecelik taşıma maliyeti (swap) ve komisyon, daha sonra canlı hesapta göreceğinizle eşleşir. Devreye almayı düşündüğünüz herhangi bir strateji için en dürüst seçenek budur. İkincisi, Dukascopy başlıca pariteler için tik ve M1 verisini 2003'e kadar yayımlar — kurumsal kalite, ama spread'ler kendi aracı kurumunuzdan değil Dukascopy platformundan gelir. Üçüncüsü, günlük kapanışlar için yfinance ve kripto piyasaları için ccxt — her ikisi de prototip için uygundur, ama hafta sonu boşlukları ve ara sıra eksik dakikalar onları gün içi stratejileri doğrulamak için elemektedir. Kaynağı her seferinde betiğin başlığında belgeleyin, ki altı ay sonra raporun neye dayandığını hâlâ bilesiniz — masaya bir denetim düştüğünde işi kurtaran küçük bir ayrıntı.
Bir geriye dönük testin gerçek olamayacak kadar iyi olduğunu nasıl anlarım?
Dört sinyal yeterlidir. Birincisi, iki yüzden fazla işlemde yüzde 75'in üzerinde isabet oranı — çok dar piyasalarda yapılan skalping dışında pratik olarak ulaşılamaz, dolayısıyla sonuç ileriye bakma (look-ahead) önyargısına ya da bir veri hatasına işaret eder. İkincisi, anlamlı geri çekilmeler olmadan bir sermaye eğrisi — gerçek stratejiler çift haneli sermaye düşüşleri (drawdown) verir, bu yüzden tertemiz yukarı doğru bir düz çizgi eğriye aşırı uyum (curve-fit) uyarısıdır. Üçüncüsü, 3.5'in üzerinde bir kâr faktörü — yalnızca ECN spread'inin bile edge'in çift haneli yüzdesini yediği Forex'te son derece nadirdir. Dördüncüsü, parametrelere keskin duyarlılık — bir hareketli ortalamanın periyodunu 14'ten 12'ye taşımak sonucu çökertiyorsa, strateji yapıyı değil gürültüyü öğrenmiştir. Dört sinyalden herhangi ikisi aynı anda yandığında, manşet metrikleri ne olursa olsun rapor şüphelidir; mantığı basitleştirin, bir iki parametre çıkarın ve testi örneklem dışında yeniden çalıştırın.