2026. gada 3. septembris · datu inženierija

Minūtes, kuru nav: iztrūkumi, tirdzniecības apturēšana un nulles apjoma sveces OHLCV vēsturē

Minūtes, kuru nav: iztrūkumi, tirdzniecības apturēšana un nulles apjoma sveces OHLCV vēsturē

Kalendāra gada datiem ar 1 minūtes svecēm vajadzētu būt 525,600 rindām. Mūsu 2025. gada BTCUSDT beztermiņa fjūčeru datu izguvē bija 525,557 rindas — trūka 43 minūšu, pilnīgums bija 99.992%. Vidējas kapitalizācijas altkoina beztermiņa fjūčeru datu izguvē tajā pašā biržā, ar to pašu kodu, trūka 1,247 rindu: pilnīgums bija 99.76%. Savukārt ASV akciju minūšu datu virknē par to pašu gadu bija aptuveni par 427,000 rindu mazāk nekā kripto datos. Tie nav iztrūkumi — vienkārši tirgus, kas tiek slēgts.

Trīs no šiem skaitļiem nav nekas īpašs. Par 43 ir vērts runāt ilgi.

525,6001 minūtes sveces parastā gadā
0.008%trūka BTCUSDT datos 2025. gadā
61%no šo minūšu bija stundās ar svārstīgumu augstākajā decilē

Četras dažādas lietas, kas datu kadrā izskatās pēc iztrūkuma

Pirms ķeramies pie 43, jāizskaidro kategorijas, jo lielākā daļa iztrūkumu apstrādes koda jau šajā līmenī ir kļūdaina. Ja jūsu lokālajā parquet failā trūkst rindas, nav iespējams zināt, kura no šīm situācijām to izraisījusi, un katrā gadījumā pareizā rīcība ir cita.

VeidsKas patiesībā notikaKā tas parādās datosPareizā rīcība
Nebija darījumuTirgus bija atvērts, bet tajā minūtē neviens nepieņēma otras puses piedāvājumuDažos galapunktos svece ar nulles apjomu (visi OHLC rādītāji vienādi, trades=0), citos — rindas navAtstājiet. Tā ir reāla informācija: neviens nevēlējās tirgot.
Biržas darbības pārtraukumsTirdzniecības sistēma nedarbojās — plānoti vai neplānotiTrūkst vienas rindas vai dažkārt vesela rindu sērijaAtzīmējiet datus kā novecojušus. Šajā laikā netirgojiet.
Instrumenta tirdzniecības apturēšanaLULD diapazona pārsniegums, gaidāmas ziņas, paziņojums par izslēgšanu no biržasTrūkst rindas, pēc tam ir izsoles cena, atsākot tirdzniecībuAtzīmējiet datus kā novecojušus un tirdzniecības atsākšanu uztveriet kā pārrāvumu.
Jūsu kļūdaLappušu ielāde ar pieprasījumu ierobežojumu, atkārtots pieprasījums, kas izlaida lappusi, laika joslas robežas kļūda ciklāTrūkst rindas, un pēc izskata to nevar atšķirt no iepriekšējiem gadījumiemAtklājiet un ielādējiet datus atkārtoti. Šo gadījumu varat novērst.

Biržu pieeja tabulas pirmajam gadījumam atšķiras, un tieši tas rada problēmas. Coinbase sveču galapunkts izlaiž tukšos laika intervālus pavisam, tāpēc nelikvīda pāra vēsturē ir burtiski iztrūkumi. Binance klines parasti atgriež sintētisku sveci ar apjomu 0 un open=high=low=close, kas piesaistīti iepriekšējā darījuma cenai. Tas pats pamatā esošais fakts, divas atšķirīgas formas. Datu ielādētājs, kas indeksē datus pilnā minūšu režģī, pārveido vienu formu otrā, jums par to neziņojot. Pirms rakstāt iztrūkumu aizpildītāju, noskaidrojiet, kā rīkojas jūsu birža, nevis pēc tam.

Altkoina datos trūka 1,247 minūšu, un gandrīz visas piederēja pirmajai kategorijai: sekla orderu grāmata svētdien plkst. 04:00 UTC, kad neviens netirgoja. Kaitinoši, viegli izprotami un lielākoties nekaitīgi, jo stratēģija tik un tā tajā laikā netirgotu. Tieši tāpēc pārstāju pievērst tiem uzmanību un atgriezos pie 43.

