İki Eksenli Parametre Uzayı: Taramanızın Büyük Kısmı Neden Neredeyse Bedava Olmalı
"Yanılsamasız Backtestler" serisinin bir parçası.
Boyutluluk laneti genellikle bir uyarı olarak anlatılır: eklediğiniz her parametre arama uzayını katlar, dolayısıyla 18 boyutlu bir stratejiyi taramak umutsuz bir iştir. Bu çerçeveleme, her boyutun değerlendirme maliyetinin aynı olduğunu sessizce varsayar. Oysa öyle değildir. Bizim çift/üçlü zaman dilimli motorumuzda parametrelerin üçte ikisini taramak neredeyse bedavadır; hesaplama faturasının neredeyse tamamını ise üçte biri taşır. Bu ayrımı bir kez gördüğünüzde, "arama uzayı çok büyük" doğru şikayet olmaktan çıkar. Doğru soru şudur: hangi boyutlar için para ödüyorsunuz?
Yeniden hesaplanmaya ihtiyacı olmayan boyut
Parametre arama benchmark'ımız çok zaman dilimli bir momentum stratejisi çalıştırıyor: iki veya üç zaman diliminde bir Hull hareketli ortalaması ve onun üç kat yumuşatılmış varyantı (HMA3), artı bir kesişimin işlem yapmaya değecek kadar "temiz" olup olmadığına karar veren bir yönlü ayrışma kapısı. Üçlü-TF varyantı için tam arama uzayı on sekiz boyuttur — zaman dilimi başına periyot ve HMA uzunluğu, ayrıca her zaman diliminde giriş ve çıkış için bir dizi ayrışma eşiği.
Bunu taramanın naif yolu tek bir döngüdür: bir parametre vektörü seç, her göstergeyi sıfırdan kur, simülasyonu çalıştır, puanla, tekrarla. Biz de oradan başladık. Yavaştı ve yavaşlığın nedeni, adını koyduğumuz anda utanç verici hale geldi: bitişik denemelerin ezici çoğunluğunda değişmemiş göstergeleri yeniden hesaplıyorduk.
Giriş ayrışma eşiğini 0.03'ten 0.035'e kaydırıp yeniden çalıştırın. Bir yıllık 1 dakikalık barlar üzerindeki Hull MA, önceki denemeyle bit bit aynıdır — eşik, tanımının hiçbir yerinde geçmez. Yine de naif döngü onu her seferinde yeniden kurar; yarım milyondan fazla bar, üç zaman dilimi derinliğinde, her defasında. Hesaplama bütçemizin neredeyse tamamını, aslında değiştirdiğimiz parametreden bağımsız olan büyüklükleri yeniden türetmeye harcıyorduk.
Bu gözlem, makalenin tamamıdır. Bazı parametrelerin göstergeleri değiştirdiğini, bazılarının ise yalnızca sabit göstergelere uygulanan karar kuralını değiştirdiğini fark ettiğiniz anda, parametre uzayı düz bir boyut bulutu olmaktan çıkar ve fiyat etiketleri birbirinden çılgınca farklı iki iç içe katmana dönüşür.
Tek değil, iki eksen

