4. september 2026 · järeltestimine

Nii stop kui ka siht olid sama küünla sees. Kumba neist sinu järeltest eelistas?

Nii stop kui ka siht olid sama küünla sees. Kumba neist sinu järeltest eelistas?

Ostupositsioon alates 84,120. Stop 84,036 juures, siht 84,271 juures. Järgmise minuti küünal: avamishind 84,118, kõrgeim 84,290, madalaim 84,010, sulgemishind 84,240.

Mõlemad tasemed jäävad selle küünla sisse. Stop sai puudutatud ja siht sai puudutatud, ent neli OHLC-numbrit ei anna täpselt mitte mingit teavet selle kohta, kumb juhtus esimesena. Sinu järeltest andis ikkagi tulemuse. Kusagil tsüklis otsustas üks koodirida — tõenäoliselt selline, mida sa selle kirjutamise ajal modelleerimiseelduseks ei pidanud.

See on lühikese horisondiga strateegiates suurim võltsitud tootluse allikas, mida ma näen — olulisem kui tasud ja libisemine —, sest see ei näi eeldusena. See näib tehnilise teostusena.

Vale viis nr 1: lase if-ahelal otsustada

Tüüpiline ülesehitus:

if bar.high >= target:
    exit(target, "tp")
elif bar.low <= stop:
    exit(stop, "sl")

Keegi ei valinud teadlikult varianti „siht lahendatakse enne stoppi“. Sihti kontrolliv kood kirjutati lihtsalt esimesena, sest see on soovitud stsenaarium ja see oli sul mõttes. Kui vahetad harude järjekorra, muutub tootluskõver; juba see peaks ütlema, et strateegia kasum ja kahjum sõltub osaliselt sinu koodiredaktorist.

Testisin teadlikult üsna tavalist keskmise juurde naasmise skalpimisstrateegiat BTCUSDT perpetual-lepingul: 3 kuud 1-minute küünlaid ja 4,812 tehingut, stop 0.10% ning siht 0.18% sisenemishinnast. Samad signaalid, samad tasud, muutus ainult viigimurdmise reegel.

12.6%tehingutest tabas mõlemat taset ühe küünla sees
2.31Sharpe, siht lahendatakse esimesena
0.18Sharpe, stop lahendatakse esimesena
0.94Sharpe, lahendatud 1-second küünlate põhjal

Kaheksandik tehingutest määrab kogu tulemuse. Nii toimibki tiheda stopi ja sihi paar: mitmetähenduslikes tehingutes liikus hind mõlemas suunas, nagu juhtub enamiku huvitavate juhtumite puhul, ning iga selline tehing võib sõltuvalt mündiviskest anda kogu stopi ja sihi vahe ulatuses kasumi või kahjumi. 12.6% tehinguid × 0.28% vahe on 3.5% brutonominaalkäibest valimiühiku kohta, mis ületab strateegia tegeliku eelise mäekõrguselt.

See määr sõltub küünla pikkusest võrreldes tasemete vahega ja halveneb kiiresti, kui küünlad pikenevad. Sama stop ja siht, samad signaalid, erinevaks ajavahemikuks koondatud andmed:

Küünla intervallTehingud, mille puhul mõlemad tasemed jäid ühe küünla sisseSharpe (siht esimesena)
1s0.3%0.91
1m12.6%2.31
5m34%3.60
15m49%4.42
1h71%5.88

Vaata, mida see tabel tegelikult näitab. Jämedama ajavahemikuga küünlad muutsid järeltesti paremaks. Iga uurija arvaks, et tunniküünlad on konservatiivsem valik: vähem müra, vähem turu mikrostruktuuri ületreenimist. Aga kui küünlasisene reegel lahendab olukorra sinu kasuks, on jämedam küünal lihtsalt suurem kast, mille sees saad eeldada, et sul vedas. 1h küünaldel on 7 tehingut 10-st puhtalt kokkuleppe küsimus. See järeltest ei kontrolli strateegiat, vaid 2 `if`-lause järjekorda 3,400 korral.

Vale viis nr 2: eelda, et stop täideti stop-hinnaga

Oletame, et fikseerid järjekorra. Stop lahendatakse esimesena, arvestad täpselt 0.10% kahjumit pluss taker-tasu ja tunned, et oled põhjalik. Ometi on endiselt 2 eri probleemi.

