Leto 1-minutnih svečk bi moralo vsebovati 525,600 vrstic. Iz našega prenosa trajnih pogodb BTCUSDT za leto 2025 jih je bilo 525,557 — 43 minut manj, stopnja popolnosti pa 99.992%. Pri trajni pogodbi za altcoin s srednjo tržno kapitalizacijo na isti borzi, v istem prenosu in po isti poti kode jih je manjkalo 1,247: popolnost 99.76%. Serija 1-minutnih svečk za ameriške delnice za isto leto je imela približno 427,000 vrstic manj kot kriptovalutna, kar sploh ni vrzel, temveč posledica tega, da se trg zapre.
Tri od teh številk so dolgočasne. Tistih 43 pa pove zgodbo.
Štiri različne stvari, ki so v vašem podatkovnem okviru videti kot vrzel
Preden se lotimo tistih 43, razčistimo pojme, saj je večina kode za obravnavo vrzeli napačna že na tej ravni. Če vrstice ni v vaši lokalni datoteki parquet, ne veste, kaj od tega jo je povzročilo, za vsak primer pa je pravi odziv drugačen.
| Vrsta | Kaj se je zares zgodilo | Kako se pojavi | Pravi odziv |
|---|---|---|---|
| Brez poslov | Trg je bil odprt, a v tisti minuti nihče ni trgoval po nasprotni strani razmika | Na nekaterih končnih točkah svečka z ničelnim obsegom (vse vrednosti OHLC enake, trades=0), na drugih pa manjkajoča vrstica | Ohranite jo. Gre za resnično informacijo: nihče ni želel trgovati. |
| Izpad borze | Ujemalni mehanizem je bil nedosegljiv, načrtovano ali ne | Manjkajoča vrstica, včasih več zaporednih | Označite kot zastarelo. V tem času ne trgujte. |
| Začasna zaustavitev instrumenta | Presežena meja LULD, čakajoče novice, obvestilo o umiku z borze | Manjkajoča vrstica, nato zapis dražbe ob ponovnem odprtju | Označite kot zastarelo, ponovno odprtje pa obravnavajte kot diskontinuiteto. |
| Vaša napaka | Omejitev hitrosti pri paginaciji, ponovni poskus, pri katerem je izpadla stran, napaka v zanki na meji časovnega pasu | Manjkajoča vrstica, ki je ni mogoče ločiti od zgornjih primerov | Odkrijte napako in znova prenesite podatke. To je edini primer, ki ga lahko odpravite. |
Borze se ne strinjajo glede prve vrstice v tabeli, in prav tu se stvari zapletejo. Končna točka Coinbase za svečke v celoti izpusti prazne intervale, zato je zgodovina nelikvidnega para polna dobesednih vrzeli. Binanceovi klines praviloma vrnejo sintetično svečko z obsegom 0 ter z vrednostmi open=high=low=close, ki so enake ceni zadnjega posla. Isto dejstvo, dve različni obliki; nalagalnik, ki indekse znova razporedi na polno minutno mrežo, pa eno obliko spremeni v drugo, ne da bi vas o tem obvestil. Preden napišete zapolnjevalnik vrzeli, preverite, kako se obnaša vaša borza, ne šele potem.
Skoraj vseh 1,247 manjkajočih minut pri altcoinu je spadalo v prvo kategorijo: plitka knjiga naročil v nedeljo ob 04:00 UTC, nihče ni trgoval. Nadležno, preprosto za razumevanje in večinoma neškodljivo, saj strategija takrat tako ali tako ne bi trgovala. Prav zato sem nehal gledati te podatke in se vrnil k tistim 43.
Tistih 43 minut ni bilo raztresenih
Če bi bile vrzeli enakomerno porazdeljene, bi se 43 minut v letu pojavilo kot 43 osamljenih primerov, po eden vsakih osem dni in pol, vsak zase zanemarljiv. A ni bilo tako. Pojavile so se v šestih nizih: eden je trajal 19 zaporednih minut, eden 11, dva po 4, poleg tega pa še nekaj parov. Šest dogodkov, ne 43 naključij.
Poleg tega so bili ti dogodki povezani s tem, kar vas zanima. Borze izpadejo, ko so preobremenjene, obremenjene pa so takrat, ko se cena premika. Vse ure v letu sem razvrstil po realizirani volatilnosti in preveril, kje so se pojavile manjkajoče minute: 61% jih je bilo v najvišjem decilu. Brezpogojna verjetnost, da manjka poljubna minuta, je 0.008%. Če pa gledamo uro z volatilnostjo v najvišjem decilu, je približno 0.05% — šestkrat večja, manjkajoče minute pa so še povrhu zbrane v skupine.
Metrika popolnosti na vaši nadzorni plošči kakovosti podatkov torej meri napačno stvar. Številka 99.992% daje vtis, da na nabor podatkov lahko pozabite. V resnici pa opisuje serijo, ki je popolna v urah, ko vaša strategija ne počne ničesar, in luknjičava v urah, ko počne vse. Momentum sistem, ki sproži pozicijo ob širitvi volatilnosti, ima bistveno večjo možnost, da naleti na vrzel, kot nakazuje ta glavna številka, in nanjo naleti sredi posla.
Kaj vnaprejšnje zapolnjevanje povzroči nekaj vrstic pozneje
Tukaj je napaka, zaradi katere sem napisal ta članek. Vzemimo 19-minutni niz. Običajno čiščenje podatkov: indekse znova razporedimo na polno minutno mrežo, vrednosti OHLC zapolnimo naprej z zadnjo zaključno ceno, obseg nastavimo na nič. Serija je zdaj neprekinjena, kazalniki pa se izračunajo brez enega samega NaN.
Teh 19 svečk ima high == low == close. True range je pri vsaki od njih nič. ATR(14), izračunan v tem oknu po predizpadni vrednosti okoli 240 USDT, do ponovnega vzpostavljanja delovanja borze upade na približno 34 — celotno povprečje zdaj temelji na petih pravih svečkah, ki so ostale v oknu. To nato vnesite v določilnik velikosti pozicije, prilagojen volatilnosti, običajne size = risk_budget / ATR vrste. Velikost pozicije se poveča za sedemkrat.
Naslednja prava svečka je zapis ob ponovnem odprtju in ni mirna svečka. V našem primeru se je odprla 1.8% stran od zadnje zaključne cene pred izpadom. Test za nazaj je brez pomisleka odprl 7-krat večjo pozicijo tik pred cenovno vrzeljo 1.8%, na podlagi izvršitve, do katere ne bi moglo priti, po ceni, ki je nihče ni ponujal. Ta en sam sintetični posel je na krivulji kapitala prinesel več kot mesec legitimnega poslovnega izida, in to v napačno smer — nastal pa je zgolj zaradi vrstice za čiščenje podatkov, napisane zato, da je bil podatkovni okvir videti urejen.
Odstranjevanje vrstic namesto zapolnjevanja prav tako ni rešitev; gre za isto napako v drugačni preobleki. Če jih odstranite, bodo vaši pogledi za nazaj z indeksom celih števil zavajajoči: »EMA 20 svečk« bo zdaj zajemal 39 minut po stenski uri čez čas izpada, donos med sosednjima svečkama čez mejo pa bo celoten skok 1.8%, obravnavan kot premik v eni minuti. Vsaka ocena volatilnosti na svečko bo ta skok ocenila kot dogodek z odklonom 60 sigma. Nič vas ne opozori. Indeks je še vedno monotono naraščajoč.
Pri ponovnem vzorčenju težava postane nevidna
Večina raziskav ne uporablja 1-minutnih svečk, ampak združene podatke, združevanje pa težavo zakrije. Če podatke ponovno vzorčite na 5-minutne intervale, 19-minutna vrzel postane štiri svečke, od katerih sta prva in zadnja nepopolni. Pandas iz dveh preostalih minut izračuna vrednosti OHLC, ki so videti povsem razumne, in jih označi enako kot svečko, sestavljeno iz petih minut. V izhodnih podatkih ni ničesar, kar bi jih ločilo.
Najcenejši popravek, ki ga poznam: skozi vsako ponovno vzorčenje prenesite stolpec bars_in_window in ga nikoli ne zavrzite. Ena celoštevilska vrednost na vrstico omogoči, da je mogoče odgovoriti na vsa nadaljnja vprašanja o zanesljivosti svečke. Prenašamo tudi seconds_since_last_real_print, ki vsebuje isto informacijo v obliki, na podlagi katere lahko ukrepa izvršilna plast.
Naša politika, kolikor je sploh politika
Tako naši agenti zdaj ravnajo s podatki, po vrsti:
- Nikoli ne razporejajte indeksov znova brez opozorila. Nalagalnik ustvari manifest vrzeli — začetek, konec, dolžino in kategorijo, v katero po njegovi oceni spada. Če niz manjkajočih minut obsega manj kot 3 svečke, obseg v okoliških svečkah pa je majhen, gre za minuto brez poslov. Vse daljše vrzeli v času delovanja trga obravnavamo kot izpad, dokler ne dokažemo nasprotnega.
- Preden razlagate podatke, jih prenesite znova. Polovica naših zgodnjih vrzeli je bila posledica napak pri paginaciji. Drugi prenos z druge končne točke ali od drugega ponudnika odpravi četrto kategorijo in zmanjša težavo, še preden je treba karkoli presojati.
- Preverjajte zastarelost, ne zapolnjujte vrzeli. Strategija prejme vhodni podatek
data_agein strogo pravilo: novih pozicij ne odpiramo, če je od zadnjega pravega zapisa minilo več kot N svečk; odprte pozicije pa ob ponovnem odprtju zapremo samo s tržnim naročilom, pri ceni katerega izrecno upoštevamo odbitek za tveganje vrzeli. Izvršitve, do katerih ne bi moglo priti, so slabše od poslov, ki se niso zgodili. - Kazalniki naj vidijo NaN, ne izmišljenih podatkov. Vrednosti, zapolnjene z zadnjo ceno, nikoli ne dosežejo plasti značilk. Če ATR-ja ni mogoče izračunati, je nedefiniran, nedefinirano pa pomeni brez pozicije. Glasna napaka je boljša od tihe 7-krat večje pozicije.
- Poročajte o uspešnosti glede na vrzeli. Vsak test za nazaj, ki ga objavimo, poleg glavnega rezultata prikaže tudi poslovni izid brez poslov ob izpadih. Če rezultat sloni na teh poslih, je zgolj artefakt podatkov.
Hitra revizija, ki jo lahko opravite še danes: združite manjkajoče minute v zaporedne nize, nato preverite, kolikšen delež poslov v vašem testu za nazaj se odpre ali zapre v 30 minutah od začetka ali konca katerega od nizov. Če je delež pod 1%, vrzeli verjetno nimajo vpliva. Če znaša 5% ali več, je krivulja kapitala deloma zgodba o izpadih borze.
Zanesljivejši pokazatelj od velikosti vrzeli je zame postal njihov vzorec. Nabor podatkov s tisoči raztresenih vrzeli v neaktivnih urah je običajno v redu. Nabor podatkov z nekaj tesno zbranimi vrzelmi pa vam pove, da nekaj odpove pod obremenitvijo; prav tam, kjer strategija živi, pa nekaj odpove pod obremenitvijo.
← Vse objave
