Dolga pozicija pri 84,120. Stop pri 84,036, cilj pri 84,271. Prikaže se sveča naslednje minute: odprtje 84,118, vrh 84,290, dno 84,010, zaprtje 84,240.
Obe ravni sta znotraj te sveče. Stop je bil dosežen in cilj je bil dosežen, štiri vrednosti OHLC pa ne vsebujejo prav nobene informacije o tem, kaj se je zgodilo prej. Vaš backtest je vseeno vrnil številko. Nekje v zanki je neka vrstica odločila — verjetno vrstica, za katero ob pisanju niste pomislili, da je predpostavka modela.
To je največji posamezni vir navidezne uspešnosti, kar jih opažam pri strategijah s kratkim horizontom; prekaša tako provizije kot zdrs, ker ni videti kot predpostavka. Videti je kot tehnična podrobnost.
Napačen pristop št. 1: odločitev prepustite verigi if
Običajna oblika:
if bar.high >= target:
exit(target, "tp")
elif bar.low <= stop:
exit(stop, "sl")
Nihče se ni odločil, da »se najprej izvršijo cilji«. Preverjanje cilja je bilo pač vpisano prvo, ker je to običajna pot in ker ste razmišljali o njej. Zamenjajte vrstni red obeh vej in krivulja kapitala se spremeni; že to bi vam moralo povedati, da je dobiček in izguba strategije deloma odvisen od vašega urejevalnika kode.
Na BTCUSDT perp sem preizkusil povsem običajno skalpersko strategijo povratka k povprečju: trimesečne 1-minutne sveče, 4,812 poslov, stop 0.10% in cilj 0.18% od vstopne cene. Isti signali, iste provizije, spremenil se je samo dogovor za razrešitev neodločenega izida.
Osmina poslov nosi celoten rezultat. To je matematika tesnega para stopa in cilja: pri dvoumnih poslih se je cena gibala v obe smeri, kar velja za večino zanimivih primerov, vsak tak posel pa je glede na met kovanca vreden celotne razdalje med stopom in ciljem. 12.6% poslov × 0.28% razpona pomeni 3.5% bruto nominalnega prometa na enoto vzorca, kar močno presega dejansko prednost strategije.
Stopnja je odvisna od velikosti sveče glede na razmik med ravnema in se hitro poslabša, ko podaljšujete interval sveč. Isti stop in cilj, isti signali, drugačna agregacija:
| Interval sveč | Posli z obema ravnema znotraj ene sveče | Sharpe (najprej cilj) |
|---|---|---|
| 1s | 0.3% | 0.91 |
| 1m | 12.6% | 2.31 |
| 5m | 34% | 3.60 |
| 15m | 49% | 4.42 |
| 1h | 71% | 5.88 |
Poglejte, kaj ta tabela v resnici pove. Grobejše sveče so izboljšale backtest. Raziskovalci običajno menijo, da so urne sveče konservativna izbira: manj šuma, manj prilagajanja mikrostrukturi. Toda če se neodločen izid znotraj sveče razreši v vašo korist, je grobejša sveča le večja škatla, v kateri lahko predpostavite, da ste imeli srečo. Pri 1h svečah je sedem od desetih poslov odvisnih izključno od dogovora. Ta backtest ne preizkuša strategije, ampak 3,400-krat vrstni red dveh stavkov `if`.
Napačen pristop št. 2: predpostavite, da se je stop izvršil po ceni stopa
Recimo, da popravite vrstni red. Najprej se razreši stop, zabeležite izgubo natanko 0.10% in provizijo taker ter se vam zdi, da ste ravnali dosledno. Še vedno sta narobe dve ločeni stvari.
Prvič, stop je sprožilec, ne izvršitev. Na Binance USDⓈ-M naročilo STOP_MARKET v trenutku, ko je izpolnjen pogoj za sprožitev, postane tržno naročilo, ki nato pobere količino iz knjige naročil. V mirni minuti to pomeni tick ali dva zdrsa. V minuti, ki je vaš stop dejansko sprožila — tisti s 40-točkovnim telesom sveče in likvidacijsko kaskado pod njim — je knjiga plitka prav na strani, na kateri izvršujete. V mojem vzorcu je bila mediana izvršitve ob primerjavi sprožitev stopov s podatki tick 1.4 bps za sprožilno ceno, 95. percentil pa 11 bps. Pri stopu 10 bps vam skrajni primeri dodajo še desetino tveganja, za katero ste mislili, da ste ga določili.
Drugič, pri perpih je pomembnejša podrobnost: katera cena sproži naročilo. Binance stop naročila privzeto sproži pri mark price, ki temelji na indeksu in zglajeni osnovi, ne pa na zadnji sklenjeni transakciji na tej borzi. Vaša časovna vrsta OHLC temelji na zadnji ceni. To sta različni časovni vrsti, ki se najbolj razhajata prav med dogodki, ki sprožijo stope.
| Zadnja cena (vaše kline) | Mark price (privzeti sprožilec) | |
|---|---|---|
| Vir | posli na tej borzi | indeks več borz + osnova |
| Obnašanje senc | celoten razpon gibanja | močno zglajeno |
| Običajno odstopanje | 1–3 bps v mirnih razmerah, 20–35 bps v minuti s kaskado | |
| Posledica za backtest | stopi, ki so se sprožili, pa se ne bi smeli, in obratno | |
Tako vas 25 bps dolga senca v podatkih zadnje cene v backtestu vrže iz pozicije, čeprav se mark price v živo ni nikoli približal na manj kot 10 bps od sprožilne cene. Ali pa se zgodi nasprotno, na dan, ko se premakne indeks, vaša borza pa zaostaja. Če nastavite workingType na CONTRACT_PRICE, vsaj uskladite obnašanje v živo s svojimi podatki, kar je za raziskovalca običajno prava izbira, saj poštena simulacija sprožilca mark price pomeni, da morate skozi celoten mehanizem izvršitev voditi še drugo časovno vrsto.
Najbolje se spomnim tega primera: nekdo v naši ekipi je »izboljšal« strategijo tako, da je prevzem dobička premaknil z 0.18% na 0.21%. Sharpe je zrasel z 2.3 na 3.1. Nove prednosti ni bilo. Cilj se je preprosto premaknil izven gostega dela porazdelitve 1-minutnih senc, zato je manj poslov končalo v dvoumnem razredu, kjer jim je koda potiho pripisovala zmago. Optimizirali so pravilo za razrešitev neodločenega izida.
Napačen pristop št. 3: vedno predpostavite najslabše in temu recite konservativnost
Prva rešitev, ki se je človek domisli, je pesimizem. Če sta doseženi obe ravni, upoštevajte stop. Urejeno, nič več optimizma, lahko objavimo.
Včasih sem delal tako. Bolje je kot druga možnost, a je še vedno narobe iz dveh razlogov.
Uničuje strategije, ki so povsem v redu. Pesimistična razrešitev pri 12.6% poslov je tej strategiji v primerjavi z razrešitvijo na tick podatkih, ki je dala 0.94, odvzela 2.1 točke Sharpa. Če je prava vrednost 0.94, vaš dogovor pa pokaže 0.18, idejo zavržete in se lotite česa slabšega. Konservativnost, ki zgreši za dve točki Sharpa, ni konservativnost, temveč šum z moralno držo.
Še huje, popači optimizacijo. Če optimizatorju zaženete pregled parametrov s pesimističnim pravilom za razrešitev, se bo naučil izogibati dvoumnosti, saj je ta zdaj čista kazen. Iskal bo široke stope in bližnje cilje ali počasne sveče, pri katerih se ravni redko znajdeta v isti sveči, nato pa vam ponudil parametre, izbrane glede na vaš dogovor o izvršitvah, ne glede na trg. Enaka napaka kot pri ugodnejši različici, le z nasprotnim predznakom, in enako nevidna v poročilu o uspešnosti.
Pravilo, ki ga uporabimo pred vsem drugim: če je stop_distance + target_distance manjši od 75. percentila razpona vašega intervala sveč, ima predpostavka o gibanju znotraj sveče na dobiček in izgubo večji vpliv kot vaš signal. Izračunajte obe vrednosti. To so štiri vrstice kode, ta preverba pa je ustavila več pregledov strategij kot katera koli druga posamezna kontrola.
Kaj dejansko deluje
Pot znotraj sveče je podatek. Pridobite ga ali pa omejite negotovost tam, kjer ga ne morete dobiti.
- Razrešujte na najpodrobnejši časovni vrsti, ki jo imate. Binance aggTrades za ustrezne minute obsegajo nekaj sto vrstic in dokončno razjasnijo vprašanje: katera raven je bila dosežena prva in po kateri ceni se je izvršil preboj. Podatkov tick ne potrebujete za celoten backtest, temveč le za dvoumne sveče. V mojem vzorcu je šlo za 606 minut od 129,600. To je majhen prenos, ne infrastrukturni projekt.
- Če podatki tick niso na voljo, za razrešitev uporabite en ali dva krajša časovna intervala. Signale ustvarjajte na 15m, izhode pa razrešujte na svečah 1s ali 1m. Dvoumnost pade z 49% na delček odstotka, preostanek pa je dovolj majhen, da ga lahko pošteno zanemarite.
- Vedno poročajte o razponu. Vsak backtest zaženite dvakrat, z optimistično in pesimistično razrešitvijo, ter oba Sharpa izpišite ob razrešenem rezultatu. Ta razpon predstavlja vašo negotovost glede gibanja znotraj sveče in sodi v poročilo o uspešnosti ob intervalu zaupanja za sam Sharpe. Če je razpon 0.2–2.3, noben sklep znotraj njega ni zanesljiv.
- Stopnjo dvoumnih primerov obravnavajte kot ključno metriko. Pri nas je na vrhu vsake kartice strategije, ob številu poslov in prometu. Stopnja nad približno 5% pomeni, da preizkušate izhodno logiko, ne vstopne.
- Sprožilec modelirajte ločeno od izvršitve. Sprožite pri cenovni seriji, ki jo borza dejansko uporablja; izvršitev pa modelirajte po sprožilni ceni z dodanim zdrsom, ocenjenim na podlagi podatkov traku, ne po sami sprožilni ceni.
Pri delnicah je težava enaka, le drugače se kaže. Stop pri 62.00 pri delnici, ki čez noč z vrzeljo pade na 58.40, se ne izvrši pri 62.00, temveč nekje pod otvoritveno ceno. Backtest z dnevnimi svečami, ki pri preskokih prek sprožilne cene upošteva −$0.00 zdrsa, vam bo z veseljem povedal, da je varovalni stop izboljšal največji padec. Ni ga. Preprosto ga niste preizkusili na pomembnih dneh. Enako velja za zaustavitve trgovanja: ob ponovnem odprtju se na avkciji izvrši vaš stop, po ceni, ki je najnižja cena sveče sploh ne pokaže.
Nič od tega ni nenavadno. Gre za spoznanje, da je sveča povzetek, strategija s stopom in ciljem pa stavi na vrstni red dogodkov, ki jih je ta povzetek izpustil. Ko papirni trgovalni sistem končno zažene strategijo na podatkih v živo, imajo ti podatki o vrstnem redu jasno mnenje, ki ga prav nič ne zanima, katero vejo stavka if ste vpisali prvo.
← Vse objave


