2026 m. rugpjūčio 26 d. · rinkos duomenys

Vienos 1 minutės juostos anatomija: ko OHLCV nepasako jūsų backtestui

Vienos 1 minutės juostos anatomija: ko OHLCV nepasako jūsų backtestui

Štai viena juosta. Binance USDⓈ-M perpetual, BTCUSDT, minutė, prasidedanti 13:46:00 UTC. Iš klines endpoint ji atkeliavo kaip paprastas dvylikos reikšmių masyvas ir yra dažniausias mažmeniniuose bei artimuose quant tyrimuose naudojamas įvesties vienetas. Beveik kiekviena mūsų generuojama strategija paliečia kažką, kas atrodo būtent taip.

Taigi išardykime ją indeksą po indekso ir pažiūrėkime, kiek jos backtestas supranta neteisingai.

IndeksasReikšmėPavadinimas
01773495960000atidarymo laikas (ms)
1\"84120.50\"atidarymas
2\"84177.90\"aukščiausia reikšmė
3\"84098.10\"žemiausia reikšmė
4\"84163.40\"uždarymas
5\"38.417\"bazinis tūris (BTC)
61773496019999uždarymo laikas (ms)
7\"3232108.94\"kotiruojamas tūris (USDT)
81204sandorių skaičius
9\"21.883\"taker pirkimo bazinis tūris
10\"1841203.55\"taker pirkimo kotiruojamas tūris
11\"0\"ignoruoti

[0] ir [6]: kuri tai minutė ir kieno laikrodis tai sako

Atidarymo laikas 1773495960000, uždarymo laikas 1773496019999. Atkreipkite dėmesį į antrąjį: jis baigiasi 19999 — viena milisekunde anksčiau nei kitos juostos pradžia. Langas yra pusiau atviras, ir birža tai aiškiai nurodo. Pusė duomenų klaidų, su kuriomis susidūriau, prasidėjo nuo to, kad kažkas abu galinius taškus laikė įtrauktais ir du kartus suskaičiavo sandorį ties riba arba suderino resampling taip, kad kiekviena 5 minučių juosta pasiskolino milisekundę iš kaimyninės.

Laiko žymos yra biržos matching engine laikas. Ne jūsų laikrodis, ne tiekėjo duomenų priėmimo laikrodis ir ne tas pats laikrodis, kurį naudoja funding snapshot. Kai sujungiate kline seriją su funding-rate serija arba open-interest serija, gauta iš kito endpoint, jungiate šaltinius, kurie dažniausiai sutampa maždaug vienos sekundės tikslumu. 1 minutės strategijai tai yra 1.7% laiko paklaida kiekvienoje sujungtoje eilutėje. Viskam, kas trumpiau nei minutė, tai pražūtinga.

Ši juosta pažymėta jos atidarymo laiku. Joje esanti informacija tampa žinoma tik 13:46:59.999. Kiekvienas indeksavimo konvencijos klausimas — ar paslinkti viena pozicija, ar naudoti bar-close, ar bar-open laiko žymas kaip įvykio laiką — iš tikrųjų tėra tas pats lookahead klausimas, tik su kitu kostiumu.

[1] \"84120.50\": atidarymas, kuriuo negalite prekiauti

Atidarymas yra pirmojo lange įvykusio sandorio kaina. Tai užbaigtas sandoris tarp dviejų kitų žmonių. Kai juosta tampa eilute jūsų dataframe, ši kaina jau yra šešiasdešimties sekundžių senumo.

Ankstesnė juosta užsidarė ties 84109.80, taigi tarp dviejų gretimų 1 minutės juostų yra $10.70 kainos judėjimo tarpas. Tai 1.3 bazinio punkto — grafike nematoma ir maždaug ketvirtadalis taker mokesčio. Nieko tokio. Tačiau pažiūrėkite į tą pačią seriją per alt perp JAV CPI paskelbimo metu ir šie tarpjuostiniai tarpai siekia 15–40 bps. Backtestas, kuris generuoja signalą ties juostos uždarymu ir vykdo sandorį kitos juostos atidaryme, tyliai daro prielaidą, kad tarpas lygus nuliui, ir jis lygus nuliui būtent tada, kai tai neturi reikšmės.

[2] ir [3]: \"84177.90\" aukščiausia reikšmė, \"84098.10\" žemiausia reikšmė

Būtent čia dauguma fill engine žlunga, todėl ši dalis bus ilga.

Aukščiausia ir žemiausia reikšmės yra ekstremalios pasiektos kainos. Jos nepasako nei apie kiekį, nei apie trukmę. Iš to paties periodo neapdorotos sandorių juostos matyti, kad viskas ties 84100.00 arba žemiau sudarė 0.62 BTC per devynis sandorius 1.4 sekundės lange. Taigi backtesto stopas ties 84100 \"įvykdomas\" — o jei jūsų pozicija yra 3 BTC, leidžiantis suvalgėte visą matomą order book, o likęs kiekis buvo įvykdytas kažkur 84105–84130 grįžimo kelyje. Juosta sako, kad žemiausia reikšmė buvo 84098.10. Ji nepasako, kad ten buvo prekiauta tik už $52,000 nominalo.

