3. syyskuu 2026 · datatekniikka

Olemattomat minuutit: aukot, kaupankäyntikatkot ja nollavolyymiset palkit OHLCV-historiassa

Olemattomat minuutit: aukot, kaupankäyntikatkot ja nollavolyymiset palkit OHLCV-historiassa

Kalenterivuodessa pitäisi olla 1 minuutin palkkeja 525,600 riviä. Vuoden 2025 BTCUSDT-perpetuaalien aineistossamme oli 525,557 riviä — 43 minuuttia puuttui, joten kattavuus oli 99.992%. Saman välittäjän keskisuuren altcoinin perpetuaaleista, samalla haulla ja samalla koodipolulla, puuttui 1,247 riviä: kattavuus oli 99.76%. Saman vuoden yhdysvaltalaisessa osakeaineistossa minuutteja oli noin 427,000 vähemmän kuin kryptoaineistossa. Se ei kuitenkaan ole aukko, vaan markkina, joka sulkeutuu.

Kolme näistä luvuista ovat arkisia. Se 43 on tuhannen sanan arvoinen.

525,6001 minuutin palkkia karkausvuodettomana vuonna
0.008%BTCUSDT:ltä puuttui vuonna 2025
61%puuttuvista minuuteista osui volatiliteetin ylimmän desiilin tunteihin

Neljä eri asiaa, jotka näyttävät kaikki aukoilta dataframe:ssasi

Ennen kuin palaamme 43 minuuttiin, käydään läpi luokittelu, sillä useimmat aukkojen käsittelyyn tarkoitetut koodit ovat jo tässä vaiheessa väärin. Kun rivi puuttuu paikallisesta parquet-aineistostasi, et tiedä, mikä näistä sen aiheutti, ja oikea toimintatapa vaihtelee syyn mukaan.

TyyppiMitä todella tapahtuiMiltä se näyttää aineistossaOikea toimintatapa
Ei kauppojaMarkkina oli auki, mutta kukaan ei ylittänyt spreadia kyseisellä minuutillaJoillakin rajapinnoilla nollavolyymipalkki (OHLC-arvot samat, trades=0), toisilla puuttuva riviSäilytä se. Se on aitoa tietoa: kukaan ei halunnut käydä kauppaa.
Välittäjä pois käytöstäTäsmäytyskoneisto oli poissa käytöstä, suunnitellusti tai eiPuuttuva rivi, joskus useita peräkkäinMerkitse vanhentuneeksi. Älä käy kauppaa katkoksen yli.
Instrumentin kaupankäyntikatkoLULD-rajan ylitys, uutisia odotetaan, poistamisilmoitusPuuttuva rivi, jota seuraa avaushuutokaupan kauppaMerkitse vanhentuneeksi ja käsittele kaupankäynnin jatkumista epäjatkuvuuskohtana.
Oma virheesiPyyntöjen rajoittama sivutus, sivun pudottanut uusintayritys tai silmukan aikavyöhykerajavirhePuuttuva rivi, jota ei voi erottaa yllä olevistaTunnista ja hae uudelleen. Tämän voit korjata.

Välittäjät käsittelevät taulukon ensimmäistä tapausta eri tavoin, ja juuri tässä piilee ongelma. Coinbasen kynttilärajapinta jättää tyhjät jaksot kokonaan pois, joten epälikvidin parin historiassa on kirjaimellisia aukkoja. Binance puolestaan antaa klines-rajapinnasta yleensä synteettisen palkin, jonka volyymi on 0 ja jonka open=high=low=close-arvot on asetettu edellisen kaupan hintaan. Sama asia todellisuudessa, kaksi erilaista esitystapaa. Aineistolataaja, joka lisää täydet minuutit indeksillä, muuttaa toisen toiseksi kertomatta siitä. Selvitä välittäjän käytäntö ennen aukkojen täyttöön tarkoitetun koodin kirjoittamista, älä vasta sen jälkeen.

Altcoinin 1,247 puuttuvaa minuuttia kuuluivat lähes kokonaan ensimmäiseen luokkaan: ohut order book sunnuntaina kello 04:00 UTC, eikä kukaan käynyt kauppaa. Harmillista, helposti ymmärrettävää ja enimmäkseen vaaratonta, sillä strategia ei olisi käynyt kauppaa tuolloin muutenkaan. Juuri siksi lakkasin tutkimasta sitä ja palasin 43 minuuttiin.

