26 Ogos 2026 · data pasaran

Anatomi satu bar 1 minit: semua yang OHLCV tidak beritahu backtest anda

Anatomi satu bar 1 minit: semua yang OHLCV tidak beritahu backtest anda

Ini satu bar. Perpetual Binance USDⓈ-M, BTCUSDT, minit yang bermula 13:46:00 UTC. Ia keluar daripada endpoint klines sebagai array kosong dengan dua belas nilai, dan ia merupakan unit input paling lazim dalam penyelidikan kuantitatif retail dan yang berkaitan dengannya. Hampir setiap strategi yang kami hasilkan menyentuh sesuatu yang berbentuk begini.

Jadi mari kita bedah ia, indeks demi indeks, dan lihat berapa banyak daripadanya yang tersilap difahami oleh backtest.

IndeksNilaiNama
01773495960000masa buka (ms)
1"84120.50"buka
2"84177.90"tinggi
3"84098.10"rendah
4"84163.40"tutup
5"38.417"volum asas (BTC)
61773496019999masa tutup (ms)
7"3232108.94"volum sebutharga (USDT)
81204bilangan dagangan
9"21.883"volum asas beli taker
10"1841203.55"volum sebutharga beli taker
11"0"abaikan

[0] dan [6]: minit yang mana ini, dan jam siapa yang menentukannya

Masa buka 1773495960000, masa tutup 1773496019999. Perhatikan yang kedua: ia berakhir dengan 19999, kurang satu milisaat daripada masa buka bar seterusnya. Tetingkap ini separuh-terbuka, dan bursa memberitahu anda perkara ini secara eksplisit. Separuh daripada pepijat data yang pernah saya kejar bermula apabila seseorang menganggap kedua-dua titik akhir sebagai inklusif lalu mengira dua kali dagangan di sempadan, atau menyelaraskan resample sehingga setiap bar 5 minit "meminjam" satu milisaat daripada jirannya.

Cap masa ini ialah masa enjin pemadanan bursa. Bukan jam anda, bukan jam ingestion vendor anda, dan bukan jam yang sama dengan yang digunakan oleh snapshot funding. Apabila anda menggabungkan siri kline dengan siri kadar funding atau siri open interest yang ditarik daripada endpoint berbeza, anda sebenarnya menggabungkan sumber-sumber yang hanya sepadan dalam lingkungan kira-kira satu saat, kebanyakan masa. Bagi strategi 1 minit, itu ralat masa sebanyak 1.7% pada setiap baris yang digabungkan. Bagi apa-apa sahaja di bawah satu minit, ia membawa padah.

Dan bar ini dicap pada masa bukanya. Maklumat di dalamnya tidak dapat diketahui sehingga 13:46:59.999. Setiap persoalan konvensyen pengindeksan — patutkah saya anjak satu, patutkah saya guna cap masa tutup-bar atau buka-bar sebagai masa peristiwa saya — sebenarnya adalah persoalan lookahead yang sama, cuma bersalut rupa lain.

[1] "84120.50": harga buka yang tidak boleh anda dagangkan

Harga buka ialah harga dagangan pertama yang tercetak dalam tetingkap tersebut. Ia adalah transaksi yang telah selesai antara dua pihak lain. Menjelang bar itu wujud sebagai satu baris dalam dataframe anda, harga tersebut sudah berumur enam puluh saat.

Bar sebelumnya ditutup pada 84109.80, jadi terdapat pergerakan harga sebanyak $10.70 yang tersembunyi dalam jurang antara dua bar 1 minit yang bersebelahan. Itu 1.3 mata asas, tidak kelihatan pada carta, dan lebih kurang suku daripada yuran taker. Tidak mengapa. Tetapi cuba lihat siri yang sama pada alt perp semasa keluaran CPI AS, dan jurang antara-bar itu berlegar antara 15 hingga 40 mata asas. Backtest yang memberi isyarat pada penutupan bar dan mengisi pesanan pada pembukaan bar seterusnya secara senyap mengandaikan jurang itu sifar — dan ia memang sifar, tepat pada waktu ia tidak penting.

[2] dan [3]: "84177.90" tinggi, "84098.10" rendah

Dua-dua nilai inilah punca kebanyakan enjin fill "mati", jadi bahagian ini agak panjang.

Tinggi dan rendah ialah harga ekstrem yang disentuh. Ia tidak membawa maklumat saiz mahupun tempoh. Daripada rekod dagangan mentah bagi minit yang sama ini, segala-galanya pada atau di bawah 84100.00 hanya berjumlah 0.62 BTC merentasi sembilan cetakan dalam tetingkap 1.4 saat. Jadi stop backtest pada 84100 "terisi" — dan jika kedudukan anda 3 BTC, anda telah menghabiskan seluruh buku yang kelihatan semasa harga jatuh, dan baki saiz anda diisi di suatu tempat dalam susulan 84105–84130. Bar itu menyatakan harga rendah ialah 84098.10. Bar itu tidak menyatakan bahawa hanya $52,000 nosional yang didagangkan di situ.