1204sandoriai per minutę
0.032 BTCvidutinis sandorio dydis (~$2.7k)
0.62 BTCvisa apimtis, prekiauta ties žemiausiu tick arba žemiau jo
57%apimties inicijavo pirkėjai

Kita kryptis dar blogesnė, nes ji jums pataikauja. Tarkime, kad turėjote pasyvų limit sell ties 84175. Juostos aukščiausia reikšmė yra 84177.90, todėl naivus engine įvykdo jūsų pavedimą ties 84175 ir įrašo maker rebate, o ne taker kainą. Ar pavedimas iš tikrųjų buvo įvykdytas, priklauso nuo eilės pozicijos tame kainos lygyje, kurios juosta negali žinoti, o jūs tikriausiai niekada nefiksavote. Pasiekta nereiškia įvykdyta.

Taisyklė, prie kurios priėjome savo fill engine: pasyvus limit pavedimas įvykdomas tik tada, kai juosta pereina per tą lygį, o ne tik jį pasiekia. Įvykdymai ties tikslia ekstremalia tick reikšme reikalauja volume-at-price įrodymų iš sandorių juostos; kitu atveju jie atmetami. Tai iš tipinės mean-reversion knygos pašalino maždaug 6% sandorių ir vieno kandidato backtested Sharpe sumažino nuo 1.9 iki 1.1. Tas kandidatas niekada nebuvo realus; fill taisyklė buvo tiesiog pirmas dalykas, pakankamai sąžiningas tai pasakyti.

Susijusi spąstai: intrabar kelias. Jei juostos intervalas apima ir jūsų stopą, ir take-profit, OHLCV negali pasakyti, kuris įvyko pirmas. Kiekvienas engine turi pasirinkti konvenciją. Mes visada darome prielaidą, kad pirmas suveikia stopas — tai pesimistiška, kartais klaidinga, bet niekada nesukuria netikro laimėjimo. Jei jūsų engine daro prielaidą, kad pirmas suveikia take-profit, didelio diapazono juostos iš dviprasmybės gamins pelną, o būtent tokios juostos dominuoja jūsų PnL pasiskirstyme.

[4] \"84163.40\": mažiausiai patikimas juostos skaičius

Uždarymas yra paskutinis lange įvykęs sandoris. Tiek. Tai gali būti 0.002 BTC odd-lot iš bot, užbaigiančio poziciją 13:46:59.8. Šią vieną, struktūriškai atsitiktinę tick reikšmę dauguma tyrimų pipeline naudoja kiekvienam signalui apskaičiuoti, kiekvienai pozicijai įvertinti ir kiekvienam išėjimui vertinti.

BTC perps rinkoje tai beveik nesvarbu; plonai prekiaujamame altcoin perp 04:00 UTC tai gali būti milžiniškai svarbu, o skirtumas tarp dviejų venue uždarymo kainų tą pačią minutę gali viršyti visą jūsų pelno pranašumą iš vieno sandorio. Kai strategijos PnL konkrečiai priklauso nuo uždarymo, paleidžiame ją iš naujo, vertindami pagal biržos mark price — ji gaunama iš indekso ir ją daug sunkiau pajudinti. Jei rezultatai išsiskiria, strategija prekiavo artefaktu.

[5] ir [7]: \"38.417\" ir \"3232108.94\", kokiais vienetais matuojama apimtis

Bazinis tūris yra BTC, kotiruojamas tūris — USDT. Čia pateikti abu, o tai yra patogumas, kurį suteikia ne visos venue. Tai svarbu agreguojant duomenis iš skirtingų venue. Coin-margined kontraktai kotiruojami kontraktais, kurių kiekvieno nominali vertė yra $100. Kai kurie equities feed pateikia round lot dydžius. Prediction market venue pateikia akcijų skaičių, kai viena akcija yra doleriais išreikštas binarinis teiginys. Sudėję \"tūrį\" iš mišrios visatos ir nesunormalizavę jo į vieną nominalo vienetą gausite gryną nesąmonę — be to, tokią, kuri atrodo stabili ir sėkmingai išlieka peržiūrose.

Įkėlimo metu viską normalizuokite į kotiruojamą nominalą. Žalią lauką taip pat saugokite, bet niekada neleiskite jo matyti strategijai.

[8] 1204: laukas, kuris turėtų nustatyti jūsų impact model