Esimene on see, et stop on käivitaja, mitte täitmine. Binance USDⓈ-M-is muutub STOP_MARKET-korraldus käivitustingimuse täitumisel kohe turukorralduseks ning ostab või müüb ära selle, mis orderbook'is saadaval on. Vaiksel minutil tähendab see paari ticki jagu libisemist. Minutil, mil stop päriselt käivitus — sellel, mille küünla keha oli 40 punkti ja mille all toimus likvideerimiste ahelreaktsioon — on orderbook hõre just sellel poolel, kust sa tehingusse sisened. Minu valimis oli tick-andmetest stop-käivitusi sobitades mediaanne täitmishind käivitushinnast 1.4 bps võrra kehvem ning 95. protsentiil 11 bps. 10 bps stopi puhul võtab saba ära lisanduva kümnendiku riskist, mida arvasid endale määranud olevat.

Teine probleem on peenem ja perpetual-lepingute puhul iseäralik: milline hind selle käivitab. Binance'i vaikeseadistuses käivitab stop-korraldused mark price ning mark price arvutatakse indeksi ja silutud baasi põhjal, mitte selle platvormi viimasest tehinguhinnast. Sinu OHLC-ajasari kajastab viimast hinda. Need on erinevad andmeread ja lähevad kõige rohkem lahku just nende sündmuste ajal, mis stoppe käivitavad.

Viimane hind (sinu kline-andmed)Mark price (vaikimisi käivitushind)
Allikasselle platvormi tehingudmitme platvormi indeks + baas
Varju käituminetäielik hinnakõikuminetugevalt summutatud
Tüüpiline lahknevus1–3 bps vaiksel ajal, 20–35 bps likvideerimisahela minutis
Mõju järeltestilestopid, mis käivitusid, kuigi poleks pidanud, ja vastupidi

Seega sulgeb viimase hinna andmereal olev 25 bps hinnavarju tõttu järeltest positsiooni, kuigi live-kauplemises ei jõudnud mark price sinu käivitustasemest 10 bps kauguselegi. Või juhtub vastupidi päeval, mil indeks liigub ja sinu platvorm jääb maha. Kui määrad workingType väärtuseks CONTRACT_PRICE, joondad live-käitumise vähemalt oma andmetega ning uurijale on see tavaliselt õige valik, sest mark price'i käivituse aus simuleerimine tähendab teise andmerea läbiviimist kogu täitmismootorist.

Mulle jäi sellest kõige paremini meelde üks juhtum: keegi meie tiimist „parandas“ strateegiat, nihutades kasumivõtu taseme 0.18%-lt 0.21%-le. Sharpe tõusis 2.3-lt 3.1-le. Mingit uut eelist polnud. Siht oli lihtsalt liikunud 1-minute hinnavarte jaotuse tihedast osast väljapoole, nii et vähem tehinguid sattus mitmetähenduslikku rühma, kus kood neile märkamatult võidu kinkis. Nad olid viigimurdmise reegli optimeerinud.

Vale viis nr 3: eelda alati halvimat ja nimeta seda konservatiivseks

Vaistlik lahendus on pessimism. Kui puudutati mõlemat taset, võta stop. Tehtud, optimismi enam pole, lase käiku.

Ma tegin varem nii. See on parem kui teine variant, kuid endiselt vale — 2 põhjusel.

See tapab strateegiad, mis tegelikult toimivad. Selle strateegia puhul läks 12.6% tehingute pessimistlik lahendamine maksma 2.1 Sharpe'i punkti võrreldes tick-andmetel põhineva tulemusega 0.94. Kui tegelik näitaja on 0.94, kuid sinu reegel annab 0.18, viskad idee kõrvale ja hakkad tegelema millegi kehvemaga. Konservatiivsus, mis eksib 2 Sharpe'i punkti võrra, pole konservatiivsus, vaid müra, millele on antud moraalne hoiak.