Parametreleri, yeniden değerlendirilmelerinin sizi neyi yeniden hesaplamaya zorladığına göre ayırın:
-
Pahalı eksen — gösterge parametreleri. Zaman dilimi periyodu ve HMA uzunluğu. İkisinden birini değiştirin, göstergeyi tüm fiyat serisi boyunca yeniden kurmanız gerekir: üst zaman dilimini yeniden örneklemek, Hull ağırlıklandırmasını çalıştırmak, kesişim serisini ve her kesişimdeki ayrışmayı yeniden hesaplamak. Bu, geçmişteki her bar üzerinden geçen O(n) bir taramadır ve her farklı kombinasyon için bedelini eksiksiz ödersiniz. Üçlü-TF stratejisinde bu eksen altı parametredir: üst, orta ve alt zaman dilimlerinin her biri için
(period, hma_length). -
Ucuz eksen — karar eşikleri. Zaten hesaplanmış kesişim ve ayrışma serileri verildiğinde girilip girilmeyeceğine veya çıkılıp çıkılmayacağına karar veren yönlü ayrışma kapıları. Bir eşiği değiştirin, hiçbir gösterge kımıldamaz. Yalnızca önceden hesaplanmış sinyaller üzerinde tek bir O(n) geçişi yeniden çalıştırırsınız: kapıları kontrol eder, gerçekleşmeleri kaydedersiniz. Üçlü-TF stratejisinde bu eksen on iki parametredir (üç zaman diliminin her birinde dört ayrışma eşiği — giriş-alış, giriş-satış, çıkış-alış, çıkış-satış). Çift-TF varyantında sekiz tane vardır (iki zaman diliminin her birinde dört eşik).
Yani uzayın gerçek şekli şudur: üçlü-TF için 6 pahalı + 12 ucuz = 18, çift-TF için 4 pahalı + 8 ucuz = 12. Boyutluluğun üçte ikisi ucuz eksende yaşar. Ve iki eksen yalnızca sayıca farklı değildir — birim maliyetleri üç büyüklük mertebesinden fazla ayrışır; makalenin geri kalanı işte bu sayı hakkındadır.
Yapı kesin biçimde iç içedir. Pahalı eksendeki her nokta — zaman dilimi başına somut bir (period, hma_length) — bir dizi sabit sinyal dizisi tanımlar. Bu sabit temelin üzerinde ucuz eksenin koca bir tabakası oturur: her biri aynı diziler üzerinde hızlı bir geçiş olan binlerce eşik vektörü. Temelin bedelini bir kez öder, tüm tabakaya amorti edersiniz.
Göstergeler eşiklerden neden bağımsızdır
Önbellekleme, şanslı bir uygulama detayı sayesinde değil, matematiksel bir gerçek sayesinde çalışır ve taşıyıcı varsayım olduğu için bunu kesin bir dille ifade etmeye değer. Gösterge dizileri yalnızca (period, hma_length) ikilisinin bir fonksiyonudur. Ayrışma eşikleri, tanımlarının hiçbir yerinde geçmez.
Somut olarak, motor her zaman dilimi için taban indeks üzerinde hizalanmış dört dizi önceden hesaplar: Hull MA hma, üç kat yumuşatılmış hma3, kesişim serisi cross (+1 alış / −1 satış / 0) ve her kesişimdeki separation yüzdesi. Bunların her biri fiyatlardan ve iki gösterge parametresinden türetilir. Eşik — separation değerini kendisiyle karşılaştırdığınız sayı — daha sonra, karar anında uygulanır. Dizilere asla dokunmaz.
Bu, kendiliğinden güvenli bir yeniden düzenleme değildir. Yalnızca bilginin ne zaman erişilebilir hale geldiğine dikkat ettiğimiz için güvenlidir; bu da serinin başka bir yerindeki ileriye bakma yanlılığı çalışmasının konusudur. Taban bar i üzerindeki üst zaman dilimi göstergesi, kapanmış üst-TF mumları artı anlık kapanışı mevcut taban kapanış close[i] değerine eşit olan oluşmakta olan bir mumdan hesaplanır — bar i anında bilinen bir değer. Gelecekten hiçbir şey sızmaz. Dolayısıyla bar i için önceden hesaplanan sinyal, canlı bir botun bar i anında göreceği şeyin tam kendisidir ve daha sonra hangi eşiğe karşı test ederseniz edin geçerli kalır. Sızıntılı bir sinyali önbelleklemek sadece sızıntıyı önbellekler; nedensel bir sinyali önbelleklemek ise gerçekten işlem yapabileceğiniz bir şeyi önbellekler.
Bu değişmezlik bize bir çarpanlara ayırma verir. Tam bir parametre vektörünün θ = (indicator_params, threshold_params) değerlendirmesini şöyle yazın:
signals = build_indicators(indicator_params) # EXPENSIVE, depends only on indicator_params
score = simulate(signals, threshold_params) # CHEAP, reuses signals across all thresholds
build_indicators, threshold_params değerini okumaz. Önbelleği meşru kılan işte bu tek gerçektir: indicator_params sabit tutun, threshold_params değerini serbestçe değiştirin; signals artık bir kez hesapladığınız bir sabittir.
Mimari: bir kez hesapla, çok kez tara

