2026. szeptember 3. · adatkezelés

Nem létező percek: rések, leállások és nulla forgalmú gyertyák az OHLCV-előzményekben

Nem létező percek: rések, leállások és nulla forgalmú gyertyák az OHLCV-előzményekben

Egy naptári évnyi 1 perces gyertyának 525,600 sort kellene tartalmaznia. A BTCUSDT perpetual ügyletekre vonatkozó 2025-ös lekérésünk 525,557 sort adott — 43 perc hiányzott, az adatok teljessége 99.992% volt. Egy közepes kapitalizációjú altcoin perpetual ügyleteiről ugyanazon a platformon, ugyanazzal a lekéréssel és kóddal 1,247 sor hiányzott: a teljesség 99.76% volt. Egy amerikai részvény ugyanilyen éves perces adatsorából nagyjából 427,000 sorral kevesebb volt, mint a kriptósból. Ez nem adatrés, csak annyi, hogy a piac bezár.

A három szám közül kettő nem különösebben érdekes. A 43 az, amelyik ezer szót ér.

525,6001 perces gyertya egy nem szökőévben
0.008%hiányzott a BTCUSDT-adatsorból 2025-ben
61%ezek közül a percek közül a volatilitás felső tizedébe eső órákra jutott

Négy különböző dolog, ami mind lyuknak látszik az adatkeretedben

Mielőtt rátérnék a 43-ra, tisztázzuk a kategóriákat, mert a legtöbb réskezelő kód már ezen a ponton hibás. Ha hiányzik egy sor a helyi parquet-adatodból, nem tudhatod, melyik okból hiányzik, a helyes teendő pedig mindegyik esetben más.

TípusMi történt valójábanHogyan jelenik megHelyes teendő
Nem volt kötésA piac nyitva volt, de abban a percben senki nem ütötte meg a spreadetEgyes végpontokon nulla forgalmú gyertya (az OHLC-értékek egyenlők, trades=0), máshol hiányzó sorTartsd meg. Valódi információ: senki nem akart kereskedni.
Leállt a platformNem működött a párosító motor, akár tervezetten, akár váratlanulHiányzó sor, néha több hiányzó sor egymás utánJelöld elavultnak. Ne kereskedj a résen át.
Instrumentum-kereskedés felfüggesztveLULD-sáv átlépése, függőben lévő hír, kivezetési értesítésHiányzó sor, majd egy nyitó aukciós kötésJelöld elavultnak, az újranyitást pedig kezeld ugrásként.
A te hibádKéréskorlátozás miatti lapozás, egy oldalt kihagyó újrapróbálkozás, időzónahatár-hiba a ciklusbanHiányzó sor, nem lehet megkülönböztetni a fentiektőlÉszleld és kérd le újra. Ezt tudod kijavítani.

A platformok eltérően kezelik a táblázat első sorát, és ez okozza a gondot. A Coinbase gyertyavégpontja teljesen kihagyja az üres időszakokat, így egy illikvid pár előzményei tele vannak valódi lyukakkal. A Binance klines végpontja általában szintetikus gyertyát ad vissza 0 forgalommal, ahol az open=high=low=close értéke az előző kötés árán áll. Ugyanaz a tény, kétféle formában; egy teljes perces rácsra újraindexelő adatbetöltő pedig észrevétlenül az egyiket a másikká alakítja. Mielőtt megírod a réspótlót, nézd meg, mit csinál a platformod — ne utána.

Az altcoin 1,247 hiányzó perce szinte mind az első kategóriába tartozott: vasárnap 04:00 UTC-kor vékony volt a könyv, senki nem kereskedett. Bosszantó, könnyen értelmezhető, és többnyire ártalmatlan, mert a stratégia amúgy sem kereskedett volna akkor. Pont ezért hagytam abba a vizsgálatát, és tértem vissza a 43-hoz.

A 43 perc nem véletlenszerűen szóródott szét

