← Makalelere geri dön
July 5, 2026
5 dakikalık okuma

Sadakat Kapısı: Ucuz Vekil, Pahalı Değerlendirmeyle Aynı Şekilde Sıralamadıkça, Kabadan İnceye Backtesting Sizi Daha Hızlı Kandırır

Sadakat Kapısı: Ucuz Vekil, Pahalı Değerlendirmeyle Aynı Şekilde Sıralamadıkça, Kabadan İnceye Backtesting Sizi Daha Hızlı Kandırır
#algotrading
#backtest
#çoklu sadakat
#hyperband
#ASHA
#successive halving
#aşırı uyum
#doğrulama
Part 6 of 10 · Collection
High-Performance Backtest Engines

"Yanılsamasız Backtestler" serisinin bir parçası.

Her ciddi parametre araması aynı duvara çarpar: uzay devasadır ve her dürüst değerlendirme pahalıdır. Bir düzine eşik değeri ve üç gösterge periyoduna sahip, çok-fold'lu bir walk-forward bölünmesi üzerinden değerlendirilen çoklu zaman dilimi (multi-timeframe) stratejisi, konfigürasyon başına saniyeler sürebilir. On bin konfigürasyon ise saatler demektir. Bu yüzden bir kestirme yol ararsınız ve bu kestirme her zaman aynı fikirdir: ucuza değerlendir, hayatta kalanları pahalı teste terfi ettir. On bin konfigürasyonu tek bir fold üzerinde eleyin, ilk birkaç yüzü tutun, bunları tüm fold'lar üzerinde çalıştırın. Saatlik mumlar üzerinde eleyin, yalnızca finalistler için 1 saniyeye kadar derinleşin.

Bu, kabadan inceye (coarse-to-fine) arama denen şeydir — drill-down, çoklu sadakat (multi-fidelity), successive halving, Hyperband, ASHA — ve optimizasyonda gerçekten iyi fikirlerden biridir. Bir günlük hesaplamayı bir saate indirebilir. Biz de kullanıyoruz. Ama o kadar sessiz bir tuzak saklar ki, bunu devreye alan çoğu kişi hiç kontrol etmez; tuzak şudur: yöntemin tamamı, ucuz vekilinizin (proxy) konfigürasyonları pahalı değerlendirmeyle aynı şekilde sıraladığını varsayar. Eğer sıralamıyorsa, daha hızlı arama yapmıyorsunuzdur. Gelecekteki kazananlarınızı ilk kapıda çöpe atıyor ve gürültüyü terfi ettiriyorsunuzdur — sadece kendinizi daha hızlı kandırıyorsunuzdur.

Bu yazı, drill-down'unuzun gerçek mi yoksa bir yanılsama mı olduğunu size söyleyen tek ölçümle ilgilidir. Bunu kendi çoklu zaman dilimi aramamız üzerinde çalıştırdık ve cevap rahatsız ediciydi: en ucuz sadakatte, vekilimiz konfigürasyonları neredeyse rastgele sıralıyordu (Spearman ρ ≈ 0.03). Eğer o sadakat seviyesinde agresif bir şekilde budasaydık — ki her hazır ASHA varsayılanı sizi tam olarak buna davet eder — nihai kazananları ilk turda eleyip atmış olurduk. Çözüm, arama öncesinde çalışan zorunlu bir kapıdır: sıralama korelasyonunu ölçün ve güvenilir olduğu sadakat seviyesinin altında budama yapmayı reddedin.

Çoklu sadakat aramasının gerçekte ne olduğu

Kabadan inceye bir arama şelalesi: solda geniş çapta elenen binlerce ucuz, düşük sadakatli konfigürasyon, yalnızca en iyi hayatta kalanların sağa doğru giderek daha pahalı tam değerlendirmeler aracılığıyla terfi ettirilmesi — successive halving geniş bir zümrüt yeşili aday alanını birkaç parlak finaliste kadar daraltıyor

Bu yöntem ailesinin tek bir şekli vardır. Bir sadakat (aynı zamanda kaynak veya bütçe olarak da adlandırılır) tanımlarsınız: maksimumunda gerçek amaç fonksiyonunu veren, ucuzdan pahalıya bir kadran. Ardından konfigürasyonları düşük sadakatte çalıştırır, sıralarsınız, en iyi kısmı tutarsınız ve yalnızca bu hayatta kalanları daha yüksek sadakatte yeniden çalıştırırsınız — küçük sayıda finalist tam sadakatte değerlendirilene kadar bunu tekrarlarsınız.

