İşlem Botu Backtestinde Geleceği Görme Hatası Nasıl Anlaşılır?
İşlem botu backtestinde gelecekteki verinin yanlışlıkla kullanıldığını mum zamanları, üst zaman dilimleri, Python özellikleri ve emir gerçekleşmeleri üzerinden nasıl denetleyeceğinizi öğrenin.
Geleceği görme hatası, backtestin bir işlemi geçmişte simüle ederken karar anında henüz mevcut olmayan bilgiyi kullanmasıdır. Bunu bulmak için her verinin ne zaman erişilebilir olduğunu, sinyalin ne zaman hesaplandığını ve emrin en erken ne zaman gerçekleşebileceğini yazın. Ardından mum indekslerini, üst zaman dilimi verilerini, özellik üretimini, model eğitimini ve emir simülasyonunu inceleyin. Kod düzgün görünse bile yarının etiketi, henüz kapanmamış mum veya artık elde edilemeyen fiyat sonucu bozabilir.
ÖNCE BUNLARI KONTROL EDİN
- Mumun zaman damgası ile son değerinin bilindiği zamanı ayırın.
- Kapanmış mumu kullanan bir sinyal, normal kapanış kararı modelinde aynı mumun başlangıcından işlem açamaz.
- Üst zaman dilimleri, merkezlenmiş hareketli pencereler ve geleceğe kaydırılmış özellikler sık hata kaynaklarıdır.
- Ölçekleyicileri ve özellik seçimini her kronolojik ayrımda yalnızca eğitim verisine uygulayarak öğrenin.
- Sızıntıyı gidermek kârlılığı kanıtlamaz; maliyet ve aşırı uyum ayrıca sınanmalıdır.
Bilginin zaman çizelgesini çıkarın
Her işlem için dört anı kaydedin: verinin yayımlanması, botun veriye erişebilmesi, karar anı ve emrin en erken gerçekleşebileceği an. Mumun zaman damgası çoğu zaman açılışını gösterir; son yüksek, düşük ve kapanış değerlerinin ne zaman bilindiğini göstermez. Borsa verisi, piyasa takvimi ve seans sınırları gerçek erişim saatini değiştirebilir.
10:00 ile 10:05 arasındaki beş dakikalık mumu düşünün. Son kapanış fiyatına dayanan kural, bu fiyatı 10:00'da bilemez. Backtest, mumun daha sonra eşik üzerinde kapandığını görüp 10:00 açılışından alım yazıyorsa geleceği kullanmıştır. 10:05 kapanışından gerçekleşme de kullanılan simülatörün bu zamanlamayı desteklemesine bağlıdır; varsayılan kapanışta hesaplanan piyasa emri çoğu zaman sonraki uygun fiyat adımında, genellikle bir sonraki mumun açılışında gerçekleşir.
Bu saat örneği varsayımsaldır; TensorParadigm'ın gerçekleşmiş işlemi veya performans verisi değildir.
Denetim gerektiren belirtiler
Neredeyse kusursuz dönüş noktaları, fazlasıyla düzgün bir getiri eğrisi veya sinyali bir mum geciktirince çöken sonuç denetim gerektirir. Tek başına hiçbiri sızıntıyı kanıtlamaz. Geçerli hızlı stratejiler de gecikmeden etkilenebilir; sızıntılı strateji ise para kaybedebilir.
- Kural kapanışı gerektirirken işlem aynı mumun yüksek veya düşük fiyatında görünür.
- Saatlik göstergenin son değeri, önceki beş dakikalık mumlarda değişmez bir tarihsel değer gibi kullanılır.
- Özellik ile gelecekteki getiri veya etiket arasında beklenmedik derecede güçlü ilişki vardır.
- Ön işleme yalnızca eğitim verisinde öğrenildiğinde test sonucu köklü biçimde değişir.
- Simüle edilmiş gerçekleşme, ilgili fiyat veya veri piyasaya çıkmadan önce kaydedilir.
Pine Script üst zaman dilimi çağrılarını inceleyin
TradingView belgelerine göre request.security() ile üst zaman diliminden veri alınırken, barmerge.lookahead_on seçeneği ve kaydırılmamış ifade birlikte kullanılırsa tarihsel mumlarda üst zaman diliminin son değeri erkenden gösterilebilir. Örneğin saatin son kapanışını o saatin ilk beş dakikalık mumuna aktarmak, kuralın saat dolmadan son değeri bilmesi demektir.
Yalnızca önceki tamamlanmış üst zaman dilimi mumunu kullanmak isteyen bir stratejide TradingView, istenen ifadeyi üst zaman diliminde bir mum geriye kaydırıp lookahead_on kullanmayı belgeler. Bu, söz konusu kullanımda tarihsel ve canlı erişimi hizalar. Aynı kalıbı alt zaman dilimi isteklerine veya gelişen mumları bilerek kullanan kurallara düşünmeden taşımayın.
Her request.security() çağrısında ifade, zaman dilimi, lookahead ayarı ve kararın kullandığı mum indeksini kontrol edin. Grafik zaman diliminde onaylanmış mum kullanılıp kullanılmadığını da inceleyin. Girdiyi düzeltmek, fazla erken fiyat veren gerçekleşme modelini kendiliğinden düzeltmez.
Python özelliklerini modelden önce denetleyin
Merkezlenmiş hareketli ortalama, mevcut zamanın hem öncesinden hem sonrasından değer alır. Özellik sütununda geleceğe bakan shift işlemi yarının değerini bugünün satırına taşıyabilir. Bunlar daha sonra tahmini değerlendiren hedef etikette anlamlı olabilir; canlı karar sırasında erişilebilir özelliklerde kullanılamaz.
decision_time, her özelliğin source_time ve available_time alanları, target_window_end, signal_time ve earliest_fill_time sütunlarını içeren küçük bir tablo oluşturun. Her özellik için available_time değerinin signal_time değerinden geç olmadığını doğrulayın. Bir sonraki mumun getirisi gibi etiketleri model girdisinden, birleşik meta veriden ve cevabı dolaylı biçimde ele veren ön işlemeden uzak tutun.
Olay verisinde gerçek yayımlanma veya sisteme alınma zamanını kullanın. Fonlama oranı, sonradan revize edilen makro veri veya haber, işaretlendiği piyasa saatinden daha geç erişilebilir olabilir. Böyle girdiler işlem kararını etkiliyorsa o anda bilinen veri sürümü gerekir.
Zamana göre ayırın, ön işlemeyi her eğitim diliminde öğrenin
Rastgele eğitim ve test ayrımı, modelin daha sonraki piyasa dönemlerinde öğrenip önceki dönemde sınanmasına yol açabilir. scikit-learn TimeSeriesSplit kronolojik sırayı korur ve eğitim ile test arasında boşluk seçeneği sunar. Boşluğun büyüklüğünü etiketin vadesi ve çakışan gözlem pencerelerine göre seçin; herkes için geçerli sabit bir sayı yoktur.
Ölçekleme, eksik veri tamamlama, özellik seçimi ve hiperparametre seçimini her ayrımda yalnızca eğitim verisine dayanarak yapın. scikit-learn Pipeline dönüşümleri çapraz doğrulamanın içine almaya yardımcı olur. Tüm örneklemde öğrenilen etiketsiz bir ölçekleyici bile gelecekteki test döneminin özelliklerini öğrenir. Geliştirme boyunca dokunulmamış son bir dönem kararlarınızı değerlendirmeye yardımcı olur.
Testi gördükten sonra stratejiyi defalarca değiştirmek, herhangi bir özelliğe doğrudan gelecek sızmasa da seçim yanlılığı veya aşırı uyum yaratır. Denemeleri kaydedin ve bunu doğrudan geleceği görme hatasından ayırın.
Sinyal ile emir gerçekleşmesini karşılaştırın
Sinyal zamanı ve gerçekleşme zamanı ayrı olaylardır. TradingView emir simülatörü normalde bir hesaplama adımında emir oluşturur ve ancak sonraki uygun fiyat adımında gerçekleştirebilir. process_orders_on_close seçeneği kapanış adımında gerçekleşmeyi deneyebilir. Mum içi ayarlar ve emir türleri de modeli değiştirdiğinden bir mumluk farkı hata ilan etmeden gerçek strateji ayarlarını okuyun.
Şüpheli işlemlerde gösterge değerlerini, kapanış onayını, emir oluşturma zamanını, emir türünü ve raporlanan gerçekleşme saatini ve fiyatını dışa aktarın veya kaydedin. Karardan sonra o fiyatın erişilebilir olup olmadığını sorun. Alış satış farkı, komisyon ve kayma varsayımlarını ayrıca ekleyin: sızıntıyı düzeltmezler ama temizlenmiş testin ekonomik anlamını değiştirirler.
Üç yanlışlama kontrolü uygulayın
İlk olarak tüm sinyalleri tamamlanmış bir grafik mumu geciktirin ve sonuç farkını ölçün. Bu otomatik bir düzeltme değil, tanı aracıdır; meşru hızlı sinyal de gecikmeyle zayıflar. İkinci olarak göstergeleri zaman sırasıyla mum mum yeniden hesaplayıp her karar anında tüm geçmiş üzerinden hesaplanan değerlerle karşılaştırın. Üçüncü olarak her eğitim ayrımını bağımsız kurun, daha sonraki dönemi görmeden önce stratejiyi sabitleyin ve tekrar sınayın.
Fark varsa yalnızca toplam kârı karşılaştırmayın, ilk uyuşmayan işlemin izini sürün. O anda bulunamayacak veri alanını veya gerçekleşme fiyatını bulun. Düzeltmeden sonra uygulama maliyetleri ve makul parametre değişiklikleriyle testi yenileyin. Sonucun ayakta kalması daha iyi kanıttır; canlı performans garantisi değildir.
Şüpheli bir işlemin somut denetimi
Botun, beş dakikalık mum önceki tepenin üzerinde kapandı diye 10:00 açılışından alım yaptığını varsayın. Önerilen gerçekleşmeyi 10:00, son kapanışın en erken bilindiği anı 10:05 olarak yazın; gerçek karar ve emir anlarını da ekleyin. Koşul, önerilen gerçekleşmeden sonraki bilgiye bağlı olduğundan bu kural altındaki kayıt geçersizdir.
Kod 10:05'te karar verecek biçimde düzeltilince emir motorunun sonra ne yaptığını inceleyin. Sonraki fiyat adımında piyasa emri, takip eden mumun açılışına yakın gerçekleşebilir; kapanış adımında gerçekleştirme ayrı bir varsayımdır ve piyasaya gecikmeli ulaşan canlı uyarıyla örtüşmeyebilir. Sadece sinyal zamanını değiştirip eski alım fiyatını korumayın.
Aynı işlemin saatlik filtresine de bakın. Saat bitmeden son saat kapanışını okuyorsa gerçekleşme anı düzeltilse bile beş dakikalık giriş kirlenmiştir. Hem veriye erişim hem gerçekleşme sınamayı geçmelidir.
Temiz backtest neyi gösterir?
Gelecekteki veriyi çıkarmak güvenilir bir test için temel koşulu sağlar. Stratejinin piyasa rejimi değişikliği, kesinti, genişleyen alış satış farkı, fonlama ödemesi, yetersiz likidite veya risk sınırları altında dayanacağını kanıtlamaz. Geçerli backtest de kötü bir stratejiye ait olabilir.
Test yeniden üretilebilsin diye veri sürümünü, strateji kodunu, maliyetleri, parametre seçimlerini ve eğitim sınırlarını saklayın. Hata bulursanız şüpheli sonucu ve düzeltilmiş sonucu değişiklik açıklamasıyla birlikte raporlayın. Şeffaf düzeltme, kusursuz görünen bir getiri eğrisinden daha yararlıdır.
Bir backteste güvenmeden önce on kontrol
- Her özelliğin karar ve erişilebilir olma saatini kaydedin.
- Mum zaman damgasının açılışı mı kapanışı mı gösterdiğini doğrulayın.
- Kapanış sinyalinin önceki açılış fiyatından gerçekleşmediğini kontrol edin.
- Üst zaman dilimi isteklerinde tarihsel gelecek verisi arayın.
- Merkezlenmiş pencereleri ve geleceğe bakan kaydırmaları tarayın.
- Gelecekteki hedefi ve dolaylı göstergelerini canlı özelliklerden çıkarın.
- Kronolojik ayırın ve çakışan hedeflere uygun aralık bırakın.
- Öğrenilen her ön işlemi ilgili eğitim diliminde kurun.
- Emir oluşturma, tür ve gerçekleşmeyi mevcut fiyatlarla eşleştirin.
- Sıralı tekrar oynatma, işlem maliyetleri ve son dokunulmamış test kullanın.
Sık sorulan sorular
İşlem botunda geleceği görme hatası nedir?
Simülasyondaki kararın, canlı işlem sırasında o anda mevcut olmayacak veriyi kullanmasıdır. Mum açılışında son kapanışı, özellik içinde yarının getirisini veya henüz bitmemiş üst zaman dilimi kapanışını kullanmak örnektir.
Mevcut mumun kapanışını kullanmak her zaman hata mıdır?
Hayır. Mum kapandıktan sonra karar veren sistem tamamlanmış kapanışı kullanabilir. Sorun, testin karar veya gerçekleşmeyi daha erken göstermesi ya da elde edilemeyecek kapanış fiyatını emir fiyatı saymasıdır.
request.security() her zaman yeniden çizim yapar mı?
Hayır. Risk zaman dilimine, ifadeye ve lookahead ayarına bağlıdır. TradingView, kaydırılmamış üst zaman dilimi ifadesiyle lookahead_on kullanımının tarihsel veride geleceği sızdırabileceğini belirtir.
TimeSeriesSplit bütün veri sızıntısını önler mi?
Hayır. Eğitim ve testi zaman sırasına koyar; özellik üretimi, yayımlanma anı, çakışan etiketler, öğrenilmiş dönüşümler ve emir gerçekleşmesi ayrıca incelenmelidir.
Geleceği görme hatası ile aşırı uyum arasındaki fark nedir?
İlkinde tarihsel karar imkânsız bilgiye erişir. Aşırı uyumda geçmişteki gürültüye uyan kurallar veya tekrar tekrar test edilen seçimler öne çıkar. İkisi aynı stratejide görülebilir.
Sızıntı giderilince strateji kârlı kalabilir mi?
Kalabilir; ancak doğru zaman çizelgesi tek başına avantajı kanıtlamaz. Sonraki dokunulmamış dönem, makul emir gerçekleşmeleri, maliyet, düşüş, işlem sayısı ve sağlamlık birlikte incelenmelidir.
Kaynaklar ve yöntem
Üst zaman dilimlerinin tarihsel davranışı ve simüle emir saatleri için platform belgeleri, kronolojik sınama ve veri sızıntısını önlemek için scikit-learn belgeleri. İşlem zaman çizelgesi ve denetim yöntemi TensorParadigm'ın açıklayıcı örneğidir.
- TradingView Pine Script: Diğer zaman dilimleri ve veri
- TradingView Pine Script: Stratejiler ve emir gerçekleşmesi
- scikit-learn: TimeSeriesSplit
- scikit-learn: Yaygın hatalar ve veri sızıntısı
Yalnızca eğitsel araştırmadır. Yatırım tavsiyesi veya TensorParadigm'ın canlı sonuçlarını temsil etmez.