3 September 2026 · kejuruteraan data

Minit yang tidak wujud: jurang, henti dagangan dan bar volum sifar dalam sejarah OHLCV

Minit yang tidak wujud: jurang, henti dagangan dan bar volum sifar dalam sejarah OHLCV

Data bar 1 minit bagi satu tahun kalendar sepatutnya mempunyai 525,600 baris. Data perps BTCUSDT yang kami tarik untuk 2025 kembali dengan 525,557 baris — kurang 43 minit, dengan kadar kelengkapan 99.992%. Data perp alt bermodal pasaran pertengahan di venue yang sama, tarikan yang sama, laluan kod yang sama, kembali dengan kekurangan 1,247 baris: 99.76%. Siri minit ekuiti AS bagi tahun yang sama pula mempunyai kira-kira 427,000 baris lebih sedikit daripada siri kripto — itu bukan jurang langsung, cuma pasaran yang ditutup.

Tiga daripada angka itu tidak menarik. Angka yang berbaloi dihuraikan panjang lebar ialah 43.

525,600bar 1 minit dalam tahun bukan lompat
0.008%hilang pada BTCUSDT, 2025
61%daripada minit itu berlaku dalam waktu volatiliti desil teratas

Empat perkara berbeza yang semuanya kelihatan seperti lubang dalam dataframe anda

Sebelum membincangkan angka 43, kita perlu jelaskan kategorinya, kerana kebanyakan kod pengendalian jurang sudah pun salah pada peringkat ini. Apabila sesuatu baris tiada daripada parquet setempat anda, anda tidak tahu yang mana satu daripada perkara berikut menyebabkannya, sedangkan tindak balas yang betul berbeza bagi setiap satunya.

JenisApa yang sebenarnya berlakuBentuk dalam dataTindak balas yang betul
Tiada daganganPasaran dibuka; tiada sesiapa merentasi spread pada minit ituBar volum sifar (OHLC semuanya sama, trades=0) pada sesetengah endpoint; baris tiada pada endpoint lainKekalkannya. Itu maklumat sebenar: tiada sesiapa mahu berdagang.
Venue tergendalaEnjin padanan luar talian, sama ada terjadual atau tidakBaris tiada, kadangkala berturut-turutTandakan sebagai lapuk. Jangan berdagang merentasinya.
Instrumen dihentikan sementaraPelanggaran jalur LULD, menunggu berita, notis penyahsenaraianBaris tiada, kemudian cetakan lelongan pembukaan semulaTandakan sebagai lapuk, dan anggap pembukaan semula sebagai ketakselanjaran.
Kesilapan andaPenomboran halaman dihadkan kadar, percubaan semula yang menggugurkan satu halaman, pepijat sempadan zon waktu dalam gelungBaris tiada, tidak dapat dibezakan daripada perkara di atasKesan dan tarik semula datanya. Inilah satu-satunya yang boleh anda baiki.

Venue berbeza pendapat tentang baris pertama dalam jadual itu, dan di situlah masalahnya. Endpoint candles Coinbase melangkau bucket kosong sepenuhnya, jadi sejarah pasangan yang tidak cair penuh dengan lubang sebenar. Klines Binance biasanya memberikan bar sintetik dengan volum 0 dan open=high=low=close ditetapkan pada dagangan sebelumnya. Fakta asasnya sama, tetapi bentuknya berbeza; loader yang menyusun semula indeks kepada grid minit penuh menukar satu bentuk menjadi bentuk yang lain tanpa memberitahu anda. Semak tindakan venue anda sebelum menulis pengisi jurang, bukan selepasnya.

Hampir kesemua 1,247 minit yang hilang pada alt itu tergolong dalam kategori pertama: buku pesanan nipis pada 04:00 UTC hari Ahad, tiada sesiapa berdagang. Menyusahkan, mudah difahami dan sebahagian besarnya tidak memudaratkan kerana strategi itu pun tidak akan berdagang ketika itu. Sebab itulah saya berhenti menelitinya dan kembali kepada angka 43.

43 minit itu tidak bertaburan