Successive halving (Jamieson & Talwalkar, 2016) çekirdek yöntemdir: N konfigürasyonu minimum kaynakla başlatın, en iyi 1/η'yi tutun, kaynağı η ile çarpın, tekrarlayın. Hyperband (Li et al., 2018), successive halving'i, ne kadar agresif budama yapacağınızı tahmin etmek zorunda kalmamanız için farklı başlangıç kaynakları arasında riski dağıtan bir dış döngüye sarar. ASHA (Li et al., 2020) ise asenkron, paralel dostu versiyondur. Eleme oranı η, hepsinin paylaştığı tek düğmedir; kanonik varsayılan η = 3'tür — her basamakta en iyi üçte biri tutun, bütçeyi üçe katlayın.

Sadakatin kendisi, gerçeğe yakınsayan, ucuzdan pahalıya neredeyse her şey olabilir:

  • Walk-forward fold sayısı. 1 fold'da değerlendirin, sonra 2, sonra 3, K'ya kadar. Aşağıda incelediğimiz sadakat budur, çünkü kayan bir örneklem-dışı (out-of-sample) bölünmeye sahip bir backtest için doğal olanıdır.
  • Mum çözünürlüğü. 1 saatlik barlar üzerinde eleyin, 1 dakikaya terfi ettirin, yalnızca finalistler için 1 saniyeye veya ham işlemlere kadar derinleşin. Bu, uyarlanabilir drill-down fikrinin emir gerçekleştirme (fill) simülasyonu yerine aramaya uygulanmış halidir.
  • Geçmiş verinin uzunluğu, epoch sayısı, veri kümesi alt örneklemi — klasik ML sadakatleri.

Bir backtestte önemli olan iki tanesi fold'lar ve çözünürlüktür ve — bu tüm yazının can alıcı noktasıdır — ikisi eşit derecede güvenli değildir. Bunlardan biri, onu ne kadar dikkatli kapılasanız da sessizce yanlış parametreleri seçen bir yanlılığa (bias) sahiptir.

Her şeyin dayandığı tek varsayım

Drill-down'un sessiz çöküşü: pahalı tam sıralamayla uyuşmayan ucuz, düşük sadakatli bir sıralama, bu yüzden gerçek zümrüt yeşili kazananlar ilk kapıda budanıp atılırken kırmızı-turuncu gürültü yukarı doğru terfi ettiriliyor — ve hiçbir zaman hata fırlatılmıyor

Successive halving'in doğru olması için gerçekte neye ihtiyaç duyduğunu yazalım. Ucuz sadakatin doğru amaç fonksiyonu değerini vermesine ihtiyacı yoktur — bir fold'un altı fold'dan farklı bir Sharpe raporlaması kimsenin umurunda değildir. Daha zayıf ama çok daha spesifik bir şeye ihtiyacı vardır: ucuz sadakat, konfigürasyonları pahalı olanla aynı şekilde sıralamalıdır. Eğer konfigürasyon A, tam sadakatte konfigürasyon B'yi yeniyorsa, A düşük sadakatte de B'yi yenme eğiliminde olmalıdır. Hepsi bu kadar. Aynı zamanda her şey de bu kadar.

Biçimsel olarak, drill-down'un işe yarayıp yaramadığını belirleyen büyüklük, konfigürasyon uzayı genelinde düşük sadakatli ve yüksek sadakatli amaç fonksiyonu arasındaki sıralama korelasyonudur. Bu korelasyon yüksekse, ucuz turun hayatta kalanları, pahalı turu kazanacak olan konfigürasyonlarla aynıdır ve hesaplamayı bedavaya kurtarmışsınızdır. Düşükse, ucuz tur rastgele bir filtredir: iyi konfigürasyonları eler ve kötüleri terfi ettirir, siz de bütçenizi daha kötü bir cevaba doğru hızlanmaya harcamışsınızdır. Sizi kurtaracak orta bir η ayarı yoktur — kötü bir vekil hafifçe budansa bile kazananları sızdırır; agresif budandığında ise onları tamamen kanatır.

