En 20-dagers Donchian ser harmløs ut i en spesifikasjon. Agenten skriver en 20-bars rullende maks, backtesten starter på rad én i parquet-filen, og de første to ukene er «20-dagers høyeste» bare den løpende maksen av de barsene som finnes. På dag fire er det et firedagers høyeste. Strategien du trodde du testet, er ikke den som produserte de første dusin fyllingene.
Jeg har en notebook med ETHUSDT-dagsbars der Sharpe for hele utvalget er 1.4. Kutt de første 20 sesjonene, og den faller til 0.6. Behold de 20 og dropp resten av det første året, og den printer 3.1. Ingen lekket morgendagen. Strategien brukte fortiden, bare ikke nok av den, og rapporten behandlet de halvferdige handlene som bevis.
La vinduet handle mens det fortsatt fylles
Det vanlige havariet er min_periods=1. Pandas beregner et rullende gjennomsnitt på en enkelt bar hvis du lar det. Agenter gjør dette hele tiden, fordi en NaN øverst i framen føles som en bug, og å fylle den gjør at enhetstesten blir grønn.
Et 20-dagers realized-vol-mål med to observasjoner av avkastning er en størrelseseksplosjon. Variansen av to tall er et myntkast, du inverterer den, og den første posisjonen er flere ganger den tiltenkte risikoen. En z-score mot et standardavvik nær null gjør det samme trikset med et fortegn: strategien ser ut til å ha en knivskarp inngang som aldri viser seg igjen når vinduet er ærlig.
Breakouts er verre, fordi de ser ut som den ekte regelen. En 20-bars kanal på bar seks er en seks-bars kanal. Du får en klynge handler helt i starten, ofte i en stille periode som ikke ville ha utløst den ferdige indikatoren. Stille markeder driver litt. En trang kanal fyrer. Equity-kurven får et forsprang som ingen senere år gjentar.
Zero-fill og forward-fill dikter opp en annen løgn. RSI på 0 leses som oversolgt. En manglende ATR på 0 sprenger enhetsstørrelsen, og backtesten kjøper pliktskyldig et helt lager. Jeg vil heller at en NaN dreper ordren enn at en 0 dikter opp en.
Jeg tar meg fortsatt i å plotte fra rad 0 fordi en blank måned til venstre i diagrammet ser uferdig ut. Den blanke måneden er den ærlige delen.
Beskjær equity-kurven, behold posisjonen
Denne overlever kodegjennomgang. Du beregner 20-dagers-featurene skikkelig, dropper de første 20 radene fra den plottede kurven, og publiserer fra 21. januar. Posisjonen 21. januar ble åpnet 14. januar. Trailing stopens høyvannsmerke, pyramideringstellingen, kontantene etter de burn-in-handlene: alt sammen vandret inn i det «rene» utvalget.
Havariet er en papirstrategi som ikke kan startes på datoen i artikkelen. Start på nytt fra flat på den rapporterte starten, og ordrene den første uken samsvarer ikke. Noen ganger er backtesten allerede i en handel papirsystemet ikke har grunn til å gå inn i. Noen ganger går papirsystemet inn fordi lookbacken er kald, og backtesten sitter utenfor fordi den skjulte måneden allerede tok breakouten. To åpningsbøker, én publisert startdato.
Walk-forward-folder gjør dette i det stille. Hvert testvindu har en lookback-hale du ikke plotter. Hopp over å simulere den halen, og de første testhandlene er handler fra uferdige vinduer igjen. Simuler den og rapporter bare testdagene, og testdagens posisjon er betinget av fyllinger du ikke viser. Den andre versjonen kan være et legitimt forskningsvalg. Å kalle foldens første morgen en kald start, mens en trailing stop allerede er live fra halen, er hvordan to forskere får to Sharpe-verdier ut av én config.
Varm opp i kalenderdager når featuren ikke er en dag
«Gi den 30 dager» lar featuren være underspesifisert. Tretti kalenderdager på en 5-minutters Donchian er tusenvis av bars forbi en 20-perioders lookback. Tretti dager på en daglig feature som trenger 20 sesjoner er enten feit eller tynn, avhengig av helger og hull.
En funding-rate-z-score på en av perp-børsene våre fikk 30 dagers oppvarming fordi spesifikasjonen sa 30 perioder og noen oversatte perioder til kalender. Funding printer der hver åttende time. Tretti dager er omtrent 90 oppgjør. Tretti perioder er ti dager. De ekstra to månedene med burn-in inkluderte tilfeldigvis en depeg-uke. Å droppe den fikk live-vinduet til å se roligere ut enn strategiens virkelige historikk. Folk skyldte på startdato-sensitivitet. Oppvarmingen hadde spist regimet.
Og krypto versus aksjer gjør at det samme tallet skifter betydning uten at noen redigerer en parameter. Tjue «dager» med ETH inkluderer lørdager. Tjue aksjesesjoner er nesten en kalendermåned. Kopier en 20-dagers lookback fra en aksje-notebook over på timevise perpetual-candles, og du har en 20-timers kanal med et 20-dagers navn. Den første gyldige baren er da enten 20 timer inn, eller 20 dager inn hvis en senere funksjon resampler, og jeg har sett begge i samme agent-diff.
Spikre det første handelsbare tidsstempelet
Oppvarmingen er et datakrav, ikke et bonusutvalg. Hver feature angir antallet ferdige observasjoner den trenger, i enhetene den beregnes i. Det første handelsbare tidsstempelet er den første baren der alle disse er sanne og en flat konto ville ha fått lov til å sende en ordre.
| Feature | Hva spesifikasjonen vanligvis sier | Hva som faktisk må finnes | Stille erstatning |
|---|---|---|---|
| 20-dagers Donchian | 20 daglige høyeste | 20 fullførte sesjoner | Løpende maks med min_periods=1 |
| 30-dagers realized vol | 30-dagers vindu | 30 close-to-close-avkastninger | Todagers varians, invertert til størrelse |
| 20-print funding-z-score | 20 dager | 20 funding-oppgjør | 20 kalenderdager (~90 prints), eller 20 bars på feil tidsramme |
| 14-perioders RSI på 5m | 14 perioder | 14 lukkede femminutters bars | 14 dager, eller 14 bars med hull som er forward-filled |
P&L før det tidsstempelet holdes utenfor track recorden. Tilstand før det tidsstempelet kan fortsatt trenge å simuleres, slik at en trailing stop eller en cooldown er reell når klokken treffer den første handelsbare baren, men de fyllingene går ikke inn i Sharpe, handelsantallet eller kapasitetsregnestykket. Kjør deretter den stygge sjekken: start på nytt fra flat på det tidsstempelet, med lookbacken tilgjengelig kun som data. Hvis ordrene endrer seg, sendte du skjulte handler.
Papirhandel starter på samme kontrakt. Det samme gjør hvert walk-forward-testvindu. Hvis diagrammet ser ut som det mangler en måned, la den mangle.
← Alle innlegg


