3. september 2026 · andmetehnika

Minutid, mida pole olemas: lüngad, seisakud ja nullmahuga küünlad OHLCV ajaloos

Minutid, mida pole olemas: lüngad, seisakud ja nullmahuga küünlad OHLCV ajaloos

Kalendriaasta jagu 1-minuti küünlaid peaks andma 525,600 rida. Meie 2025. aasta BTCUSDT perpide päring andis 525,557 — puudu oli 43 minutit, täielikkus 99.992%. Sama platvormi keskmise turuväärtusega altcoini perp andis sama päringu ja sama koodiga 1,247 rida vähem: 99.76%. Sama aasta USA aktsiate minutiseeria sisaldas krüptoseeriaga võrreldes ligikaudu 427,000 rida vähem, kuid see pole lünk — turg lihtsalt sulgub.

Kolm neist arvudest pole kuigi huvitavad. See 43 väärib aga tuhandet sõna.

525,6001-minuti küünalt liigaasta-välisel aastal
0.008%BTCUSDT andmetest puudu 2025. aastal
61%neist minutitest langes suure volatiilsusega tundide ülemisse detsiili

Neli eri asja, mis kõik näevad sinu andmetabelis välja nagu auk

Enne 43 juurde jõudmist tuleb paika panna liigitus, sest enamik lünkade käsitlemise koodist eksib juba selles etapis. Kui kohalikust parquet-failist rida puudub, ei tea sa, milline neist põhjustest selle tekitas, ja igal juhul on õige lahendus erinev.

TüüpMis tegelikult juhtusKuidas see avaldubÕige lahendus
Tehinguid polnudTurg oli avatud, kuid keegi ei ületanud sellel minutil hinnavahetMõne API puhul nullmahuga küünal (OHLC väärtused võrdsed, trades=0), teistel puuduv ridaJäta alles. See on päris info: keegi ei tahtnud kaubelda.
Platvorm maasSobitusmootor maas, plaanipäraselt või ootamatultPuuduv rida, vahel mitu järjestMärgi aegunuks. Ära kauple üle selle.
Instrumendi kauplemispeatusLULD hinnapiiri rikkumine, uudise ootelolek, börsilt eemaldamise teadePuuduv rida, millele järgneb kauplemise taastumise oksjoni tehingMärgi aegunuks ja käsitle kauplemise taastumist katkestusena.
Sinu vigaPäringute lehekülgede kaupa laadimise piirang, lehe vahele jätnud korduskatse, tsoneerimisvea tõttu tekkinud piiriviga tsüklisPuuduv rida, mida ei saa eelmistest eristadaTuvasta ja laadi uuesti. Selle vea saad ise parandada.

Platvormid käsitlevad tabeli esimest rida erinevalt, ja see tekitabki probleeme. Coinbase'i küünalde lõpp-punkt jätab tühjad ajavahemikud üldse vahele, nii et vähe kaubeldud paari ajalugu on täis päris lünki. Binance'i kline'id annavad üldjuhul sünteetilise küünla, mille maht on 0 ja mille open=high=low=close väärtused on fikseeritud eelmise tehingu hinnale. Sama tegelik olukord, kaks eri kuju; terve minutivõrgustikuga ümberindekseeriv laadija muudab ühe teiseks, sellest märku andmata. Uuri välja, kuidas sinu platvorm käitub, enne kui lünkade täitja kirjutad, mitte pärast.

Altcoini 1,247 puuduvat minutit kuulusid peaaegu täielikult esimesse kategooriasse: õhuke orderiraamat pühapäeval kell 04:00 UTC ja keegi ei kaubelnud. Tüütu, lihtne mõista ja suures osas kahjutu, sest strateegia poleks niikuinii siis tehingut teinud. Just seepärast lõpetasin selle uurimise ja pöördusin tagasi 43 juurde.

43 minutit polnud juhuslikult laiali