Başarısızlık her zamanki gibi görünmezdir. Arama tamamlanır, bir şampiyon rapor eder, şampiyon örneklem-içinde (in-sample) gayet iyi görünür. Hiçbir hata fırlatılmaz. Vekilinizin yalan söylediğini ancak şampiyon örneklem-dışında (out-of-sample) dağıldığında keşfedersiniz — o noktada ise başarısızlığı stratejiye atfetmişsinizdir, onu seçen aramaya değil. Yani disiplin, bu serinin sürekli ulaştığı disiplinle aynıdır: yönteme güvenmeden önce, yöntemin varsaydığı şeyi ölçün. Drill-down için ölçülecek şey sıralama korelasyonudur ve bu ölçüm ucuzdur.

Ölçmek: sadakat kapısı

Bir kontrol noktası olarak sadakat kapısı: herhangi bir basamağa güvenilmeden önce, yaklaşık iki yüz rastgele konfigürasyon her sadakat seviyesinde puanlanır ve ucuz vekil ile tam değerlendirme arasındaki sıralama korelasyonu, yalnızca iki sıralama uyuştuğunda açılan parıldayan bir kapıda ölçülür

Kapı, aramanın kendisinden önce, aramak üzere olduğunuz aynı uzay üzerinde bir kez çalıştırdığınız küçük bir deneydir. Prosedür:

  1. Parametre uzayından rastgele birkaç yüz konfigürasyon çekin (biz ~200 kullanıyoruz — kararlı bir Spearman kestirimi için yeterli, karşılayabilecek kadar ucuz).
  2. Her birini her sadakat basamağında değerlendirin: 1 fold'da, 2 fold'da, … tam K fold'a kadar. Fold sayısı sadakati için bu neredeyse bedavadır, çünkü ucuz basamaklar için hesapladığınız fold'lar pahalı olanda yeniden kullanılır — kümülatif bir ortalama.
  3. Her r basamağı için, bu ~200 konfigürasyon genelinde r-fold sıralaması ile tam K-fold sıralaması arasındaki Spearman sıralama korelasyonunu hesaplayın.
  4. ρ'nun bir eşiği aştığı ilk basamak (biz ρ ≥ 0.5 kullanıyoruz), budama yapmanıza izin verilen en sığ sadakattir. Bunun altında sıralama güvenilmeyecek kadar gürültülüdür; orada konfigürasyonları elememelisiniz.

Bütün bu iş birkaç düzine satırdır. Bunun özü:

def fidelity_check(cache, n_probe, seed=7):
    """Spearman ρ: cumulative mean over the first r folds (in FOLD_ORDER)
    vs the full K-fold objective, on n_probe random configs."""
    rng = np.random.default_rng(seed)
    k = len(FOLDS)
    per_fold = np.empty((k, n_probe))
    order_win = np.array([list(FOLDS[fi]) for fi in FOLD_ORDER], np.int64)
    for j in range(n_probe):
        p = _unit_to_params(rng.random(len(PNAMES)))       # random config
        scores, *_ = eval_group(cache, p, _sp_of(p)[None, :], order_win, False)
        per_fold[:, j] = scores[0]                          # score on each fold
    cums = np.cumsum(per_fold, axis=0) / np.arange(1, k + 1)[:, None]  # r-fold mean
    rhos = []
    for r in range(1, k):
        rho = spearmanr(cums[r - 1], cums[-1]).statistic    # r folds vs all K
        rhos.append(0.0 if math.isnan(rho) else rho)
    return rhos

Kasıtlı bir detaya dikkat edin: fold'lar, takvimin erken ve geç dilimlerini birbirine karıştıran (fold 0, sonra ortadan bir fold, sonra fold 1, sonra daha geç bir tanesi, …) iç içe geçmiş (interleaved) bir sırada alınır, FOLD_ORDER. Bu son derece önemlidir ve daha sonraki bir bölümün konusudur: bunun anlamı, "1 fold"un geçmişin ortasına yayılan tek bir dilim olması ve "2 fold"un bir erken artı bir geç dilim olması — asla bitişik, güncel bir pencere değil. Ucuz sadakat, daha güncel fold'lar kullanarak değil, daha az fold kullanarak ucuzlar.

Sonuçlar: tek bir fold neredeyse rastgele sıralıyor

Fold sayısıyla birlikte tırmanan sıralama korelasyonu: tek fold'da yazı-tura atışına yakın bir dağılımla başlayıp beş fold'da neredeyse mükemmel uyuma dikleşen yükselen bir Spearman rho eğrisi, ortadan geçen ve altında budamanın yasak, üstünde ise izinli olduğu yatay bir kapı çizgisiyle birlikte

