20denní Donchian ve specifikaci vypadá neškodně. Agent napíše 20barový rolling max, backtest začne na prvním řádku parquet souboru a první dva týdny je „20denní high“ jen running max z barů, které zrovna existují. Čtvrtý den je to čtyřdenní high. Strategie, o které jste si mysleli, že ji testujete, není ta, která vyprodukovala prvních tucet fillů.
Mám notebook na denních barech ETHUSDT, kde je full-sample Sharpe 1.4. Uřízněte prvních 20 seancí a klesne na 0.6. Nechte těch 20 a hoďte zbytek prvního roku a vytiskne 3.1. Nikdo neleaknul zítřek. Strategie používala minulost, jen jí nebylo dost, a report ty napůl zformované obchody bral jako důkaz.
Nechte okno obchodovat, dokud se ještě plní
Typická spoušť je min_periods=1. Pandas spočítá rolling mean i z jednoho baru, pokud mu to dovolíte. Agenti to dělají pořád, protože NaN nahoře ve framu působí jako bug a vyplnit ho znamená, že unit test zezelená.
20denní realized-vol target se dvěma pozorováními výnosu je explozí size. Variance dvou čísel je hod mincí, invertujete ji a první pozice je několikanásobek zamýšleného rizika. Z-score vůči téměř nulové směrodatné odchylce udělá stejný trik se znaménkem: strategie vypadá, že má břitký vstup, který se už nikdy neobjeví, jakmile je okno poctivé.
Breakouty jsou horší, protože vypadají jako skutečné pravidlo. 20barový kanál na šestém baru je šestibarový kanál. Hned na začátku dostanete shluk obchodů, často v klidném úseku, který by dokončený indikátor nespustil. Klidné trhy trochu driftují. Úzký kanál vystřelí. Equity křivka dostane náskok, který žádný pozdější rok nezopakuje.
Zero-fill a forward-fill vymýšlejí jinou lež. RSI na 0 se čte jako přeprodané. Chybějící ATR s hodnotou 0 vyhodí unit size a backtest poslušně koupí skladiště. Radši ať NaN zabije order, než aby 0 nějaký vymyslelo.
Pořád se přistihnu, že vykresluju od řádku 0, protože prázdný měsíc vlevo na grafu vypadá nedokončeně. Prázdný měsíc je ta poctivá část.
Ořízněte equity křivku, pozici si nechte
Tahle projde code review. 20denní features spočítáte pořádně, z vykreslené křivky zahodíte prvních 20 řádků a publikujete od 21. ledna. Pozice 21. ledna se otevřela 14. ledna. High-water trailing stopu, počet pyramid, cash po těch burn-inech: to všechno vešlo do „čistého“ vzorku.
Spoušť je paper strategie, kterou nejde spustit k datu z write-upu. Restartujte z flat na reportovaném začátku a ordery z prvního týdne se neshodují. Někdy je backtest už v obchodu, do kterého paper systém nemá důvod vstoupit. Někdy paper systém vstoupí, protože jeho lookback je studený, a backtest sedí mimo, protože jeho skrytý měsíc už breakout vzal. Dvě otevírací knihy, jedno publikované datum startu.
Walk-forward foldy to dělají potichu. Každé testovací okno má lookback ocas, který nevykreslujete. Přeskočte simulaci toho ocasu a první testovací obchody jsou zase obchody z nedokončeného okna. Nasimulujte ho a reportujte jen testovací dny a pozice v testovací den je podmíněná filly, které neukazujete. Ta druhá verze může být legitimní výzkumná volba. Nazvat první ráno foldu cold startem, zatímco trailing stop už běží z ocasu, je způsob, jak dva výzkumníci dostanou dva Sharpy z jedné konfigurace.
Zahřívejte v kalendářních dnech, když feature není den
„Dejte mu 30 dní“ nechává feature nedourčenou. Třicet kalendářních dní u 5minutového Donchiana je o tisíce barů víc než 20periodový lookback. Třicet dní u denní feature, která potřebuje 20 seancí, je buď tlusté, nebo tenké, podle víkendů a děr.
Funding-rate z-score na jednom z našich perp venues dostal 30denní warmup, protože spec říkal 30 period a někdo periody přeložil na kalendář. Funding tam printuje každých osm hodin. Třicet dní je asi 90 settlementů. Třicet period je deset dní. Extra dva měsíce burn-inu náhodou obsahovaly týden depegu. Když jsme ho vynechali, live okno vypadalo klidněji než skutečná historie strategie. Lidi to svalili na citlivost na datum startu. Warmup sežral režim.
A krypto versus equity změní stejnému číslu význam, aniž by kdokoli editoval parametr. Dvacet „dní“ ETH zahrnuje soboty. Dvacet equity seancí je skoro kalendářní měsíc. Zkopírujte 20denní lookback z akciového notebooku na hodinové perpetual svíčky a máte 20hodinový kanál s 20denním názvem. První validní bar je pak buď 20 hodin od začátku, nebo 20 dní od začátku, pokud nějaká pozdější funkce resampluje, a obojí jsem viděl ve stejném agent diffu.
Zafixujte první obchodovatelný timestamp
Warmup je datový požadavek, ne bonusový vzorek. Každá feature uvede počet dokončených pozorování, která potřebuje, v jednotkách, ve kterých se počítá. První obchodovatelný timestamp je první bar, kde to všechno platí a flat účet by směl poslat order.
| Feature | Co spec obvykle říká | Co ve skutečnosti musí existovat | Tichá náhražka |
|---|---|---|---|
| 20denní Donchian | 20 denních high | 20 dokončených seancí | Running max s min_periods=1 |
| 30denní realized vol | 30denní okno | 30 close-to-close výnosů | Dvoudenní variance, invertovaná do size |
| 20printový funding z-score | 20 dní | 20 funding settlementů | 20 kalendářních dní (~90 printů), nebo 20 barů špatného timeframu |
| 14periodové RSI na 5m | 14 period | 14 uzavřených pětiminutových barů | 14 dní, nebo 14 barů s mezerami forward-filled |
P&L před tím timestampem zůstává mimo track record. Stav před tím timestampem možná pořád musíte simulovat, aby trailing stop nebo cooldown byly reálné, když hodiny udeří na první obchodovatelný bar, ale ty filly nejdou do Sharpu, počtu obchodů ani do capacity math. Pak spusťte ošklivou kontrolu: restart z flat na tom timestampu, s lookbackem dostupným jen jako data. Pokud se ordery změní, shipovali jste skryté obchody.
Papírové obchodování startuje na stejném kontraktu. Stejně tak každé walk-forward testovací okno. Pokud graf vypadá, že mu chybí měsíc, nechte ho chybět.
← Všechny články