Jika kehilangan data berlaku secara seragam, 43 minit sepanjang setahun akan muncul sebagai 43 minit tunggal yang terpencil, satu setiap lapan setengah hari, masing-masing cuma ralat pembundaran. Bukan begitu yang kami temui. Minit itu muncul dalam enam rentetan: satu rentetan 19 minit berturut-turut, satu 11 minit, dua rentetan 4 minit, dan beberapa pasangan minit. Enam kejadian, bukan 43 kemalangan.

Kejadian itu pula berkait dengan perkara yang anda ambil berat. Venue tergendala apabila bebannya tinggi, dan bebannya tinggi apabila harga bergerak. Saya mengumpulkan setiap jam dalam tahun itu mengikut volatiliti terealisasi, lalu menyemak di mana minit yang hilang berlaku: 61% daripadanya jatuh dalam desil teratas. Kebarangkalian tanpa syarat bahawa sesuatu minit hilang ialah 0.008%. Jika minit itu berada dalam jam dengan volatiliti desil teratas, kebarangkaliannya kira-kira 0.05% — enam kali lebih tinggi, dan kehilangan itu juga berkumpul.

Jadi, metrik kelengkapan pada papan pemuka kualiti data anda mengukur perkara yang salah. 99.992% kedengaran seperti set data yang tidak perlu anda fikirkan lagi. Sebenarnya, angka itu menggambarkan siri yang lengkap pada waktu strategi anda tidak melakukan apa-apa, tetapi berlubang pada waktu strategi anda melakukan segala-galanya. Sistem momentum yang mencetuskan dagangan apabila volatiliti berkembang mempunyai kemungkinan yang jauh lebih tinggi untuk terkena jurang daripada yang dibayangkan oleh angka utama itu, dan ia terkena jurang ketika dagangan sedang berjalan.

Kesan forward-fill beberapa baris kemudian

Inilah kegagalan yang mendorong saya menulis artikel ini. Ambil rentetan 19 minit tadi. Langkah pembersihan standard: susun semula indeks kepada grid minit penuh, lakukan forward-fill OHLC daripada harga penutupan terakhir, tetapkan volum kepada sifar. Kini siri itu berterusan dan indikator anda berjalan tanpa NaN kelihatan.

19 bar itu mempunyai high == low == close. Julat sebenar ialah sifar bagi setiap satunya. ATR(14) yang dikira dalam tempoh itu, bermula daripada bacaan sebelum gangguan sekitar 240 USDT, menyusut kepada kira-kira 34 apabila venue kembali beroperasi — lima bar sebenar yang masih ada dalam tempoh itu menanggung keseluruhan purata. Sekarang masukkan angka itu ke dalam penentu saiz posisi berskala volatiliti, jenis biasa size = risk_budget / ATR. Saiz meningkat tujuh kali ganda.

Bar sebenar yang seterusnya ialah cetakan pembukaan semula, dan ia bukannya bar yang tenang. Dalam kes kami, harganya dibuka 1.8% daripada harga penutupan terakhir sebelum gangguan. Ujian balik itu dengan mudah mengambil posisi 7x ketika berdepan jurang 1.8%, pada isian yang mustahil berlaku, pada harga yang tiada sesiapa sebut. Dagangan sintetik tunggal itu bernilai lebih daripada sebulan P&L yang sah dalam lengkung ekuiti, dengan arah yang salah — dan semuanya berpunca daripada satu baris pembersihan data yang ditulis untuk mengemaskan dataframe.

Menggugurkan baris dan bukannya mengisinya juga bukan penyelesaiannya; itu pepijat yang sama dengan penyamaran berbeza. Gugurkannya dan jangkaan lookback berindeks integer anda menjadi tidak tepat: "EMA 20 bar" kini merangkumi 39 minit masa sebenar sepanjang gangguan, pulangan antara bar pada sempadan ialah keseluruhan lonjakan 1.8% yang dianggap sebagai pergerakan satu minit, dan anggaran volatiliti setiap bar membacanya sebagai peristiwa 60-sigma. Tiada amaran diberikan. Indeks masih menaik secara monotonik.