İşte kapının, iki çoklu zaman dilimi kurulumumuz üzerinde çalıştırıldığında raporladığı şey. Sayı, ~200 rastgele konfigürasyon genelinde r-fold sıralaması ile tam K-fold sıralaması arasındaki Spearman ρ'dur — ucuz sadakat sıralamasının tam sadakat sıralamasını ne kadar sadakatle tahmin ettiği.

Fold r Multi-TF koşusu Daha zor bir rejim
1 +0.43 +0.03
2 +0.67 +0.43
3 +0.78 +0.78
4 +0.82
5 +0.91 +0.91

Önce daha-zor-rejim sütununu okuyun, çünkü alarm veren o. Tek fold'da, ρ = 0.03. Bu zayıf bir korelasyon değil; hiç korelasyon yok — iki yüz konfigürasyonun tek fold'lu sıralaması, onları karıştırmaktan istatistiksel olarak ayırt edilemez. min_resource = 1'de budamaya başlayacak şekilde yapılandırılmış (çoğu varsayılan olarak böyledir) bir successive-halving koşusu, bu rejimde ilk ve en agresif kesimini bir yazı-tura atışı üzerinde yapardı. Sonunda tam sadakatte kazanacak olan konfigürasyonların, ilk turdan sağ çıkma şansı yüzde elli-elliidir. Sıralamanın bir anlam ifade ettiği sadakate ulaştığınızda (üç fold'da ρ = 0.78), çoğu zaten gitmiştir.

Multi-TF sütunu daha ılımlı ama aynı noktayı farklı bir şekilde ortaya koyuyor. Orada bile, tek fold ρ = 0.43 veriyor — 0.5 kapımızın altında. İyi bir korelasyon gibi görünüyor ve tam da tehlike bu: 0.43, sizi rahatlatacak kadar yüksek ve en iyi konfigürasyonlarınızı sızdıracak kadar düşük. Sıralama ancak iki fold'da (ρ = 0.67) güvenilir hale geliyor.

Bunlardan iki şey genelleniyor. Birincisi, tek fold'daki ρ rejime bağlıdır ve güvenilmezdir — kurulumlar arasında 0.03'ten 0.43'e kadar ölçtük ve her iki durumda da tek bir fold barı geçemedi. İkincisi, ρ monoton ve hızlı bir şekilde yükselir: üç fold'da her iki kurulum da 0.78'de, beş fold'da ise 0.91'e yakınsıyorlar. Sinyal oradadır; onu görmek için yeterli sadakat harcamanız gerekir. Kapının işi, "yeterli"nin başladığı tam basamağı bulmak — ve altında budamayı yasaklamaktır.

Tek bir fold neden bu kadar gürültülü

Gürültü, fold kurgumuzdaki bir hata değildir; içseldir ve nedenini anlamak, onu yanlış şekilde "düzeltmenizi" engeller. Tek bir walk-forward fold'u kısa bir penceredir — bir piyasa rejiminin haftaları. Bir stratejinin o pencere üzerindeki skoru, parametrelerinin o rejime ne kadar iyi denk geldiği tarafından domine edilir, bu da stratejinin ne kadar iyi genelleştiği ile ancak gevşek bir şekilde ilişkilidir. Kalite açısından gerçekten farklı iki konfigürasyon, sadece biri o fold'un içerdiği bir trendi yakaladığı için tek bir fold üzerinde yer değiştirebilir. Tek fold üzerindeki amaç fonksiyonu, gerçekte önemsediğiniz amaç fonksiyonunun yüksek varyanslı bir kestiricisidir ve sıralama korelasyonu, yüksek varyansın ilk yok ettiği şeydir tam olarak — bir kestiricinin ortalamasını korurken, sıralaması saf gürültü olabilir.

Fold eklemek bu varyansı ortalayarak düşürür. Her fold, piyasa koşullarının kısmen bağımsız bir çekilişidir; r-fold ortalaması daha düşük varyanslı bir kestiricidir ve sıralaması tam-sadakat sıralamasına doğru yakınsar. ρ = 0.03 → 0.43 → 0.78 → 0.91 tırmanışı tam olarak budur: amaç fonksiyonu değişmiyor, rejime özgü şans ortalandıkça sıralama kestirimi kararlı hale geliyor. Buradaki ders, bir backtest için sadakatin, temelde kaç bağımsız rejim örneklediğinizle ilgili olduğudur — ve bir tanesi sıralama yapmak için neredeyse hiçbir zaman yeterli değildir.