Kui puuduvad küünlad jaotuksid ühtlaselt, oleks 43 minutit aasta peale 43 üksikut lünka — iga kaheksa ja poole päeva järel üks, igaüks ümardusvea suurune. Nii see polnud. Puudumised jagunesid kuueks järjestikuseks lõiguks: üks 19-minutiline, üks 11-minutiline, kaks 4-minutilist ja paar kahekaupa esinenud lünka. Kuus juhtumit, mitte 43 juhuslikku puudumist.

Need juhtumid sõltuvad just sellest, mis sulle oluline on. Platvormid lähevad koormuse all rivist välja, ja koormus tekib siis, kui hind liigub. Jagasin aasta kõik tunnid realiseeritud volatiilsuse järgi rühmadesse ja vaatasin, millistes tundides puuduvad minutid esinesid: 61% neist jäi ülemisse detsiili. Suvalise minuti tingimusteta puudumise tõenäosus on 0.008%. Kui minut jääb ülemise detsiili volatiilsusega tunni sisse, on tõenäosus ligikaudu 0.05% — kuus korda suurem, ja lüngad koonduvad lisaks üksteise lähedale.

Seega mõõdab sinu andmekvaliteedi töölaua täielikkuse näitaja valet asja. 99.992% paistab piisavalt hea, et andmestiku pärast enam mitte muretseda. Tegelikult kirjeldab see aegrida, mis on täielik tundidel, mil sinu strateegia midagi ei tee, ja auklik tundidel, mil see teeb kõike. Volatiilsuse kasvule reageeriv momentumistrateegia puutub lüngaga kokku märksa tõenäolisemalt, kui pealkirjas olev number näitab, ja see juhtub poolelioleva tehingu ajal.

Mida edasikandmine kolm rida hiljem teeb

Siin on viga, mille tõttu selle loo kirjutasin. Võta see 19-minutiline lõik. Tavaline andmete korrastamine: loo kogu minutivõrgustik, kanna OHLC väärtused edasi viimasest sulgemishinnast ja määra mahuks null. Aegrida on nüüd katkematu ja sinu indikaatorid töötavad ilma ühegi nähtava NaN-ita.

Nende 19 küünla puhul kehtib high == low == close. Tõeline vahemik on igaühel null. Selles aknas arvutatud ATR(14) langeb enne katkestust umbes 240 USDT tasemelt ligikaudu 34-ni selleks ajaks, kui platvorm taas tööle hakkab — akna sees säilinud viis päris küünalt määravad kogu keskmise. Anna see volatiilsuse järgi skaleeritud positsiooni suuruse arvutajale, tavalisele size = risk_budget / ATR tüüpi arvutajale. Positsiooni suurus kasvab seitsmekordseks.

Järgmine päris küünal on kauplemise taastumise tehinguhind ja see pole sugugi rahulik. Meie näites avanes see 1.8% kaugusel viimasest katkestuseelsest sulgemishinnast. Tagatest võttis rõõmsalt 7x positsiooni 1.8% suurusesse hinnahüppesse, täitmishinnaga, mida poleks saanud tekkida, hinnaga, mida keegi ei noteerinud. See üks sünteetiline tehing oli omakapitali kõveral väärt rohkem kui kuu aega seaduspärast kasumit-kahjumit, kuid vales suunas — ja sündis täielikult andmepuhastuse reast, mille eesmärk oli andmetabel korda seada.

Ridade kustutamine täitmise asemel pole samuti lahendus — sama viga, lihtsalt teise maskiga. Kustuta need ja täisarvulisel indeksil põhinevad tagasiulatuvad vahemikud hakkavad valetama: „20 küünla EMA” hõlmab nüüd katkestuse jooksul 39 minutit, küünalde piiri ületav tootlus on kogu 1.8% hüpe, mida käsitletakse ühe minuti liikumisena, ja iga küünla volatiilsuse hinnang loeb selle 60-sigma sündmuseks. Miski ei hoiata sind. Indeks on endiselt monotoonne.

Agregeerides muutub probleem nähtamatuks