Ha a hiányok egyenletesen oszlottak volna el, az évi 43 perc 43 magányos hiányként jelentkezne, nyolc és fél naponta egy, mindegyik kerekítési hibának tűnne. Nem ez történt. Hat szakaszban jelentkeztek: egy 19 egymást követő perces, egy 11 perces, két 4 perces és néhány páros hiány. Hat esemény, nem 43 véletlen eset.

Ráadásul az események épp attól függnek, ami neked fontos. A platformok akkor állnak le, amikor túlterheltek, túlterheltek pedig akkor, amikor mozog az ár. Az év minden óráját realizált volatilitás szerint csoportosítottam, majd megnéztem, hol fordultak elő a hiányzó percek: 61%-uk a felső tizedbe esett. Annak a feltétel nélküli valószínűsége, hogy egy adott perc hiányzik, 0.008%. Ha a perc a volatilitás felső tizedébe eső órára jut, ez nagyjából 0.05% — hatszor magasabb, ráadásul a hiányok csoportosulnak is.

Vagyis az adatminőségi irányítópultod teljességi mutatója rosszat mér. A 99.992% úgy hangzik, mintha többé nem kellene foglalkoznod az adathalmazzal. Valójában azt írja le, hogy az adatsor azokban az órákban teljes, amikor a stratégiád nem csinál semmit, és lyukas, amikor mindent csinál. Egy, volatilitás-növekedésre aktiválódó momentumrendszer a fő mutató alapján vártnál jóval nagyobb eséllyel fut bele résbe, mégpedig nyitott pozícióval.

Mit tesz az előre kitöltés három sorral később

Ez az a hiba, ami miatt megírtam ezt a cikket. Vegyük a 19 perces szakaszt. A szokásos adattisztítás: újraindexelés a teljes perces rácsra, az OHLC előre kitöltése az utolsó záróárral, a forgalom beállítása nullára. Az adatsor most már folytonos, az indikátoraid pedig NaN nélkül lefutnak.

Ennek a 19 gyertyának a high == low == close értékű. Mindegyiknél nulla a true range. Ha ezen az időszakon ATR(14)-et számítasz, akkor a leállás előtti, nagyjából 240 USDT-s értékről körülbelül 34-re csökken, mire a platform újra működik — az időszakban megmaradt 5 valódi gyertya viszi a teljes átlagot. Ezt betáplálod egy volatilitás alapján skálázó pozícióméretezőbe, a szokásos size = risk_budget / ATR típusúba. A pozícióméret hétszeresére nő.

A következő valódi gyertya az újranyitási kötés, és egyáltalán nem nyugodt. A mi esetünkben 1.8%-kal az utolsó leállás előtti záróár fölött nyitott. A visszateszt gond nélkül felvett egy 7x-es pozíciót az 1.8%-os résbe, olyan áron, amelyen nem is jöhetett volna létre kötés, és amelyet senki nem jegyzett. Ez az egyetlen szintetikus ügylet többet ért a tőkeegyenleg-görbén, mint egyhavi valódi P&L — rossz irányba. Az egész egyetlen, az adatkeret rendbetételére írt adattisztító sorból indult.

A sorok törlése a kitöltés helyett sem megoldás, ugyanaz a hiba más köntösben. Ha törlöd őket, az egész számmal megadott indexű visszatekintési ablakok félrevezetnek: a „20 gyertyás EMA” most 39 falióra-percet fed le a leállás miatt; a határon átnyúló, gyertyáról gyertyára számított hozam az egész 1.8%-os ugrást egy percnyi mozgásként kezeli; bármely gyertyánkénti volatilitásbecslés pedig 60 szigmás eseménynek veszi. Semmi nem figyelmeztet. Az index továbbra is monoton nő.

Újramintavételezéskor válik láthatatlanná