Bu aynı zamanda, daha zor rejimin neden 0.03'te başlarken multi-TF koşusunun 0.43'te başladığını da açıklıyor. Daha zor rejimde, tek fold daha fazla rejime özgüdür — konfigürasyonların tek-fold skorları daha çok şansla ve daha az kalıcı avantaj (edge) ile yönlendirilir, bu yüzden rastgeleye daha yakın sıralanırlar. Kapı bu farkı otomatik olarak okur ve budama yapmadan önce daha fazla fold talep ederek yanıt verir. Hangi rejimde olduğunuzu önceden bilmenize gerek yoktur; ölçersiniz.

Kodda kapı: minimum sadakati otomatik yükseltmek

Kapının çıktısı tek bir tamsayıdır: min_resource, ASHA'nın budama yapmasına izin verilen en sığ sadakat. Kural mekaniktir — basamakları gezin, ρ'su eşiği geçen ilkini alın:

RHO_GATE = 0.5
min_res = len(FOLDS)                      # default: pruning OFF (full fidelity)
rhos = fidelity_check(cache, n_probe=200) # [ρ@1, ρ@2, …, ρ@(K-1)]
passing = [r for r, rho in enumerate(rhos, 1) if rho >= RHO_GATE]
if passing:
    min_res = passing[0]                  # first rung that clears the gate

pruner = SuccessiveHalvingPruner(min_resource=min_res, reduction_factor=3)

Bunu iki koşu üzerinden takip edelim. Multi-TF kurulumunda, ρ@1 = 0.43 kapıyı geçemiyor ama ρ@2 = 0.67 geçiyor, bu yüzden min_resource otomatik olarak 2'ye yükseltiliyor: ASHA, herhangi bir şeyi elemesine izin verilmeden önce her konfigürasyonu en az iki fold üzerinde çalıştırır, sonra oradan itibaren normal şekilde budar. Daha zor rejimde, ρ@1 = 0.03 ve ρ@2 = 0.43'ün ikisi de başarısız oluyor; geçen ilk değer ρ@3 = 0.78, bu yüzden min_resource 3 oluyor. Ve can alıcı yedek plan: eğer hiçbir basamak 0.5'e ulaşmazsa, passing boş kalır ve min_resource K'da kalır — budama tamamen kapatılır ve arama, hızlı ama yanlış bir aramaya değil, sade bir tam-sadakat aramasına zarifçe geriler. Vekilini kanıtlayamayan bir drill-down, budama yapmayı basitçe reddeder.

Bu, tüm felsefenin tek bir kontrol akışı satırında ifadesidir. Her successive-halving kütüphanesinin varsayılanı "min_resource = 1'den buda, ucuz basamağa güven"dir. Kapı bunun yerine şunu koyar: "verinin güvenilir dediği ilk basamaktan buda, eğer hiçbiri güvenilir değilse buda." Önceden bir kerelik ~200 konfigürasyonluk bir sondaja mal olur ve drill-down'u bir inanç eyleminden ölçülmüş bir karara dönüştürür. Eleme oranı η = 3 olduğu gibi kalır; kapı, ne kadar sert budadığınıza değil, yalnızca ne kadar erken başlamanıza izin verildiğine dokunur.

Yukarıdaki kodda görünen bir dürüstlük notu: min_resource'u yükseltmek hızlanmadan yer alır. 1 yerine 3 fold'da budama yapmak, atacağınız konfigürasyonlar dahil her konfigürasyonun üç fold'un bedelini ödediği anlamına gelir. Bu doğruluğun bedelidir ve doğru bir takastır: gerçek kazananları bulan bir aramada 2 kat daha küçük bir hızlanma, onları atan bir aramadaki 6 kat hızlanmadan daha iyidir. Kapı bu takası gizlemek yerine açıkça yapar.

Yanlış ucuz eksen: daha kısa geçmiş bir tuzaktır