43 minuuttia eivät olleet hajallaan

Jos puuttuvat minuutit jakautuisivat tasaisesti, vuoden 43 minuuttia olisivat 43 yksittäistä tapausta, yksi kahdeksan ja puolen päivän välein, kukin pyöristysvirheen veroinen. Näin ei käynyt. Puuttuvat minuutit tulivat kuudessa jaksossa: yhdessä oli 19 peräkkäistä minuuttia, yhdessä 11, kahdessa 4 ja lisäksi oli pari kahden minuutin jaksoa. Kuusi tapahtumaa, ei 43 sattumaa.

Tapahtumat riippuvat myös siitä, mikä sinua kiinnostaa. Välittäjät kaatuvat kuormituksen alla, ja kuormitusta syntyy hinnan liikkuessa. Jaoin vuoden kaikki tunnit toteutuneen volatiliteetin mukaan ja tarkistin, missä puuttuvat minuutit esiintyivät: 61% niistä osui ylimpään desiiliin. Minkä tahansa minuutin puuttumisen ehdoton todennäköisyys on 0.008%. Kun minuutti osuu volatiliteetin ylimmän desiilin tuntiin, todennäköisyys on noin 0.05% — kuusinkertainen, ja puuttumiset kasaantuvat vieläpä jaksoiksi.

Datan laadunvalvontanäkymän kattavuusmittari mittaa siis väärää asiaa. 99.992% kuulostaa aineistolta, jota ei tarvitse enää miettiä. Todellisuudessa se kuvaa aikasarjaa, joka on täydellinen niinä tunteina, jolloin strategiasi ei tee mitään, ja puutteellinen silloin, kun se tekee kaiken. Volatiliteetin kiihtymisestä käynnistyvän momentum-strategian todennäköisyys osua aukkoon on huomattavasti otsikkolukua suurempi, ja aukko osuu kesken kaupan.

Mitä eteenpäin täyttö saa aikaan muutamaa koodiriviä myöhemmin

Tämä virhe sai minut kirjoittamaan tämän. Otetaan 19 minuutin jakso. Tavanomainen siistiminen: lisää koko minuutti-indeksi, täytä OHLC-arvot eteenpäin viimeisellä päätöshinnalla ja aseta volyymiksi nolla. Aikasarja on nyt katkeamaton, ja indikaattorit toimivat ilman ainuttakaan NaN-arvoa.

Näiden 19 palkin high == low == close. True range on jokaisessa niistä nolla. Tästä ikkunasta laskettu ATR(14), kun sitä ennen lukema oli noin 240 USDT, laskee noin 34:ään ennen kuin välittäjä palaa toimintaan — ikkunaan jääneet 5 aitoa palkkia kantavat koko keskiarvon. Kun syötät tämän volatiliteettiin skaalattuun position kokolaskentaan, tavanomaiseen size = risk_budget / ATR-tyyppiseen, position koko seitsenkertaistuu.

Seuraava aito palkki on avauskauppa, eikä se ole rauhallinen. Meidän tapauksessamme se avautui 1.8% viimeistä ennen katkoa ollutta päätöskurssia korkeammalta. Backtest otti tyytyväisenä 7x-position 1.8% aukon kohdalla, täytöllä, jota ei olisi voinut tapahtua, hintaan, jota kukaan ei tarjonnut. Tuo yksi synteettinen kauppa oli osakekäyrällä arvokkaampi kuin kuukauden lailliset tuotot yhteensä, väärään suuntaan — ja sen aiheutti kokonaan datan siistimiseksi kirjoitettu rivi.

Rivien poistaminen täyttämisen sijaan ei sekään korjaa ongelmaa. Se on sama virhe eri asussa. Kun poistat rivit, kokonaislukupohjaiset lookback-jaksot antavat väärän kuvan: ”20 palkin EMA” kattaa nyt katkoksen yli 39 seinäkellominuuttia, rajan ylittävä palkkien tuotto sisältää koko 1.8% hypyn ikään kuin se olisi tapahtunut yhdessä minuutissa, ja jokainen palkkikohtainen volatiliteettiarvio tulkitsee sen 60 sigman tapahtumaksi. Mikään ei varoita tästä. Indeksi on edelleen monotoninen.

Uudelleennäytteistys piilottaa ongelman