43 minūtes nebija izkaisītas

Ja trūkstošie dati būtu vienmērīgi sadalīti, 43 minūtes gada laikā būtu 43 atsevišķi gadījumi — pa vienam ik pēc astoņarpus dienām, un katrs būtu noapaļošanas kļūda. Taču tā nebija. Tās veidoja sešus posmus: viens ilga 19 minūtes pēc kārtas, viens — 11, divi — 4, un vēl bija daži pa 2 minūtēm. Seši notikumi, nevis 43 nejaušības.

Turklāt šie notikumi ir saistīti ar to, kas jums rūp. Biržu darbība tiek traucēta lielas noslodzes laikā, bet noslodze pieaug, kad cena strauji mainās. Sagrupēju visas gada stundas pēc realizētā svārstīguma un noskaidroju, kurās bija trūkstošās minūtes: 61% no tām bija stundās ar svārstīgumu augstākajā decilē. Varbūtība, ka trūkst kādas nejauši izvēlētas minūtes, ir 0.008%. Savukārt stundās, kuru svārstīgums ir augstākajā decilē, tā ir aptuveni 0.05% — sešas reizes lielāka, un turklāt iztrūkumi sakopojas.

Tātad datu kvalitātes paneļa pilnīguma rādītājs mēra nepareizo. 99.992% izklausās pēc datu kopas, par kuru var vairs nedomāt. Taču tas patiesībā raksturo datu virkni, kas ir pilnīga stundās, kad jūsu stratēģija nedara neko, un caura stundās, kad tā dara visu. Momentum stratēģijai, kas ieslēdzas, svārstīgumam pieaugot, iespēja saskarties ar iztrūkumu ir ievērojami lielāka, nekā liecina galvenais rādītājs, un tas notiek darījuma laikā.

Ko aizpildīšana ar iepriekšējo vērtību izdara dažas rindas vēlāk

Lūk, kļūda, kuras dēļ nolēmu par to rakstīt. Ņemiet 19 minūšu posmu. Standarta datu sakārtošana: pārindeksējiet pilnā minūšu režģī, aizpildiet trūkstošos OHLC rādītājus ar iepriekšējo slēgšanas cenu, iestatiet apjomu uz nulli. Tagad datu virkne ir nepārtraukta, un indikatori darbojas bez neviena NaN.

Šajās 19 svecēs high == low == close. True range visās ir nulle. Šajā intervālā aprēķinātais ATR(14), kas pirms darbības pārtraukuma bija aptuveni 240 USDT, līdz brīdim, kad biržas darbība atsākas, sarūk līdz aptuveni 34 — visu vidējo vērtību nosaka 5 īstās sveces, kas izdzīvoja intervālā. Tagad padodiet šo vērtību svārstīgumam pielāgotam pozīcijas apjoma aprēķinam, kāds ir ierastais size = risk_budget / ATR veids. Pozīcijas apjoms pieaug septiņas reizes.

Nākamā īstā svece ir svece pēc tirdzniecības atsākšanas, un tā nav mierīga. Mūsu gadījumā tās sākuma cena bija par 1.8% attālumā no pēdējās cenas pirms darbības pārtraukuma. Atpakaļtests bez bažām atvēra 7x lielāku pozīciju, kad cena bija pārrāvusies par 1.8% — darījums tika izpildīts par cenu, kas nevarēja pastāvēt un ko neviens nepiedāvāja. Šis viens sintētiskais darījums kapitāla līknē bija vērtīgāks par mēneša leģitīmu peļņu un zaudējumiem, turklāt nepareizajā virzienā. To radīja tikai viena datu tīrīšanas koda rinda, kas bija paredzēta, lai sakārtotu datu kadru.

Arī rindu izmešana, nevis aizpildīšana, problēmu neatrisina — tā ir tā pati kļūda citā izskatā. Izmetiet rindas, un indeksētie veselos skaitļos izmantotie periodi maldinās: “20 sveču EMA” tagad aptver 39 reālā laika minūtes pāri darbības pārtraukumam, atdeve starp blakus esošām svecēm pie robežas ir viss 1.8% lēciens, ko uztver kā vienas minūtes kustību, bet katras sveces svārstīguma novērtējums to nolasa kā 60 sigma notikumu. Nekas par to nebrīdina. Indekss joprojām ir monotons.

Pārparaugošanā problēma kļūst neredzama