1204dagangan dalam minit ini
0.032 BTCsaiz cetakan purata (~$2.7k)
0.62 BTCjumlah didagangkan pada atau bawah tick rendah
57%daripada volum dimulakan oleh pembeli

Arah sebaliknya lebih teruk, kerana ia menyanjung anda. Andaikan anda mempunyai pesanan had jual yang menunggu (resting) pada 84175. Harga tinggi bar itu ialah 84177.90, jadi enjin yang naif akan mengisi anda pada 84175 dan mencatat rebat maker dan bukannya kos taker. Sama ada fill itu benar-benar berlaku bergantung pada kedudukan giliran (queue) pada tahap harga tersebut, sesuatu yang bar itu tidak mungkin tahu dan yang mungkin anda tidak pernah rekodkan. Tersentuh bukan bermakna terisi.

Peraturan yang kami tetapkan dalam enjin fill kami: pesanan had yang menunggu hanya terisi jika bar itu berdagang melepasi tahap tersebut, bukan sekadar sampai ke situ. Fill pada tick ekstrem yang tepat memerlukan bukti volum-pada-harga daripada rekod dagangan, jika tidak ia ditolak. Ini menyingkirkan kira-kira 6% dagangan daripada buku mean-reversion biasa dan menurunkan Sharpe backtest satu calon strategi daripada 1.9 kepada 1.1. Calon itu tidak pernah benar-benar wujud; peraturan fill itu cumalah perkara pertama yang cukup jujur untuk mendedahkannya.

Perangkap yang berkaitan: laluan intrabar. Jika julat sesuatu bar merangkumi kedua-dua stop dan take-profit anda, OHLCV tidak dapat memberitahu yang mana berlaku dahulu. Setiap enjin terpaksa memilih satu konvensyen. Enjin kami mengandaikan stop-dahulu, sentiasa, yang bersifat pesimistik dan kadangkala silap, tetapi tidak sekali-kali menghasilkan kemenangan palsu. Jika enjin anda mengandaikan take-profit-dahulu, bar julat-lebar akan mencipta keuntungan daripada kesamaran, dan bar julat-lebar itulah tepat yang mendominasi taburan PnL anda.

[4] "84163.40": nombor paling tidak teguh dalam bar

Harga tutup ialah cetakan terakhir dalam tetingkap tersebut. Itu sahaja. Ia mungkin sekadar odd-lot 0.002 BTC daripada bot yang membundarkan kedudukannya pada 13:46:59.8. Tick tunggal yang secara struktur bersifat arbitrari inilah yang digunakan oleh kebanyakan pipeline penyelidikan untuk mengira setiap isyarat, menanda setiap kedudukan, dan menilai setiap keluar.

Pada perp BTC, ia hampir tidak penting; pada perp altcoin nipis pada 04:00 UTC, ia amat penting, dan perbezaan antara harga tutup dua venue bagi minit yang sama boleh melebihi keseluruhan edge per-dagangan anda. Apabila PnL sesuatu strategi bergantung secara khusus pada harga tutup, kami jalankan semula dengan menanda pada harga mark bursa sebaliknya, yang diterbitkan daripada indeks dan jauh lebih sukar untuk digodam. Jika keputusan berbeza, strategi itu sebenarnya mendagangkan artifak data.

[5] dan [7]: "38.417" dan "3232108.94", volum dalam unit apa

Volum asas ialah BTC; volum sebutharga ialah USDT. Kedua-duanya ada di sini, satu keistimewaan yang tidak semua venue berikan. Sebab ia penting ialah pengagregatan merentasi venue. Kontrak coin-margined disebutharga dalam unit kontrak bernilai nosional $100. Sesetengah feed ekuiti melaporkan lot bulat. Venue pasaran ramalan melaporkan bilangan saham, di mana satu saham ialah tuntutan binari yang disebutharga dalam dolar. Menjumlahkan "volum" merentasi alam semesta yang bercampur tanpa menormalkan kepada satu unit nosional tunggal menghasilkan penarafan kecairan yang langsung tidak masuk akal, dan ia akan kelihatan stabil serta lolos semakan walaupun ia karut.

Normalkan segala-galanya kepada nosional sebutharga semasa ingest. Simpan juga medan mentah, tetapi jangan sekali-kali biarkan strategi melihatnya.

[8] 1204: medan yang sepatutnya menentukan model impak anda

Bilangan dagangan dibahagikan ke dalam volum asas memberikan cetakan purata 0.032 BTC, kira-kira $2,700. Jika strategi calon anda mahu masuk $250,000 sekali gus, ia sebenarnya meminta saiz kira-kira 92 kali ganda daripada transaksi tipikal dalam minit tersebut. Nombor itu, bukan pemalar slippage generik 5 mata asas, yang sepatutnya menggerakkan terma impak punca-kuasa-dua anda. Kami mengira kadar penyertaan bagi setiap bar sebagai lajur kelas pertama, dan menolak strategi yang median kemasukannya melebihi beberapa peratus daripada nosional bar, kerana segala-galanya selepas titik itu hanyalah fiksyen.