Bazinio tūrio dalis, tenkanti vienam sandoriui, duoda 0.032 BTC vidutinį sandorį, maždaug $2,700. Jei jūsų kandidatinė strategija nori iškart įeiti už $250,000, ji prašo maždaug 92 kartus viršyti įprasto tos minutės sandorio dydį. Būtent šis skaičius, o ne bendrinė 5 bps slippage konstanta, turėtų valdyti jūsų square-root impact terminą. Dalyvavimo normą skaičiuojame kiekvienai juostai kaip pirmos klasės stulpelį ir atmetame strategijas, kurių medianinis įėjimas viršija kelis procentus juostos nominalo, nes visa, kas eina toliau, yra fikcija.

Sandorių skaičius taip pat pigiai išryškina keistas minutes. Apimtis normali, o sandorių skaičius nukrito iki 11? Kažkas įvykdė block sandorį. Apimtis normali, o sandorių skaičius siekia 9,000? Tai likvidacijų kaskada, suskaidyta į mažyčius gabalus.

[9] ir [10]: \"21.883\", laukas, kurį visi išmeta

Taker pirkimo bazinis tūris. Šioje juostoje pirkėjai inicijavo 21.883 iš 38.417 BTC, todėl pasirašytas tūrio delta yra +5.349 BTC, o agresoriaus dalis pirkėjų naudai yra 57/43. Birža jums nemokamai perduoda order flow disbalansą lauke, kurio dauguma žmonių niekada neskaito, nes pandas jiems neįvardijo stulpelio.

Nesakau, kad tai savaime prognozuoja grąžą; naivios delta strategijos yra vienas patikimiausių būdų paaukoti pinigų mokesčių knygai. Tačiau tai iš tiesų kitoks matavimas nei kaina, jis gaunamas tame pačiame request, kurį jau siunčiate, ir leidžia atskirti ralį, kurį nupirko pirkėjai, nuo ralio, įvykusio todėl, kad pardavėjai pasitraukė. OHLC požiūriu šie du atvejai atrodo identiškai, bet po dešimties minučių elgiasi skirtingai. Mūsų research agent hipotezę, ignoruojančią taker split venue, kuri jį skelbia, vertina kaip įrodymų palikimą ant stalo.

[11] \"0\": ignoruoti — ir visa kita, ko čia nėra

Indeksas 11 yra pasenęs laukas, visam laikui lygus nuliui. Įdomesnis yra dalykų, kurių ši juosta neturi, sąrašas: nėra bid, ask, spread, order book gylio, funding rate, open interest, likvidacijų, mark price, index price. Ir svarbiausia — nėra būdo sužinoti, ar jūsų pavedimas būtų buvęs maker ar taker, o tai šioje venue reiškia skirtumą tarp 0.045% sumokėjimo ir 0.01% uždirbimo.

Taigi bet koks fee model, sukurtas vien iš klines, yra prielaida, apsirengusi skaičiaus drabužiais. Mes tai išsprendžiame priversdami kiekvieną strategiją iš anksto deklaruoti vykdymo stilių, o tada taikydami taker mokestį viskam, kas negali įrodyti priešingai.

Juosta, kuri niekada nepasirodė

Paskutinis gabalas — ir labiausiai kandantis už didžiųjų instrumentų ribų. Minutė, per kurią neįvyko nė vienas sandoris, apskritai nesukuria kline. Tiekėjai ir bibliotekos dažnai ją užpildo ankstesne reikšme: open = high = low = close = ankstesnis close, volume 0. Jūsų indikatorius skaičiuoja ramiai. Jūsų strategija mato galiojančią eilutę ir gali generuoti signalą minutei, per kurią niekas pasaulyje neprekiavo tuo instrumentu.

Viename vidutinės kapitalizacijos perp, kurį įkėlėme, 4.1% 1 minutės juostų per dvylikos mėnesių langą neturėjo nė vieno sandorio. Mean-reversion kandidatas tam simboliui vykdė 38% įėjimų sintetinėse juostose, nes lygios sintetinės kainos yra tikras medus viskam, kas matuoja nuokrypį nuo slankiojo vidurkio. Backteste jis atrodė nuostabiai. Jis prekiavo duomenų spragomis.

Todėl ingest sluoksnis dabar turi synthetic boolean kiekvienai juostai, kuris perduodamas per kiekvieną resample, o verification gauntlet atmeta bet kurią strategiją, kurios sandoriai susitelkia būtent jose. Pigus stulpelis. Jis pražudė daugiau kandidatų nei bet kuris indikatorius, kurį kada nors parašėme.

Dvylika reikšmių. Keturios iš jų nuolat klaidingai interpretuojamos, dvi nuolat išmetamos, o visa kategorija reikšmių neegzistuoja eilutėje, tačiau engine jas įsivaizduoja. Prieš kitą backtestą išsitraukite vieną žalią juostą iš savo saugyklos ir garsiai perskaitykite kiekvieną lauką, palygindami su tuo, ką jūsų fill logika apie jį mano. Tai dvidešimties minučių pratimas, ir dar nemačiau žmogaus, kuris jį atlikęs nieko nerastų.

ohlcvrinkos mikrostruktūraduomenų inžinerijabacktestingkriptovaliutų ateities sandoriai
← Visi įrašai