Cazip, bariz ve yanlı (biased) olan ucuz bir sadakat var ve isim vererek belirtmeye değer çünkü herkes önce ona uzanır: daha kısa geçmiş. Konfigürasyonları son bir ay üzerinde eleyin, hayatta kalanları tam iki yıla terfi ettirin. Önemsiz derecede ucuzdur ve daha az fold ile aynı fikirmiş gibi hissettirir. Değildir.

Daha az fold ile daha kısa geçmiş, belirleyici bir şekilde farklıdır. Doğru yapıldığında, fold sayısı sadakati yine de tüm takvimi kapsar — sadece onu daha kaba örnekler. Daha kısa geçmiş sadakati ise takvimin bir alt aralığını yoğun bir şekilde örnekler. Ve piyasa geçmişinin bir alt aralığı belirli bir rejimdir. Konfigürasyonları son bir ay üzerinde sıraladığınızda, tam dönem sıralamalarının gürültülü-ama-yansız (unbiased) bir kestirimini almıyorsunuzdur; sistematik olarak son ayın rejimine ayarlanmış konfigürasyonları kayıran yanlı bir kestirim alıyorsunuzdur. Örneklem büyüklüğünü istediğiniz kadar artırın — daha fazla konfigürasyon, daha fazla deneme üzerinden ortalayın — yanlılık küçülmez, çünkü bu varyans değildir. Eleme penceresine en iyi uyan konfigürasyonları terfi ettirirsiniz ve bunlar tam olarak geçici bir rejime aşırı uyum sağlamış olma ihtimali en yüksek olanlardır.

Bu yüzden sadakatimiz fold'ları kronolojik olarak değil, iç içe geçmiş (interleaved) bir sırayla gezer. Tüm geçmiş boyunca yayılmış K fold ile, "1 fold" ortaya yakın tek bir dilimdir, "2 fold" bir erken ve bir geç dilimdir, "3 fold" erken/orta/geç şeklinde yayılır — en ucuzu dahil her sadakat seviyesi, tüm takvim genelinde örnekler. Ucuz vekil, tüm dönemin kaba bir görünümüdür, asla onun bir diliminin keskin bir görünümü değildir. Bu iç içe geçme, fold sayısı sadakatini yanlı (hiçbir kapının düzeltemeyeceği — yanlı bir hedefe karşı yüksek bir ρ, sadece rejime uyan konfigürasyonu güvenilir şekilde seçeceğinizi onaylar) yerine yalnızca gürültülü (kapı tarafından iyileştirilebilir) yapan şeydir. Bir sadakati ucuzlatmanın tek yolu onu daha güncel hale getirmekse, geçerli bir sadakatiniz yok demektir. Bunun yerine daha kaba hale getirin.

Dürüst ucuz eksen olarak çözünürlük

Diğer ucuz eksen yanlılığı tamamen önler ve emir gerçekleştirme (fill) simülasyonu için tanımladığımız uyarlanabilir drill-down'ın doğal ortağıdır: mum çözünürlüğü. Tüm uzayı 1 saatlik barlar üzerinde eleyin, hayatta kalanları 1 dakikaya terfi ettirin ve yalnızca az sayıdaki finalist için 1 saniyeye veya ham işlemlere kadar derinleşin. Aynı tam geçmiş üzerinde daha kaba mumların değerlendirilmesi daha ucuzdur — daha az bar, daha hızlı gösterge geçişleri, daha hızlı simülasyon — ve daha kısa bir pencerenin aksine, tüm takvimin kaba bir görünümü yansızdır: her rejimi görür, sadece daha az bar-içi (intrabar) detayla.

Çözünürlük ve fold'lar birbirini tamamlayan sadakat eksenleridir ve sadakat kapısı her ikisine de uygulanır. Bir 1 saatlik eleğe güvenmeden önce aynı sondajı çalıştırın: ~200 konfigürasyon alın, bunları 1h ve 1m'de puanlayın ve sıralama korelasyonunu ölçün. ρ(1h, 1m) yüksekse, saatler üzerinde eleme güvenlidir ve büyük bir hızlanmayı dürüstçe satın almışsınızdır. Düşükse — bu, stratejinin avantajının saatlik mumların bulandırdığı bar-içi yapıda yaşadığı durumlarda olur — o zaman saatlik eleme o strateji için rastgele bir filtredir ve kapı size daha ince taneli başlamanızı söyler. Kural asla değişmez: bir sadakatte budama yapmanıza yalnızca sıralamasının gerçekle uyuştuğunu ölçtükten sonra izin verilir.

