Praėjusią savaitę atsiuntėte savo užrašinę: tas pats signalas, ta pati instrumentų visuma, tie patys 14 mėnesių BTCUSDT neterminuotų ateities sandorių duomenų. Pasikeitė tik vykdymas. Nustojote kirsti spreado ribą ir pradėjote laikyti pirkimo pavedimus vienu tiksiu geresne kaina; Sharpe pakilo nuo 0.42 iki 2.14. Klausėte, ar tai tikra, ar ką nors sugadinote.
Kažką sugadinote. Noriu tiksliai parodyti, kur, nes klaida yra vienoje eilutėje, o pamoka už jos – daug didesnė.
Štai jūsų įvykdymo taisyklė, nukopijuota iš variklio:
if bar.low <= limit_price: fill(limit_price)
Tai reiškia: jei per šią minutę rinkoje buvo sudarytas sandoris už mano kainą arba žemesnę, mano pavedimas įvykdytas už mano kainą. Iš tikrųjų tai užkoduoja tik tai, kad kaina palietė jūsų lygį. Kainos palietimas nėra pavedimo įvykdymas. Tarp šių dviejų dalykų yra eilė, o jūs sumodeliavote ją taip, tarsi ji būtų tuščia.
Kas stovi prieš jus
Kai pateikiate pirkimo pavedimą už 84,120.0 BTCUSDT neterminuotų ateities sandorių rinkoje, atsiduriate visų ten jau laukiančių pavedimų eilės gale. Šios sutarties geriausios kainos lygyje paprastai laukia nuo 4 iki 30 BTC, priklausomai nuo paros laiko; jūsų imties laikotarpio mediana – apie 12 BTC. Jūsų pavedimas yra 0.4 BTC. Kad jūsų sandoris įvyktų, pardavėjai turi pateikti pakankamai bendros apimties pardavimo pavedimų į tą lygį, kad būtų įvykdyti visi anksčiau už jus atėję pavedimai, ir tai turi nutikti prieš atšaukiant tą lygį jums nespėjus arba prieš rinkai pakylant.
Taigi backtestas turėtų klausti ne „ar kaina pasiekė 84,120.0?“, o „ar rinkos pardavimo pavedimais už 84,120.0 buvo įvykdyta bent 12.4 BTC, kol mano pavedimas ten laukė?“. Tai visiškai skirtingi įvykiai. Jūsų duomenyse jie skiriasi maždaug 3 kartus.
Trys įvykdymo taisyklės, trys skirtingos strategijos
Dar kartą paleidau jūsų signalą su tais pačiais įėjimais ir trimis vykdymo modeliais. Ta pati alfa, tie patys mokesčiai, tas pats finansavimas. Keitėsi tik įvykdymo logika.
| Įvykdymo taisyklė | Įvykdyti pavedimai | Vidutinis 60s rezultatas po įvykdymo | Sharpe |
|---|---|---|---|
Palietimas: low <= limit | 4,180 | +2.6 bp | 2.14 |
Griežtas pramušimas: low < limit - 1 tick | 1,712 | +0.4 bp | 0.61 |
| Eilės simuliacija pagal apimtį kainos lygyje | 1,306 | +0.9 bp | 0.77 |
Vidurinė eilutė – grubus pataisymas, kurio dažniausiai imamasi pirmiausia: įvykdymą skaičiuoti tik tada, jei rinka prekiavo griežtai žemiau jūsų kainos, darant prielaidą, kad kainai ją peržengus jūsų pavedimas turėjo būti įvykdytas. Kryptis teisinga, ir taip atsikratoma didžiosios dalies fantazijų. Tačiau šis būdas turi rimtą šališkumą, prie kurio dar grįšiu.
Apatinė eilutė – modelis, kurį turėtumėte sukurti. Jam nereikia L3 duomenų srauto ar kiekvieno pavedimo rekonstrukcijos. Didžiąją dalį jau turite.
Eilės simuliacija, kurią galite sukurti iš aggTrades
Vietoj klines duomenų gaukite agreguotų sandorių srautą. Kiekvienas įrašas turi kainą, kiekį, laiko žymą ir maker pusės žymą, kuri nurodo, ar agresyvusis pavedimas buvo pirkti, ar parduoti. To užtenka pakankamai veiksmingai jūsų pasyvaus pavedimo simuliacijai:
- Kai pateikiamas jūsų pavedimas, užfiksuokite tuo metu laukiančią apimtį už jūsų kainą. Jei turite tik 100ms pavedimų knygos duomenų srautą, naudokite paskutinę momentinę kopiją; paklaida nedidelė, palyginti su ta, kurią taisote.
- Nustatykite
queue_ahead = resting_size. Būkite pesimistiški ir laikykite, kad esate eilės gale. Taip ir yra, nebent patys sukuriate šį kainos lygį. - Eikite per sandorių srautą. Kiekvienas pardavėjo inicijuotas sandoris už jūsų kainą arba žemiau jos mažina
queue_aheadsavo kiekiu. Kai reikšmė tampa neigiama, jūsų pavedimas įvykdomas už jūsų kainą tuo laiko žymos momentu. - Jei kaina nutolsta per vieną tiką, nenustatykite eilės iš naujo į nulį. Mažinkite jos dydį. Kai kurie prieš jus esantys pavedimai atšaukiami, kai lygis pasensta, kiti lieka. 30-40% sumažėjimas per visą sekundę, kol kaina toli nuo jūsų lygio, mano rekonstrukcijose atitiko duomenis geriau nei bet kuris kraštutinis variantas.
- Jei jūsų strategija atšauktų ir iš naujo pateiktų pavedimą, modeliuokite pakartotinį pateikimą kaip naują pavedimą naujo lygio eilės gale. Šį žingsnį žmonės praleidžia, ir čia slypi likusi iliuzija.
Dėl 2 žingsnio norėsite su manimi ginčytis. Taip, kartais būnate arti eilės pradžios, nes pateikėte pavedimą vos susiformavus lygiui. Gerai – matuokite tai, o ne darykite prielaidą. Registruokite laukiančią apimtį pavedimo pateikimo metu ir leiskite duomenims parodyti, kokia jūsų pavedimų dalis iš tiesų pateikiama anksti. Jūsų strategijoje tai buvo 11%, nes signalas suveikia po kainos judesio, vadinasi, lygis, prie kurio jungiatės, jau egzistuoja ir jame jau laukia minia.
Įvykdomi būtent tie pavedimai, kurių norėtumėte išvengti
Dabar svarbiausia dalis ir priežastis, kodėl griežto pramušimo taisyklė yra šališka.
Pagalvokite, kada jūsų pirkimo pavedimas įvykdomas visas. Taip nutinka, kai pardavimo spaudimas pakankamas, kad būtų suvalgytas visas lygis. Vadinasi, pagal pačią konstrukciją tai yra momentas, kai rinka leidžiasi žemyn per jūsų kainą. Labiausiai užtikrinti įvykdyti pavedimai yra tie, po kurių iškart atsiduriate nepalankioje pozicijoje.
Suskirstykite įvykdytus pavedimus pagal tai, kaip jie buvo įvykdyti, ir apskaičiuokite 60 sekundžių mark-out:
| Įvykdymo tipas | Įvykdytų pavedimų dalis | Mark-out po 60s |
|---|---|---|
| Prekyba vyko šiame lygyje, kaina atšoko aukštyn | 38% | +3.1 bp |
| Prekyba vyko šiame lygyje, kaina nekito | 21% | +0.2 bp |
| Kaina nukrito 2+ tikais žemiau | 41% | −2.4 bp |
Jūsų naivus backtestas pateikė visus tris segmentus ir įvertino juos taip, tarsi jie būtų nemokami. Griežto pramušimo taisyklė pateikia beveik vien trečią segmentą, todėl jos rezultatas smuko labiau nei eilės simuliacijos. Neteisingos abi. Eilės simuliacija duoda realistišką derinį, o būtent derinys ir lemia viską: pasyvus vykdymas leidžia uždirbti iš spreado, bet už tai sumokate nepalankia atranka. Tikroji jūsų strategija yra šių dviejų dalykų santykis.
Senoji akcijų prekybos skyriaus formuluotė vis dar tinka: maker pavedimas yra rinkai išrašytas nemokamas opcionas. Kita pusė juo pasinaudoja tada, kai jai tai apsimoka. Jūsų backtestas skaičiavo premiją ir pamiršo, kad opcionas turi ir išmokos dalį.
Negauti sandoriai keičia strategiją, o ne vien jos kainą
Šią dalį labiausiai noriu, kad įsidėmėtumėte. Kai prastai modeliuojate taker vykdymą, gaunate tinkamus sandorius netinkama kaina, o daugumą problemų išsprendžia komisinių korekcija. Kai prastai modeliuojate maker vykdymą, gaunate visiškai ne tuos sandorius. Maždaug 2,900 iš jūsų 4,180 įėjimų taip ir neįvyko. Kai kurie iš jų buvo geriausi jūsų signalai, per žvakes, kurios šovė aukštyn ir apsisuko – būtent tokiomis aplinkybėmis rinka nuėjo be jūsų.
Todėl neįvykdyto pavedimo šakai reikia tikros logikos. Ką daro strategija, jei įėjimo pavedimas neįvykdomas iki signalo galiojimo pabaigos? Vejasi rinką taker pavedimu ir moka spreadą bei poveikio rinkai kainą? Pateikia naują pavedimą žemesne kaina ir susitaiko su kitokia įėjimo baze? Praleidžia sandorį ir lieka be pozicijos? Kiekvienas pasirinkimas duoda iš esmės skirtingą nuosavo kapitalo kreivę, o atsakymas „laikykime, kad pavedimas įvykdytas“ netinka nė vienam atvejui. Mūsų bandymuose sąžininga taisyklė vytis rinką (po 20 sekundžių neįvykdymo kirsti spreado ribą, taikant ne didesnį nei 3 bp praslydimą) atkūrė maždaug trečdalį trūkstamų sandorių ir apie pusę skirtumo tarp naivaus ir eilės simuliacijos Sharpe. Tai išties įdomus rezultatas, pasirodantis tik tada, kai įvykdymo modelis pakankamai realistiškas, kad klausimas būtų prasmingas.
Paprastas patikrinimas, užtrunkantis 10 minučių: palyginkite savo tiesioginės prekybos simuliacijos žurnalą su backtestu per tą patį laikotarpį. Lyginkite įvykdymo rodiklį, o ne PnL. Jei backtestas įvykdo 100% laukiančių pavedimų, o simuliacijoje – 34%, jūs nelyginate strategijų, o turite įvykdymo modelio klaidą. Ištaisykite ją prieš žiūrėdami į bent vieną grąžos skaičių.
Dar du trumpesni dalykai
Post-only atmetimai. Jei naudojate post-only, kad užsitikrintumėte maker komisinių pakopą, o pavedimų knyga pasikeičia tarp jūsų sprendimo ir biržos patvirtinimo, pavedimas atmetamas, užuot laukęs eilėje. Mūsų simuliacinės prekybos žurnaluose įprastomis valandomis BTCUSDT rinkoje taip nutinka 3-6% bandymų, o per minutę po JAV CPI duomenų paskelbimo – daugiau nei 15%. Atmestas pavedimas nėra įvykdytas pavedimas ir nėra eilėje laukiantis neįvykdytas pavedimas. Tai sandoris, kurio apskritai nebuvo, o jei backteste tokios būsenos nėra, sandorių skaičius išpučiamas būtent tais laikotarpiais, kurie jums svarbiausi.
Savų sandorių prevencija ir jūsų poveikis rinkai. Turėdami 0.4 BTC, BTCUSDT rinkos nejudinate, tad šį aspektą praleiskite. Tačiau minėjote, kad norėtumėte išbandyti tai vidutinės kapitalizacijos altkoino neterminuotų ateities sandorių rinkoje, kur geriausios kainos lygio nominali vertė dažnai nesiekia $15k. Ten jūsų pavedimas yra reikšminga eilės dalis, o užfiksuotas apimties prieš jus skaičius jau apima paskutinio jūsų pavedimo poveikį. Kai jūsų dydis viršija maždaug 10% laukiančios apimties, simuliacija turi atsižvelgti į tai, kad kiti rinkos dalyviai į jus reaguoja. Tiesą sakant, tuo metu labiau pasitikėčiau simuliacine prekyba nei bet kokia simuliacija, kurią galime parašyti jūs ar aš.
Dar kartą paleiskite modelį su eilės simuliacija ir atsiųskite man mark-out lentelę, suskirstytą pagal įvykdymo tipą. Jei atšokimo segmentas vis dar lemia didžiąją dalį rezultato, o pramušimo segmentas visko nesuvalgo, galbūt turite ką nors, ką verta išbandyti simuliacinėje prekyboje. Jei viską lėmė 2,900 įvykdyti pavedimai, kurių niekada nebūtumėte gavę, geriau tai sužinoti dabar, o ne po 4 savaičių stebint, kaip simuliacinė sąskaita elgiasi kitaip, nei žadėjo užrašinė.
← Visi įrašai