Bilangan dagangan juga menandakan minit-minit ganjil dengan murah. Volum normal, tetapi bilangan dagangan jatuh kepada 11? Seseorang telah melakukan blok. Volum normal, tetapi bilangan dagangan mencecah 9,000? Itu lambakan likuidasi yang sedang dikunyah dalam kepingan kecil.

[9] dan [10]: "21.883", medan yang semua orang buang begitu sahaja

Volum asas beli taker. 21.883 daripada 38.417 BTC dalam bar ini dimulakan oleh pembeli, jadi delta volum bertanda ialah +5.349 BTC dan pecahan agresor ialah 57/43 memihak kepada pembeli. Bursa sebenarnya menghulurkan ketidakseimbangan aliran pesanan kepada anda secara percuma, dalam medan yang jarang dibaca ramai orang kerana pandas tidak menamakan lajur itu untuk mereka.

Saya tidak mendakwa ia meramalkan pulangan dengan sendirinya; strategi delta yang naif tergolong antara cara paling boleh diharap untuk menderma kepada buku yuran. Tetapi ia benar-benar ukuran yang berbeza daripada harga, ia tersedia dalam permintaan yang sama yang sudah pun anda buat, dan ia membolehkan anda membezakan reli yang dibeli daripada reli yang berlaku kerana penjual berundur. Kedua-duanya kelihatan sama dalam OHLC tetapi berkelakuan berbeza sepuluh minit kemudian. Ejen penyelidikan kami menganggap sebarang hipotesis yang mengabaikan pecahan taker pada venue yang menerbitkannya sebagai membiarkan bukti tercicir begitu sahaja.

[11] "0": abaikan — dan segala-galanya yang tiada di sini

Indeks 11 ialah medan yang telah dinyahguna, kekal sifar selamanya. Yang lebih menarik ialah senarai perkara yang tiada dalam bar ini: tiada bid, tiada ask, tiada spread, tiada kedalaman buku, tiada kadar funding, tiada open interest, tiada likuidasi, tiada harga mark, tiada harga indeks. Dan yang paling penting, tiada cara untuk mengetahui sama ada pesanan anda akan menjadi maker atau taker, iaitu perbezaan antara membayar 0.045% dan memperoleh 0.01% pada venue ini.

Jadi mana-mana model yuran yang dibina semata-mata daripada klines hanyalah andaian yang berpakaian sebagai nombor. Kami menyelesaikannya dengan memaksa setiap strategi mengisytiharkan gaya eksekusinya terlebih dahulu, dan kemudian mengenakan caj taker ke atas apa jua yang tidak dapat membuktikan sebaliknya.

Bar yang tidak pernah muncul

Bahagian terakhir, dan yang paling menggigit di luar aset major. Minit dengan sifar dagangan tidak menghasilkan sebarang kline langsung. Vendor dan pustaka lazimnya melakukan forward-fill: buka = tinggi = rendah = tutup = harga tutup sebelumnya, volum 0. Indikator anda mengira dengan gembira. Strategi anda melihat baris yang sah dan boleh menjana isyarat pada minit di mana tiada sesiapa pun di dunia mendagangkan instrumen tersebut.

Pada satu perp mid-cap yang kami ingest, 4.1% daripada bar 1 minit dalam tetingkap dua belas bulan mempunyai sifar dagangan. Satu calon strategi mean-reversion pada simbol itu meletakkan 38% kemasukannya pada bar sintetik, kerana harga sintetik yang rata amat menarik bagi apa-apa sahaja yang mengukur sisihan daripada purata bergerak. Ia backtest dengan cantik sekali. Sebenarnya ia mendagangkan jurang dalam data.

Itulah sebabnya lapisan ingest kini membawa boolean synthetic bagi setiap bar, disebarkan melalui setiap resample, dan gauntlet pengesahan akan menggagalkan mana-mana strategi yang dagangannya bertumpu padanya. Lajur yang murah. Ia telah menggagalkan lebih ramai calon strategi berbanding mana-mana indikator yang pernah kami tulis.

Dua belas nilai. Empat daripadanya lazim disalah faham, dua daripadanya lazim dibuang, dan satu kategori keseluruhannya tiada dalam baris tersebut lalu direka-reka oleh enjin. Sebelum backtest anda yang seterusnya, cuba tarik satu bar mentah daripada storan anda sendiri dan baca setiap medan dengan kuat berbanding apa yang diandaikan oleh logik fill anda tentangnya. Ia latihan dua puluh minit, dan saya belum pernah melihat sesiapa melakukannya lalu tidak menjumpai apa-apa.

ohlcvmikrostruktur pasarankejuruteraan databacktestingfutures kripto
← Semua catatan