En backtest kan vise et fill til en pris, som markedet aldrig har vist. Som regel har simulatoren udledt en plausibelt udseende eksekvering ud fra ufuldstændige data: en bars high og low, en midtkurs eller en limitpris, som én handel ramte. Det kan få handelsloggen til at se præcis ud, mens den skjuler, hvad markedet faktisk tilbød.
Start med at spørge, hvilken pris din ordre kunne have handlet mod. En bar med seneste handelspriser fortæller, hvilke priser der blev handlet til i løbet af et interval. Den fortæller ikke, hvad bid og ask var, da din ordre ankom, hvor meget der var tilgængeligt dér, eller om din ordre kunne komme forrest i køen.
Hvorfor viser min backtest et fill uden for markedsprisen?
Vær først præcis om, hvad du mener med “uden for”. Et køb under barens low eller et salg over dens high er en åbenlys regnskabs- eller tidsfejl. Et fill inden for high-low-intervallet kan stadig være fiktivt: Prisen kan være handlet, før ordren fandtes, på den anden side af spreadet eller i en mængde, der var for lille til at udføre din ordre.
Forestil dig en 1-minutsbar med en open på 100.00, en low på 99.80 og en close på 100.10. Din strategi ser den afsluttede bar, sender en købsordre, og simulatoren udfører den til 99.80. Det low kan være forekommet tæt på minuttets begyndelse, 50 sekunder før signalet. Baren giver ingen indikation af, at 99.80 var tilgængelig efter beslutningen.
| De data, du har | Hvad de fastslår | Hvad de ikke kan fastslå |
|---|---|---|
| OHLCV-bar | Observeret interval for handelspriser og volumen i et tidsrum | Prisrækkefølge, bid og ask eller tilgængelighed ved ordrens ankomst |
| Handelsprints | Rapporterede handler med tidsstempler og priser | Passiv likviditet eller din plads i køen |
| Top-of-book-quotes | Bedste viste bid og ask på udvalgte tidspunkter | Dybde ud over det bedste niveau, eller om en quote fortsatte mellem målingerne |
| Ordrebogshændelser | Ændringer i vist dybde og køhændelser, afhængigt af feedets dækning | Skjult likviditet, adgang til handelsstedet eller garanteret prioritet |
En anden almindelig årsag er, at man forveksler midtkurs med eksekverbare priser. Hvis quoten er 99.99 bid og 100.01 ask, ser et køb til midtkursen 100.00 pænt ud i en rapport. Et marketable køb betaler som regel ask-prisen plus en eventuel priseffekt fra ordrestørrelsen. Når man kalder midtkursen et fill, fjerner man lydløst halvdelen af spreadet.
Kan en limitordre blive udført, bare fordi markedet ramte dens pris?
Et pris-touch viser, at der blev registreret en handel til limitprisen. Det beviser ikke, at din hvilende ordre ville være blevet udført. Hvis andre ordrer lå foran din, kan handelsvolumen til den pris have været for lille til at nå din position i køen. Handlen kan også være sket på et andet handelssted, mens din ordre lå et andet sted.
Antag, at din købslimit er 50.00, og at markedet handler 200 aktier til den pris, efter du har lagt ordren. En simulator baseret på pris-touch udfører alle 500 aktier. En mere forsigtig model spørger, hvor meget der blev handlet til eller under 50.00 efter ankomsten, og tager derefter højde for den estimerede kø foran ordren. Uden ordreniveau-data fra ordrebogen er køen en antagelse. Den bør fremgå tydeligt af resultaterne, ikke sniges ind som en sikkerhed.
I et mindre researchsystem vil jeg hellere gøre antagelsen tydelig og teste et interval end lade, som om candle-data afslører køprioritet. Det rette interval afhænger af handelssted, ordrestørrelse og hvor ofte strategien handler. En rolig aktie ved åbningen og en tyndt handlet kryptokontrakt kl. 03:00 UTC giver forskellige eksekveringsproblemer.
Hvordan vælger jeg en fill-model til bar-data?
Tilpas modellen til både dataene og det, strategien hævder. En barbaseret backtest kan stadig være nyttig til langsomme strategier, men dens fills skal respektere, hvad barerne faktisk viser.
- Fastlæg beslutnings- og ankomsttidspunkter. Hvis et signal bruger barens close, skal ordren sendes efter denne close. Simulér eksekveringen ud fra det næste tilgængelige interval eller den næste quote, ikke ud fra barens tidligere low.
- Brug den rigtige side af spreadet. For marketable køb skal du starte ved ask; for salg ved bid. Hvis du kun har handelsbarer, skal du estimere spreadet ud fra en separat kilde eller oplyse, at modellen udelader det.
- Begræns fills til plausibel likviditet. Sæt en deltagelsesgrænse i forhold til den observerede volumen, og medregn gebyrer og priseffekt. En bars samlede volumen betyder ikke, at det hele var tilgængeligt til den pris, du valgte.
- Test antagelserne under pres. Sammenlign fills ved næste åbning med konservativ slippage, og undersøg, om resultatet holder ved dårligere eksekvering. Justér ikke fill-modellen, indtil strategien vinder.
Det er modelvalg, ikke en opskrift på at genskabe det ene sande fill ud fra ufuldstændige data. Hvis strategien afhænger af at hente nogle få basispoint, er bar-data måske ikke tilstrækkeligt belæg for den påstand.
Hvordan finder jeg ud af, hvor det umulige fill kom ind i backtesten?
Følg én mistænkelig handel fra signal til regnskab. Registrér beslutningens tidsstempel, tidspunktet for ordreafgivelse, simuleret ankomst, den valgte markedsobservation, fill-pris, fill-mængde og gebyr som separate felter. Kontrollér derefter følgende i rækkefølge:
- Blev featureværdien beregnet ud fra data fra en bar, der endnu ikke var afsluttet på beslutningstidspunktet?
- Brugte fill-modellen barens high, low eller close, selvom prisen forekom, før ordren ankom?
- Blev et køb matchet med bid eller et salg med ask?
- Oversteg den simulerede mængde den tilgængelige quote-størrelse eller modellens deltagelsesgrænse?
- Blev prisafrunding, kontraktens tick-størrelse og gebyrer anvendt, efter fill-prisen var valgt?
Hvis du ikke kan besvare de spørgsmål ud fra handelsregistreringen, mangler backtesten dokumentation for eksekveringen. Tilføj felterne, gennemgå en håndfuld handler manuelt mod rådataene, og kontrollér, at det rapporterede fill kunne være sket med den model, du havde tænkt dig. En pæn aktiekurve afslører ikke en pris, der kun fandtes inde i simulatoren.
← Alle indlæg