İki eksen ayrıca zıt şekillerde başarısız olur, ki bu faydalıdır. Kaba çözünürlük bar-içi bilgiyi kaybeder; daha az fold ise rejimler-arası bilgiyi kaybeder. Günlük ufuklarda bir momentum stratejisi saatlik mumlarda mükemmel sıralanabilir ama rejim şansını ortalamak için birçok fold'a ihtiyaç duyabilir; bir scalping stratejisi az sayıda fold'da iyi sıralanabilir ama 1 saniye çözünürlüğün üzerinde dağılabilir. Eksen başına çalıştırılan kapı, size işinize gelen bir cevabı varsaymak yerine, bu strateji için hangi sadakatte ucuz olmayı göze alabileceğinizi söyler.

Tasarruflar gerçekte nereden geliyor

Drill-down'u dürüst tutan bir uyarı: bir sadakat, hesaplamayı yalnızca maliyetin gerçekte yaşadığı yerde tasarruf ettirir. Çoklu zaman dilimi motorumuzda pahalı kısım, göstergelerin önceden hesaplanmasıdır — çoklu zaman dilimi HMA'sı ve ayrım (separation) sinyalleri — ki bu, herhangi bir fold çalışmadan önce, konfigürasyon başına bir kez ödenir. Önbelleğe alınmış sinyaller üzerindeki fold-başına simülasyon ise nispeten ucuzdur. Yani fold sayısı üzerinde budama yalnızca simülasyon maliyetinden tasarruf ettirir, baskın olan gösterge maliyetinden değil; fold sayısı sadakati gerçektir ama tavanı, ham fold oranının önerdiğinden daha düşüktür.

Çözünürlük ekseni ise buna karşılık, baskın maliyete doğrudan saldırır: daha kaba mumlar, göstergelerin üzerinde hesaplanacağı daha az bar demektir, böylece hem pahalı ön-hesaplama hem de ucuz simülasyon birlikte küçülür. Bu bir ayrıntı değildir — hangi drill-down'un inşa etmeye değer olduğuna karar verir. Çoklu sadakat aramasına yatırım yapmadan önce, saniyelerinizin nereye gittiğini sorun. Eğer %90'ı fold'lar arasında paylaşılan gösterge ön-hesaplamasıysa, fold sayısı sadakati size az şey kazandırır ve bir çözünürlük sadakati size çok şey kazandırır. Önce profilleyin; doğru ucuz eksen, gerçekte sahip olduğunuz maliyeti ortadan kaldıran eksendir ve yine de kapıyı geçmesi gerekir.

Bunun bağlandığı yer

Sadakat kapısı, bu serinin backtest hijyeni zincirinde belirli bir noktada durur:

  • Aşırı uyum kontrolünün yukarısında yer alır. Kötü bir vekil üzerinden budama yapan bir drill-down, aşırı uyumun yeni bir yoludur — gürültülü bir erken basamağın finalistlerinizi seçmesine izin veriyorsunuzdur. Şampiyon yine de Deflated Sharpe ve PBO'dan sağ çıkmak zorundadır ve bu kapıları besleyen deneme sayısı, yalnızca hayatta kalanları değil, budanan her denemeyi de içermelidir — budama, bir denemeyi çoklu-test defterinden muaf kılmaz.
  • Düşmanını plato analizi ile paylaşır: bir fold'u veya bir eleme penceresini kazanıp başka hiçbir yerde kazanmayan bir konfigürasyon, her iki aracın da reddetmek için var olduğu aynı rejime-uyum artefaktıdır. Kapı, böyle bir fold üzerinde seçim yapmayı reddeder; plato analizi ise tek bir fold üzerinde duran bir şampiyona güvenmeyi reddeder.
  • Altında dürüst bir walk-forward bölünmesini varsayar — tüm takvime yayılan fold'lar, bir kenara ayrılmış örneklem-dışı veri — ve emir gerçekleştirme (fill) simülasyonu için inşa ettiğimiz drill-down'un arama-zamanı karşılığıdır: aynı kabadan-inceye ilkesi, ne kadar hassas doldurulacaklarına değil, hangi konfigürasyonların değerlendirileceğine uygulanır.
  • Ve kesinlikle sadakatin her basamakta sızıntısız olmasına bağlıdır. Eğer ucuz basamakta, pahalı olanın sahip olmadığı bir ileriye bakış yanlılığı (look-ahead bias) varsa, ρ, kirlenmiş bir hedefle uyumu ölçer ve kapı bir sızıntıyı onaylamış olur. Sıralama korelasyonunu ölçün, evet — ama dürüst bir amaç fonksiyonu üzerinde.