Veel hullem, see rikub optimeerimise. Anna parameetrite läbivaatusele pessimistlik viigimurdmisreegel ning optimeerija õpib mitmetähenduslikkust vältima, sest sellest on nüüd saanud puhas karistus. See liigub laiade stoppide ja lähedaste sihtide või aeglaste küünlate poole, mille puhul need 2 taset harva samal ajal esinevad, ning pakub sulle parameetreid, mis on valitud sinu täitmisreegli, mitte turu põhjal. See on sama viga nagu soosiva variandi puhul, ainult vastupidise mõjuga — ning kasumiaruandest sama raskesti märgatav.

Rusikareegel, mida rakendame enne kõike muud: kui stop_distance + target_distance on väiksem kui sinu küünla intervalli hinnavahemiku 75. protsentiil, mõjutab küünlasisene eeldus kasumit ja kahjumit rohkem kui sinu signaal. Arvuta mõlemad näitajad. Selleks kulub 4 koodirida ja see on strateegiate ülevaatused lõpetanud rohkem kui ükski teine üksik kontroll.

Mis päriselt toimib

Küünlasisene hinnateekond on andmestik. Hangi see või piira selle puudumise mõju.

  1. Lahenda olukord kõige detailsema kättesaadava andmerea põhjal. Binance'i aggTrades asjakohaste minutite kohta sisaldab mõnisada rida ja vastab küsimusele lõplikult: kumba taset puudutati esimesena ja mis hinnaga tehingu käigus täideti. Tick-andmeid pole vaja kogu järeltesti jaoks, ainult mitmetähenduslike küünalde jaoks. Minu valimis oli selliseid minuteid 606 kokku 129,600-st. See on väike allalaadimine, mitte taristuprojekt.
  2. Kui tick-andmed pole saadaval, kasuta ainult olukorra lahendamiseks 1 või 2 astme võrra lühemat ajavahemikku. Signaalid 15m põhjal, väljumised lahendatakse 1s või 1m küünalde abil. Mitmetähenduslike juhtude osakaal langeb 49%-lt murdosani protsendist ning ülejäänud osa on piisavalt väike, et seda ausalt eirata.
  3. Näita alati vahemikku. Käivita iga järeltest 2 korda, optimistliku ja pessimistliku lahendusega, ning kuva mõlemad Sharpe'i näitajad kõrvuti lahendatud tulemusega. See vahemik mõõdab küünasisest määramatust ja kuulub tulemuste lehele Sharpe'i näitaja usaldusvahemiku kõrvale. Kui vahemik on 0.2–2.3, pole ükski selle sisse jääv järeldus päriselt usaldusväärne.
  4. Jälgi mitmetähenduslike juhtude määra põhinäitajana. Meil on see iga strateegiakaardi ülaosas, tehingute arvu ja käibe kõrval. Kui määr ületab umbes 5%, uurid tegelikult väljumisloogikat, mitte sisenemisloogikat.
  5. Modelleeri käivitus ja täitmine eraldi. Käivita stop selle hinnasarja põhjal, mida platvorm tegelikult kasutab; täida see käivitushinnale liidetud, turuandmete põhjal kalibreeritud libisemisega, mitte käivitushinnaga.

Aktsiaturul on sama probleem, lihtsalt teisel kujul. Kui aktsia sulgub hinnaga 62.00 ja avaneb üleöö hinnaga 58.40, ei täitu stop hinnaga 62.00, vaid kusagil avamishinnast madalamal. Päevaküünlaid kasutav järeltest, mis arvestab hinnavahest läbi liikunud positsioonide puhul libisemiseks −$0.00, ütleb rõõmsalt, et stop-loss-kiht vähendas langust. Ei vähendanud. Seda lihtsalt ei testitud päevadel, mil see kõige olulisem oli. Sama juhtub kauplemispeatustega: su stop täidetakse tegelikult uuesti avamise oksjonil hinnaga, mida küünla madalaim väärtus ei näita.

See pole midagi keerulist. Küünal on kokkuvõte ja stopi ning sihi strateegia panustab nende sündmuste järjekorrale, mille kokkuvõte kõrvale jättis. Kui paberkauplemise mootor lõpuks strateegiat reaalajas turuandmetel käivitab, on neil andmetel sündmuste järjekorra kohta oma vastus ning neid pole kordagi huvitanud, kumma if-lause sa esimesena kirjutasid.

küünlasisesed täitmisedstop-korraldusedjäreltestiminekrüptofutuuridturu mikrostruktuur
← Kõik postitused