Useimmat tutkimukset eivät käytä 1 minuutin palkkeja, vaan koostettua aineistoa, ja koostaminen siivoaa ongelman näkymättömiin. Kun uudelleennäytteistät 5 minuutin välein, 19 minuutin aukosta syntyy 4 palkkia, joista ensimmäinen ja viimeinen ovat vajaita. Pandas laskee kahdesta säilyneestä minuutista täysin järkeviltä näyttävät OHLC-arvot ja merkitsee palkin aivan samoin kuin viidestä minuutista koostetun. Tulosteesta ei näe, kumpi on kyseessä.

Halvin tuntemani korjaus: kuljeta bars_in_window-sarake mukana jokaisessa uudelleennäytteistyksessä, äläkä koskaan pudota sitä pois. Yksi kokonaisluku kullakin rivillä riittää siihen, että jokainen myöhempi kysymys palkin luotettavuudesta saa vastauksen. Kuljetamme mukana myös seconds_since_last_real_print-sarakkeen, jossa sama tieto on muodossa, jota toteutuskerros voi hyödyntää.

Käytäntömme, mikä se sitten onkaan

Näin agenttimme toimivat nyt:

  1. Älä koskaan lisää indeksin rivejä huomaamatta. Aineistolataaja tuottaa aukkoluettelon: alku, loppu, pituus ja arvio siitä, mihin neljästä luokasta aukko kuuluu. Jos puuttuvia minuutteja on alle 3 palkin verran ja ympäröivien palkkien volyymi on pieni, kyse on minuutista, jolloin kauppaa ei käyty. Kaikkia sitä pidempiä aukkoja aktiivisina tunteina käsitellään käyttökatkoina, kunnes toisin todistetaan.
  2. Hae aineisto uudelleen ennen tulkintaa. Puolet alkuvaiheen aukoistamme johtui sivutusvirheistä. Toinen haku eri rajapinnasta tai eri toimittajalta ratkaisee neljännen luokan tapaukset ja pienentää ongelmaa ennen kuin tulkintaa edes tarvitaan.
  3. Tarkista aineiston tuoreus, älä täytä aukkoja. Strategia saa syötteeksi data_age-arvon ja ehdottoman säännön: uusia positioita ei avata, jos viimeisestä aidosta kaupasta on yli N palkkia, ja avoimet positiot suljetaan markkinatoimeksiannolla vasta kaupankäynnin jatkuessa, hinnassa, josta on vähennetty erikseen määritelty aukkoriskivara. Täytöt, joita ei olisi voinut tapahtua, ovat pahempia kuin tekemättä jääneet kaupat.
  4. Indikaattoreille NaN, ei sepitettyjä arvoja. Eteenpäin täytetyt hinnat eivät koskaan päädy piirrekerrokseen. Jos ATR:ää ei voi laskea, sen arvo on määrittelemätön, ja määrittelemätön tarkoittaa, ettei positiota avata. Näkyvä virhe on parempi kuin huomaamaton 7x.
  5. Raportoi aukkojen lähellä tehdyt kaupat erikseen. Jokaisessa julkaisemassamme backtestissä näytetään P&L-tuloksen rinnalla tulos, josta on suljettu pois käyttökatkojen lähellä tehdyt kaupat. Jos tulos riippuu niistä kaupoista, se on data-artefakti.

Nopea tarkistus, jonka voit tehdä tänään: ryhmittele puuttuvat minuutit peräkkäisiksi jaksoiksi ja tarkista sitten, kuinka moni backtestisi kaupoista avataan tai suljetaan 30 minuutin sisällä jakson rajasta. Jos osuus jää alle 1%:n, aukot eivät luultavasti vaikuta tulokseen. Jos se on 5% tai enemmän, osakekäyräsi kertoo osittain välittäjän käyttökatkoista.

Olen oppinut luottamaan enemmän puuttumisten muotoon kuin niiden määrään. Aineisto, jossa on tuhansia yksittäisiä aukkoja hiljaisina tunteina, on yleensä kunnossa. Aineisto, jossa on muutama tiivis aukkojakso, kertoo jonkin hajoavan kuormituksen alla — ja juuri siellä, missä jokin hajoaa kuormituksen alla, strategiasi toimii.

ohlcv-aukotdatatekniikkabacktestausuudelleennäytteistyskryptofutuurit
← Kaikki kirjoitukset