Birleştirici fikir, yine, bu serinin tekrarlamayı bırakmayacağı fikirdir: bir backtest istatistiksel bir deneydir ve içindeki her kestirme yol, test etmekle yükümlü olduğunuz bir hipotezdir. Drill-down'un hipotezi "ucuz sıralama ≈ pahalı sıralama"dır. Bu, ~200 konfigürasyonda test edilebilir. Test edin.

Çıkarımlar

  1. Kabadan inceye arama tek bir varsayıma dayanır: ucuz vekil, konfigürasyonları pahalı olan gibi sıralar. Aynı değer değil — aynı sıralama. Sıralama korelasyonu düşükse, agresif budama gelecekteki kazananlarınızı çöpe atar ve gürültüyü terfi ettirir. Daha kötü bir cevaba doğru daha hızlı arama yaparsınız.
  2. Güvenmeden önce ölçün. ~200 rastgele konfigürasyon çekin, bunları her sadakat basamağında puanlayın ve her ucuz basamak ile tam-sadakat sıralaması arasındaki Spearman ρ'yu hesaplayın. Bu, birkaç düzine satır ve bir ucuz sondajdır.
  3. Tek bir fold neredeyse rastgele sıralar. Rejime bağlı olarak ρ@1'i 0.03'ten (yazı-tura) 0.43'e (hâlâ güven eşiğinin altında) kadar ölçtük; fold'lar arttıkça 0.67, 0.78, 0.82 ve 0.91'e tırmanıyor. Her hazır ASHA'nın varsayılan min_resource = 1 değeri, bir backtest için genellikle yanlıştır.
  4. Minimum sadakati, ρ ≥ 0.5 olan ilk basamağa otomatik yükseltin ve hiçbiri geçemezse hiç budama yapmayın. Kapı, bir kurulum için min_resource = 2'ye, daha zor biri için 3'e dönüştü; yedek plan, tam-sadakat aramasına zarifçe geriler. Doğruluk biraz hızlanmaya mal olur — bunu ödeyin.
  5. Ucuz ekseni ne kadar ucuz olduğuna göre değil, yanlı olup olmadığına göre seçin. Daha kısa geçmiş yanlıdır — rejime uyan parametreleri seçer ve hiçbir örneklem büyüklüğü bunu düzeltmez. Tüm takvime yayılan (bitişik değil, iç içe geçmiş) daha az fold veya tüm dönem üzerinde daha kaba çözünürlük kullanın. Ve ucuz ekseni, maliyetinizin gerçekte yaşadığı yerde harcayın.

Drill-down, backtestteki en iyi hızlanmalardan biridir ve kendinizi kandırmanın daha hızlı bir yoluna dönüştürmesi en kolay olanlardan biridir. İkisi arasındaki fark, arama başlamadan önce ölçebileceğiniz tek bir sayıdır. Eğer vekiliniz gerçek gibi sıraladığını kanıtlayamıyorsa, bu bir vekil değildir — makul bir maliyet profiline sahip bir rastgele sayı üreticisidir.

Sorumluluk Reddi: Bu makalede sağlanan bilgiler yalnızca eğitim ve bilgilendirme amaçlıdır ve finansal, yatırım veya ticaret tavsiyesi niteliği taşımaz. Kripto para ticareti önemli bir kayıp riski içerir.

Yazarlar

Eugen Soloviov
Eugen Soloviov

Trading-systems engineer

Trading-systems engineer building bots since 2017: cross-exchange arbitrage (connected up to 30 venues), cointegration-based pairs arbitrage across spot and futures, scalping, news and sentiment-driven strategies, trend algorithms, and portfolio management and balancing algorithms. Also builds sub-millisecond order execution, big-data warehouses, backtesting engines, AI agents, and trading interfaces (incl. open-source profitmaker.cc). Stack: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, architecture.

Newsletter

Piyasanın Önünde Olun

Özel yapay zeka ticaret içgörüleri, piyasa analizi ve platform güncellemeleri için bültenimize abone olun.

Gizliliğinize saygı duyuyoruz. İstediğiniz zaman abonelikten çıkabilirsiniz.