Enamik analüüse ei tööta 1-minuti küünaldega, vaid agregeeritud andmetega, ja agregeerimine peseb probleemi puhtaks. Agregeeri 5-minuti küünaldeks ja 19-minutilisest august saab neli küünalt, millest esimene ja viimane on osalised. Pandas arvutab kahest säilinud minutist täiesti usutava OHLC ja märgib selle samamoodi nagu viiest minutist koostatud küünla. Väljundis ei erista neid miski.

Odavaim lahendus, mida tean: kanna igal agregeerimisel kaasa veergu bars_in_window ja ära seda kunagi eemalda. Üks täisarv igal real ning kõik hilisemad küsimused küünla usaldusväärsuse kohta saavad vastuse. Lisaks kanname kaasa välja seconds_since_last_real_print, mis sisaldab sama infot kujul, mille põhjal täitmiskomponent saab tegutseda.

Meie põhimõtted

Praegu rakendavad meie agendid järgmisi reegleid selles järjekorras:

  1. Ära kunagi loo ümberindekseerimisel lünki vaikselt. Laadija väljastab lünkade manifesti: algus, lõpp, pikkus ja arvamus selle kohta, millisesse neljast kategooriast lünk kuulub. Kui puuduvate minutite lõik on lühem kui 3 küünalt ja ümbritsevate küünalde maht on väike, on tegu minutiga, mil tehinguid ei tehtud. Pikemat puudumist aktiivsetel kauplemistundidel käsitleme katkestusena, kuni pole tõestatud vastupidist.
  2. Laadi andmed uuesti, enne kui neid tõlgendad. Pooled meie varasematest lünkadest olid lehekülgede kaupa laadimise vead. Teine päring teisest lõpp-punktist või teiselt andmepakkujalt lahendab neljanda kategooria ja vähendab probleemi, enne kui midagi otsustama peab.
  3. Kasuta aegumiskontrolli, mitte lünkade täitmist. Strateegia saab sisendiks väärtuse data_age ja range reegli: uusi positsioone ei avata, kui viimane päris tehinguhind on vanem kui N küünalt; avatud positsioonid suletakse kauplemise taastumisel ainult turukorraldusega, mille hinnas on selgesõnaline lüngariski allahindlus. Täitmised, mida poleks saanud toimuda, on hullemad kui tegemata jäänud tehingud.
  4. Indikaatorid näevad NaN-i, mitte väljamõeldud väärtusi. Edasikantud hinnad ei jõua tunnuste kihti. Kui ATR-i ei saa arvutada, jääb see määratlemata, ja määratlemata tähendab, et positsioon on null. Selge tõrge on parem kui vaikne 7x.
  5. Esita tulemused lünkade suhtes tingimuslikult. Iga väljastatava tagatesti juures näitame kasumit-kahjumit koos katkestuste lähedal tehtud tehinguid välistava tulemusega kõrvuti üldtulemusega. Kui tulemust kannavad need tehingud, on tegu andmete loodud illusiooniga.

Kiire kontroll, mille saad kohe teha: rühmita puuduvad minutid järjestikusteks lõikudeks ja vaata siis, kui suur osa sinu tagatesti tehingutest avatakse või suletakse 30 minuti jooksul lõigu algusest või lõpust. Kui osakaal jääb alla 1%, ei mõjuta lüngad tõenäoliselt tulemust. Kui see on vähemalt 5%, räägib omakapitali kõver osaliselt börsi seisakutest.

Olen õppinud usaldama puudumiste mustrit, mitte nende hulka. Andmestik, kus surnud tundidel on tuhandeid laialipillatud lünki, on tavaliselt korras. Andmestik, kus on käputäis tihedaid lüngakobaraid, annab märku, et midagi läheb koormuse all katki — ja just koormuse all katki mineku kohas sinu strateegia tegutsebki.

OHLCV lüngadandmetehnikatagatestimineagregeeriminekrüptofutuurid
← Kõik postitused