A legtöbb kutatás nem 1 perces gyertyákon fut, hanem valamilyen összesített adaton, az összesítés pedig elfedi a problémát. Ha 5 perces gyertyákra mintavételezel újra, a 19 perces résből 4 gyertya lesz, amelyek közül az első és az utolsó csak részleges. A Pandas teljesen ésszerűnek tűnő OHLC-értéket számít 2 megmaradt percből, és ugyanúgy címkézi, mint azt a gyertyát, amely 5 percből épül fel. A kimenetben semmi nem különbözteti meg őket.

A legolcsóbb megoldás, amit ismerek: vigyél tovább egy bars_in_window oszlopot minden újramintavételezésen keresztül, és soha ne dobd el. Soronként egy egész szám, és minden további kérdés megválaszolható arról, hogy megbízható-e az adott gyertya. Mi a seconds_since_last_real_print értéket is továbbvisszük, mert ez ugyanezt az információt olyan formában tartalmazza, amellyel a végrehajtási réteg dolgozni tud.

Az irányelvünk

Az ügynökeink most ezt alkalmazzák, ebben a sorrendben:

  1. Soha ne indexelj újra észrevétlenül. Az adatbetöltő réstérképet készít: kezdés, befejezés, időtartam, és hogy a négy kategória közül melyikbe sorolja a hiányt. Ha a hiányzó percek szakasza 3 gyertyánál rövidebb, és a környező gyertyák forgalma alacsony, akkor kötés nélküli percről van szó. Aktív időszakban minden ennél hosszabb hiányt leállásnak tekintünk, amíg az ellenkezője be nem bizonyosodik.
  2. Kérd le újra, mielőtt értelmezed. A korai hiányaink felét lapozási hiba okozta. Egy másik végpontról vagy szolgáltatótól indított második lekérés tisztázza a negyedik kategóriát, és még azelőtt csökkenti a problémát, hogy ítéletet kellene alkotnunk.
  3. Elavultsági korlát, nem réskitöltés. A stratégia egy data_age bemenetet kap, mellé pedig egy szigorú szabályt: nincs új belépés, ha az utolsó valódi kötés N gyertyánál régebbi, a nyitott pozíciókat pedig újranyitáskor csak piaci megbízással zárjuk, kifejezetten a rés kockázatára számított árengedménnyel. A nem létező kötések rosszabbak a meg nem kötött ügyleteknél.
  4. Az indikátorok NaN-t látnak, nem kitalált adatot. Az előre kitöltött árak soha nem jutnak el a jellemzőréteghez. Ha az ATR nem számítható ki, akkor nincs meghatározva, a meghatározatlan érték pedig azt jelenti, hogy nincs pozíció. A hangos hiba jobb, mint egy észrevétlen 7x-es méretezés.
  5. Jelentsd a résektől függő teljesítményt. Minden általunk kiadott visszatesztben a fő P&L mellett feltüntetjük az áramszünetekhez közeli ügyletek nélkül számított P&L-t is. Ha ezek az ügyletek hozzák az eredményt, akkor az eredmény adatfeldolgozási műtermék.

Egy gyors ellenőrzés, amit már ma elvégezhetsz: csoportosítsd a hiányzó perceket egymást követő szakaszokba, majd nézd meg, hogy a visszateszt ügyleteinek mekkora hányada nyílik vagy zárul egy szakasz kezdetétől vagy végétől számított 30 percen belül. Ha 1% alatt van, a rések valószínűleg nem befolyásolnak semmit. Ha eléri az 5%-ot, a tőkeegyenleg-görbe részben a tőzsdei leállásokról szóló történet.

Én a hiányok alakjának hiszek, nem a számuknak. Egy adathalmaz, amelyben több ezer lyuk van elszórva a csendes órákban, általában rendben van. Egy olyan adathalmaz néhány szoros hiánycsoporttal azt jelzi, hogy nagy terhelésnél valami meghibásodik. A stratégiád pedig éppen ott működik, ahol nagy terhelésnél meghibásodik valami.

ohlcv-résekadatkezelésvisszatesztelésújramintavételezéskriptovaluta-határidős ügyletek
← Összes bejegyzés