Lielākā daļa pētījumu nedarbojas ar 1 minūtes svecēm, bet ar apkopotiem datiem, un apkopošana problēmu nomazgā. Pārparaugojot uz 5 minūtēm, 19 minūšu iztrūkums kļūst par 4 svecēm, no kurām pirmā un pēdējā ir nepilnas. Pandas no 2 atlikušajām minūtēm aprēķina pilnīgi ticamus OHLC rādītājus un piešķir tiem tādu pašu marķējumu kā svecei, kas veidota no 5 minūtēm. Rezultātā nekas tās neatšķir.

Lētākais man zināmais labojums: saglabājiet kolonnu bars_in_window katrā pārparaugošanā un nekad to neizmetiet. Viena vesela skaitļa vērtība katrai rindai ļauj atbildēt uz katru tālāko jautājumu par to, vai svecei var uzticēties. Mēs saglabājam arī seconds_since_last_real_print, kas satur to pašu informāciju formā, ko izpildes slānis var izmantot.

Mūsu pieeja, cik nu tāda ir

Lūk, ko mūsu aģenti tagad dara šādā secībā:

  1. Nekad nepārindeksējiet, par to neziņojot. Ielādētājs ģenerē iztrūkumu pārskatu — sākums, beigas, ilgums un norāde, kurai no četrām kategorijām iztrūkums, visticamāk, pieder. Ja trūkst mazāk nekā 3 sveču pēc kārtas un blakus esošo sveču apjoms ir mazs, tā ir minūte bez darījumiem. Viss, kas aktīvā tirgus laikā ilgst vairāk, tiek uzskatīts par darbības pārtraukumu, līdz ir pierādīts pretējais.
  2. Pirms izdarāt secinājumus, ielādējiet datus atkārtoti. Puse no agrīnajiem iztrūkumiem radās lappušu ielādes kļūdu dēļ. Otrā datu izguve no cita galapunkta vai cita piegādātāja atrisina ceturtās kategorijas gadījumus un samazina problēmu, pirms jāizdara kāds spriedums.
  3. Novecojušu datu pārbaude, nevis iztrūkumu aizpildīšana. Stratēģijai tiek padota ievade data_age un stingrs noteikums: neatveriet jaunas pozīcijas, ja pēdējā īstā cena ir vecāka par N svecēm, un atvērtās pozīcijas pēc atsākšanas aizveriet tikai ar tirgus rīkojumu, kura cenā ir skaidri ņemts vērā iztrūkuma risks. Neiespējami izpildīti darījumi ir sliktāki par nenotikušiem.
  4. Indikatori saņem NaN, nevis izdomātus datus. Aizpildītās cenas nekad nenonāk līdz pazīmju aprēķina slānim. Ja ATR nav iespējams aprēķināt, tā vērtība nav definēta, un tas nozīmē, ka pozīciju neatveram. Skaidra kļūda ir labāka par nemanāmu 7x.
  5. Uzrādiet rezultātus atkarībā no iztrūkumiem. Katrā atpakaļtestā, ko publicējam, līdzās galvenajam rezultātam uzrādām P&L, izslēdzot darījumus, kas veikti līdzās darbības pārtraukumiem. Ja rezultātu veido šie darījumi, tad tas ir datu artefakts.

Ātra pārbaude, ko varat veikt jau šodien: sagrupējiet trūkstošās minūtes posmos pēc kārtas un pēc tam pārbaudiet, kāda daļa no jūsu atpakaļtesta darījumiem tiek atvērti vai slēgti 30 minūšu laikā no posma robežas. Ja tā ir mazāka par 1%, iztrūkumi, visticamāk, būtiski neko neietekmē. Ja tā ir 5% vai vairāk, kapitāla līkni daļēji nosaka biržas darbības pārtraukumi.

Pazīme, kurai esmu iemācījies uzticēties, ir iztrūkumu raksts, nevis to skaits. Datu kopa ar tūkstošiem izkaisītu iztrūkumu klusajās stundās parasti ir pilnīgi pieņemama. Datu kopa ar dažiem blīviem iztrūkumu posmiem vēsta, ka lielas noslodzes laikā kaut kas nedarbojas — un tieši tur darbojas jūsu stratēģija.

ohlcv iztrūkumidatu inženierijaatpakaļtestspārparaugošanakripto fjūčeri
← Visi raksti