Pensampelan semula membuatkannya tidak kelihatan

Kebanyakan penyelidikan tidak menggunakan bar 1 minit; sebaliknya, data diagregatkan, dan pengagregatan mengaburkan masalah. Buat pensampelan semula kepada 5 minit dan lubang 19 minit menjadi empat bar, dengan bar pertama dan terakhir hanya meliputi sebahagian tempoh. Pandas akan mengira OHLC yang kelihatan munasabah daripada dua minit yang masih ada, lalu melabelkannya sama seperti bar yang dibina daripada lima minit. Tiada apa-apa dalam output yang membezakannya.

Pembaikan paling mudah yang saya tahu: kekalkan lajur bars_in_window dalam setiap pensampelan semula dan jangan sekali-kali membuangnya. Satu integer bagi setiap baris, dan semua soalan seterusnya tentang kebolehpercayaan sesuatu bar boleh dijawab. Kami juga mengekalkan seconds_since_last_real_print, iaitu maklumat yang sama dalam bentuk yang boleh digunakan oleh lapisan pelaksanaan.

Dasar kami setakat yang ada

Perkara yang kini dilaksanakan oleh agen kami, mengikut turutan:

  1. Jangan sekali-kali susun semula indeks tanpa memberitahu. Loader menghasilkan manifes jurang — mula, tamat, tempoh, dan kategori yang dipercayainya antara empat kategori tadi. Jika rentetan minit yang hilang kurang daripada 3 bar dan volum dalam bar di sekitarnya rendah, itu minit tanpa dagangan. Apa-apa yang lebih lama pada waktu aktif dianggap sebagai gangguan sehingga dibuktikan sebaliknya.
  2. Tarik semula sebelum membuat tafsiran. Separuh daripada jurang awal kami berpunca daripada pepijat penomboran halaman. Tarikan kedua daripada endpoint atau vendor lain menyelesaikan kategori empat dan mengecilkan masalah sebelum perlu membuat sebarang pertimbangan.
  3. Gunakan pintu kawalan data lapuk, bukan pengisian jurang. Strategi menerima input data_age dan peraturan tegas: jangan buka posisi baharu apabila cetakan sebenar terakhir lebih lama daripada N bar, dan posisi terbuka diratakan ketika pembukaan semula hanya melalui pesanan pasaran yang mengambil kira risiko jurang dengan potongan harga yang dinyatakan secara jelas. Isian yang mustahil berlaku lebih buruk daripada dagangan yang tidak dibuat.
  4. Indikator menerima NaN, bukan data rekaan. Harga yang diisi melalui forward-fill tidak pernah sampai ke lapisan ciri. Jika ATR tidak dapat dikira, nilainya tidak ditakrifkan, dan itu bermakna posisi ditutup. Kegagalan yang jelas lebih baik daripada 7x secara senyap.
  5. Laporkan prestasi bersyarat pada jurang. Setiap ujian balik yang kami keluarkan menunjukkan P&L bersama dagangan yang hampir dengan gangguan dikecualikan, di samping angka utama. Jika dagangan itu yang menanggung hasilnya, hasil tersebut hanyalah artifak data.

Audit ringkas yang boleh anda jalankan hari ini: kumpulkan minit yang hilang menjadi rentetan berturutan, kemudian semak peratus dagangan ujian balik anda yang dibuka atau ditutup dalam lingkungan 30 minit dari sempadan rentetan. Jika kurang daripada 1%, kemungkinan besar jurang itu tidak mempengaruhi apa-apa. Jika 5% atau lebih, lengkung ekuiti itu sebahagiannya menceritakan kisah tentang masa henti bursa.

Petunjuk yang kini saya percayai ialah bentuk kehilangan data, bukannya saiznya. Set data dengan ribuan lubang bertaburan pada waktu lengang biasanya tidak bermasalah. Set data dengan beberapa kelompok yang rapat memberitahu anda bahawa sesuatu gagal apabila beban tinggi, dan di tempat itulah strategi anda beroperasi.

jurang OHLCVkejuruteraan dataujian balikpensampelan semulaniaga hadapan kripto
← Semua catatan