Motor (backtester'ımızdaki scripts/engine_multitf.py, commit bfc8aaa), bu çarpanlara ayırmayı, adları tam olarak ne yaptıklarını söyleyen iki parçayla hayata geçirir.
SignalCache — pahalı eksen, memoize edilmiş. (period_bars, hma_length) ile anahtarlanmış bir sözlüktür. Ondan bir zaman diliminin sinyallerini isteyin; o gösterge kombinasyonu daha önce kurulmuşsa önbellekteki TFSignals nesnesini döndürür, kurulmamışsa bir kez kurar ve saklar. Anahtar yalnızca gösterge parametrelerinden oluştuğu için, bir gösterge kombinasyonunu paylaşan her eşik konfigürasyonu — ki yoğun bir eşik taramasında bu binlerce konfigürasyon demektir — aynı önbellek girdisine denk gelir. Bunu özellikle üst zaman dilimleri ödüllendirir: diyelim dört aday periyot çarpı bir avuç HMA uzunluğundan oluşan kaba bir ızgara, az sayıda ayrık pahalı kurulum demektir ve her biri, üzerine yığılmış tüm eşik tabakası boyunca yeniden kullanılır.
sweep_separations — ucuz eksen, toplu halde. Önbellekteki sinyal dizilerini ve bir eşik vektörleri matrisini (sps, [m, 12] boyutunda) alır ve hepsini tek bir derlenmiş çekirdekten geçirir. Her satır bir O(n) geçiştir: barlar üzerinde yürü, kapıları uygula, sızıntısız gerçekleşmeleri open[i+1] fiyatından kaydet, PnL ve pozisyonda geçen süreyi topla. Bu döngünün içinde hiçbir gösterge yeniden kurulmaz — cross ve separation değerlerini doğrudan önbellekten okur. İçteki simülasyon JIT ile derlenmiştir (Numba); dolayısıyla ısındıktan sonra konfigürasyon başına maliyeti Python ek yükü değil, barlar üzerindeki tek doğrusal tarama belirler.
İki parça, doğal iç içe aramayı oluşturur: dış döngü pahalı eksende yürür (her yineleme bir gösterge kombinasyonu kurar ve önbelleğe alır), iç döngü ise bu önbelleklenmiş diziler üzerinde ucuz eksene geniş bir toplu iş yayar. Kodda şekil tam olarak budur — geniş ve ucuz bir toplu işi saran küçük ve pahalı bir döngü:
cache = SignalCache(base_close, base_ts) # keyed by (period, hma_length)
for htf_p, htf_h, mtf_p, mtf_h, ltf_p, ltf_h in indicator_grid: # EXPENSIVE axis (coarse)
htf = cache.get(htf_p, htf_h) # built once, then a cache hit forever
mtf = cache.get(mtf_p, mtf_h)
ltf = cache.get(ltf_p, ltf_h)
sps = sample_thresholds(m=4000) # CHEAP axis: [m, 12] threshold vectors
pnl, n_trades, bars_in_pos = sweep_separations( # one compiled batch, no indicator work
base_close, base_open, htf, ltf, sps, mtf=mtf)
Pahalı kurucuya, gösterge ızgarasının izin verdiği kadar az dokunursunuz ve hacim işini ucuz taramaya bırakırsınız — hiç kımıldamayan dizilere karşı binlerce sps satırı. Optimizasyonun tamamı budur — ne yaklaşıklık ne doğruluk kaybı; sadece değişmemiş olanı yeniden hesaplamayı reddetmek.
"Bedava"nın gerçek maliyeti: sayılar

İki ekseni demo iş yükü üzerinde ölçtük: tam bir yıllık 1 dakikalık ETHUSDT barları (~527k bar), üçlü-TF; göstergeler ısıtılmış, JIT derlemesi zamanlamanın dışında tutulmuş.
Ucuz eksende sweep_separations, saniyede ~5,600 eşik konfigürasyonu hızını sürdürüyor. Bu, her konfigürasyon için yarım milyondan fazla bar üzerinde eksiksiz bir simülasyon demek — kapılar, gerçekleşmeler, PnL, maruziyet — konfigürasyon başına kabaca 180 mikrosaniye. Bu kadar hızlı olabilmesinin nedeni sıfır gösterge işi yapmasıdır: her konfigürasyon aynı önbelleklenmiş cross ve separation dizilerini okur.
Şimdi alternatifi fiyatlandırın. Üçlü-TF gösterge setini bir kez kurmak birkaç yüz milisaniye mertebesindedir (~0.3 s) — üç zaman dilimini yeniden örneklemek, Hull ağırlıklandırması, tüm yıl üzerinde kesişim ve ayrışma çıkarımı. Eğer göstergeleri konfigürasyon döngüsünün içinde yeniden hesaplasaydınız — naif tek döngülü tasarım — saniyedeki o 5,600 konfigürasyonun her biri bunun yerine tam gösterge kurulumunun bedelini öderdi. Konfigürasyon başına maliyet ~180 mikrosaniyeden ~0.3 saniyeye şişer:
| Konfigürasyon başına maliyet | Konfigürasyon/sn | |
|---|---|---|
| Ucuz eksen (önbelleklenmiş sinyaller) | ~180 µs | ~5,600 |
| Her konfigürasyonda göstergeleri yeniden hesapla | ~0.3 s | ~3.4 |
Oran ~1,600x. Ucuz ekseni önbelleklenmiş sinyaller üzerinde taramak, her eşik vektörü için göstergeleri yeniden kuran naif tasarımdan kabaca üç büyüklük mertebesi daha ucuzdur. Somut olarak: önbellekli yolda bir saniyenin altında biten birkaç bin eşik konfigürasyonluk bir parti, her konfigürasyon kendi göstergelerini yeniden kursaydı bir saatin büyük kısmını alırdı. Aynı sonuçlar, aynı doğruluk, matematikte hiçbir kestirme yok — tek fark, birinin bir değişmezi yeniden hesaplaması, diğerininse hesaplamaması.
Bu, işin sonunda üzerine serpiştirdiğiniz bir mikro-optimizasyon değildir. Hangi aramaların yapılabilir olduğunu değiştirir. 5,600 cfg/s hızında eşik ekseni doğru dürüst keşfedilecek kadar yoğundur — gösterge kombinasyonu başına ince bir ızgarayı veya uzun bir rastgele/QMC örneklemi karşılayabilirsiniz — pahalı eksen ise kasıtlı olarak kaba tutulmuş bir avuç kurulumda kalır. Hesaplama bütçesi, parametrelerin gerçekten bir maliyeti olan yere akar.
Boyutluluk laneti, yeniden fiyatlandırıldı

Makalenin açılışındaki çerçevelemeye geri dönün. Boyutluluk laneti, arama uzayının parametre sayısıyla üstel büyüdüğünü, dolayısıyla daha fazla boyutun kategorik olarak daha kötü olduğunu söyler. Bu, ızgaranın büyüklüğü için doğrudur. Onu kaplamanın maliyeti içinse yanıltıcıdır, çünkü her boyutu aynı fiyattan hesaplar.
Eksenleri ayırdığınızda sayı farklı okunur. Üçlü-TF stratejisi 18 boyutludur, ama bu boyutların yalnızca 6'sı pahalıdır. Diğer 12'si, hesaplama faturasını kayda değer biçimde büyütmeden ızgarayı büyüten ucuz eksen boyutlarıdır — onlara kuruşlar karşılığında binlerce konfigürasyon fırlatabilirsiniz. Çift-TF stratejisi 12 boyutludur; yalnızca 4 pahalı ve 8 ucuz boyutla. Her iki durumda da "lanetin" çoğunluğu, taranması neredeyse hiçbir şeye mal olmayan eksende yoğunlaşır.
Dolayısıyla arama maliyeti hakkında dürüstçe akıl yürütmenin yolu "kaç parametre var" sorusu değil, "kaç pahalı parametre var ve ızgaraları ne kadar kaba olabilir" sorusudur. Üstel büyümenin gerçekten acıttığı yer pahalı eksendir ve küçük, iyi seçilmiş bir ızgara istediğiniz yer de burasıdır — birkaç aday periyot, mütevazı bir HMA uzunluğu aralığı — muhtemelen başka yerde kullandığımız uyarlanabilir çözünürlüklü derinleşme ruhuyla kabadan inceye rafine edilmiş. Cömert davranabileceğiniz yer ucuz eksendir, çünkü her ek eşik konfigürasyonu 180 mikrosaniyedir.
Bu yeniden fiyatlandırma, HMA stratejimizin çok ötesine genellenir. Örüntü — bazı parametreler öznitelikleri değiştirir, çoğu parametre sabit özniteliklere uygulanan kuralı değiştirir — sistematik ticarette her yerde tekrarlanır. Gösterge uzunlukları, yeniden örnekleme frekansları ve geriye bakış pencereleri pahalıdır; giriş/çıkış eşikleri, stop mesafeleri, pozisyon boyutlandırma çarpanları ve teyit kapıları ucuzdur. Bir parametre yalnızca zaten hesaplanmış sinyaller üzerindeki karar sınırını yeniden şekillendiriyorsa, ucuz eksene aittir ve orada taranmalıdır. Aynı aileden ilgili önbellekleme kazanımları çok zaman dilimli parquet önbelleklemesinde ve daha geniş kapsamlı motor hız merdiveninde karşımıza çıkar.
Bedava öğle yemeğinin faturası nerede kesilir
Ucuz eksen hesaplama açısından ucuzdur. İstatistik açısından ucuz değildir ve ikisini birbirine karıştırmak, bir performans kazanımını aşırı uyum (overfitting) makinesine dönüştürmenin yoludur.
Değerlendirdiğiniz her eşik konfigürasyonu bir denemedir ve tek bir veri kümesi üzerinde binlerce deneme çalıştırdığınızda, en iyisi kısmen şans eseri iyi görünür. Bu denemeleri 1,600x daha ucuz hale getirmek şansı ortadan kaldırmaz — birikmesini kolaylaştırır. Yoğun bir eşik taraması, çoklu test enflasyonunun en sert ısırdığı durumun ta kendisidir: çok sayıda aday, tek bir tarihçe ve maksimumu raporlayan bir seçim kuralı. Dünyanın en hızlı motoru, test pencerenizin gürültüsüne harikulade uyan ve örneklem dışında çuvallayan bir eşik vektörünü size seve seve teslim eder.
Dolayısıyla disiplin, hızla birlikte ölçeklenmek zorundadır. Bir denemenin hesaplama maliyeti sıfıra doğru düştüğü anda, bağlayıcı kısıt istatistiksel muhasebe olur ve bu bedeli açıkça ödemeniz gerekir:
- Deneme sayısına göre söndürün. Kazananı sıfıra karşı değil, kaç konfigürasyon denediğinize karşı puanlayın. Söndürülmüş Sharpe Oranı ve backtest aşırı uyum olasılığı tam olarak bunun için vardır — "4,000 eşik vektörü denedik" ifadesini, raporlanan avantajdan yapılan bir kesintiye dönüştürürler.
- Örneklem dışında, fold başına doğrulayın. Ucuz bir tarama bile dürüst bir walk-forward bölünmesinin içinde çalıştırılmalıdır; yalnızca örneklem içinde kazanan bir eşik, onu ne kadar hızlı bulduğunuzdan bağımsız olarak değersizdir. Motorumuz gerçekleşmeleri sızıntısız tutar (
open[i+1]), tam da ucuz eksen ileriyi dikizleyerek performans satın alamasın diye. - Zirveler yerine platoları tercih edin. Eşik ekseni yoğun ve hızlı olduğu için, yalnızca argmax'ını değil, tepki yüzeyinin tamamını haritalayabilirsiniz. Hepsi çalışan geniş bir eşik bölgesi gerçek bir avantajdır; tek başına sivri bir maksimum ise uydurulmuş bir yapaylıktır — tam da anlattığımız hızın karşılanabilir kıldığı plato-zirve ayrımı.
İki eksenli yapıyı doğru okuyun: size daha fazla güven satın almaz; deneme başına aynı güven maliyetiyle daha fazla deneme satın alır. Bu gerçekten değerlidir — ucuz eksenin yoğun kapsanması, platoları bulmanızı ve yüzeyi karakterize etmenizi sağlayan şeydir — ama yalnızca istatistiksel defteri dürüst tutarsanız. Hız, kapsamlı arama yapmamak için hesaplama bahanesini ortadan kaldırır; kapsamlı aramanın bulduklarını iskonto etme yükümlülüğünü ortadan kaldırmaz.
Kendi aramanızı nasıl yapılandırmalısınız
Bunu kendi stratejinize uygulamak için yapılacak iş çoğunlukla sınıflandırmadır — parametrelerinizi doğru eksene ayırmak — ve ardından iç içe bir döngü gelir:
- Her parametreyi, sizi neyi yeniden hesaplamaya zorladığına göre etiketleyin. Değiştirmek bir gösterge/öznitelik dizisini değiştiriyorsa pahalıdır. Yalnızca sabit dizilere uygulanan bir karşılaştırmayı, eşiği veya boyutlandırma kuralını değiştiriyorsa ucuzdur. Kararsız kaldığınızda şunu sorun: bu parametre göstergenin tanımının herhangi bir yerinde geçiyor mu? Geçmiyorsa ucuzdur.
- Önbelleği yalnızca pahalı eksenle anahtarlayın. Öznitelik inşasını gösterge parametrelerine göre memoize edin (
SignalCachenesnesinin(period, hma_length)ile yaptığı gibi). Bir gösterge kombinasyonunu paylaşan bitişik denemeler, aynı dizileri artık bedavaya yeniden kullanır. - Ucuz ekseni önbelleklenmiş öznitelikler üzerinde toplu çalıştırın. Eşik konfigürasyonlarını tam yeniden değerlendirmeler olarak değil, önceden hesaplanmış sinyaller üzerinde sıkı bir derlenmiş döngü olarak koşturun. Verimliliğiniz — bizim durumumuzda ~5,600 cfg/s — buradan gelir.
- Döngüleri iç içe geçirin: pahalı dışta, ucuz içte. Pahalı ızgarayı küçük ve bilinçli tutun (kaba, ya da kabadan inceye); ucuz tarama yoğun olsun. Bütçeyi, parametrelerin bir maliyeti olduğu yerde harcayın.
- Deneme bütçesini saate göre değil, aşırı uyuma göre belirleyin. Artık sınır saat olmadığına göre, sınırı söndürülmüş Sharpe / PBO koysun. İstatistiksel olarak kaç ucuz eksen denemesini karşılayabileceğinize karar verin ve kazananı örneklem dışında doğrulayın.
Mühendislik kazanımı ve istatistiksel korkuluk, tek bir fikrin iki yüzüdür: eksenleri ayırmak, ucuz boyutları kapsamlı biçimde aramanıza izin verir — sonrasında ne kadar kapsamlı aradığınızı iskonto etmek zorunda olmanızın nedeni de tam olarak budur.
Çıkarımlar
- Tüm boyutlar aynı maliyette değildir. Bir stratejinin parametreleri pahalı bir eksene (göstergeler — tüm seri üzerinde yeniden hesaplanır) ve ucuz bir eksene (eşikler — önceden hesaplanmış sinyaller üzerinde O(n) bir geçiş) ayrılır. Bizim motorumuzda bu, üçlü-TF için 6 pahalı + 12 ucuz, çift-TF için 4 + 8 demektir.
- Göstergeler eşiklerden bağımsızdır ve optimizasyonun tamamı bu değişmezliktir. Öznitelik inşası yalnızca gösterge parametrelerine bağlıdır; dolayısıyla bir kez kurar,
(period, hma_length)ile önbelleğe alır ve kombinasyonu paylaşan her eşik konfigürasyonunda yeniden kullanırsınız. - Ucuz eksen ~1,600x daha ucuza çalışır. Önbelleklenmiş sinyaller üzerinde saniyede ~5,600 eşik konfigürasyonu (her biri ~180 µs); göstergeleri her seferinde yeniden kurarsanız konfigürasyon başına ~0.3 s. Aynı doğruluk — tek fark, bir değişmezi yeniden hesaplamayı reddetmek.
- Boyutluluk laneti aslında pahalı boyutluluğun lanetidir. Parametre sayısının çoğu, taranması neredeyse bedava olan eksende yaşar. Pahalı ızgarayı kaba tutun; ucuz olanda cömert olun.
- Hız, bağlayıcı kısıtı hesaplamadan istatistiğe kaydırır. Yoğun ve hızlı bir tarama, bir çoklu test makinesidir. Deneme sayısına göre söndürün, fold başına doğrulayın ve zirveler yerine platoları tercih edin — bedava öğle yemeği gerçektir, ama istatistik faturası isteğe bağlı değildir.
Motorun tamamı — SignalCache, sweep_separations, sızıntısız çoklu-TF simülasyonu ve onu canlı oluşan-mum semantiğine sabitleyen eşdeğerlik testi — backtester'ımızdaki scripts/engine_multitf.py dosyasında yaşıyor (commit bfc8aaa). Bir dahaki sefere biri size 18 parametreli bir stratejinin aranamayacak kadar büyük olduğunu söylediğinde, ona bu parametrelerin kaçının gerçekten göstergeleri oynattığını sorun. Genellikle üçte biridir; gerisi neredeyse bedavadır.
Yazarlar
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.