31 Agustus 2026 · pasar prediksi

Apa yang rusak saat Anda melakukan backtest pasar prediksi: catatan harian delapan hari

Apa yang rusak saat Anda melakukan backtest pasar prediksi: catatan harian delapan hari

Pasar prediksi tampak seperti hal termudah di dunia untuk di-backtest. Harganya berada di [0, 1]. Imbal hasilnya satu dolar atau nihil. Tanpa leverage, tanpa funding, tanpa basis, tanpa keanehan perpetual swap pada 00:00 UTC. Kami sudah punya backtester yang menangani crypto perp beserta biaya, funding, dan dampak pasar, dan rencananya adalah menghabiskan dua hari untuk mengadaptasikannya, lalu mulai membuat strategi.

Ternyata perlu delapan hari. Berikut catatannya, kira-kira menurut urutan kejadian, termasuk hari ketika kurva ekuitas tampak luar biasa dan memang begitu.

Hari 1: adaptor yang seharusnya mudah

Pemetaan awalnya satu banding satu dan terasa rapi. Pasar adalah instrumen. Harga YES adalah harganya. Membeli YES berarti long, membeli NO berarti short. Penyelesaian adalah penutupan paksa pada 1.00 atau 0.00. Masukkan deret harga per jam ke event loop yang sama, beres.

Pemetaan itu bertahan sekitar sembilan puluh menit setelah berhadapan dengan data sungguhan. Hal pertama yang gugur adalah deret return. Seluruh lapisan risiko kami — penentuan ukuran posisi, penargetan volatilitas, pelaporan Sharpe — mengasumsikan log return dari instrumen yang terus berjalan. Pasar yang bergerak dari 0.04 ke 0.00 memiliki log return yang tak terdefinisi, tetapi kerugian totalnya jelas. Dan pasar yang berada di 0.04 tiga hari sebelum penyelesaian adalah objek yang sama sekali berbeda dari pasar yang berada di 0.04 empat menit sebelumnya, meskipun kedua baris sama-sama menunjukkan 0.04.

Akhirnya kami memparametrisasi ulang seluruh deret berdasarkan waktu menuju penyelesaian, bukan waktu kalender, dan memperlakukan PnL sebagai hasil akhir, bukan nilai mark-to-market. Itu keputusan yang tepat, dan akibatnya semua kode pelaporan setelah bagian tersebut harus dirombak.

Hari 2: rumus biaya adalah strateginya

Di Kalshi, biaya transaksi bukan potongan basis poin. Biayanya kuadratik terhadap harga: kira-kira 0.07 × contracts × P × (1−P), dibulatkan ke atas hingga sen terdekat pada tingkat order. Artinya, biaya paling besar justru saat pasar lempar koin paling menarik, dan nyaris gratis di ujung distribusi.

HargaBiaya per kontrakEdge yang diperlukan (poin probabilitas)Biaya sebagai % dari taruhan
5¢0.33¢0.336.7%
10¢0.63¢0.636.3%
25¢1.31¢1.315.3%
50¢1.75¢1.753.5%
75¢1.31¢1.311.8%
90¢0.63¢0.630.7%
95¢0.33¢0.330.35%

Baca kolom ketiga sebagai hal yang paling penting: agar impas saat membeli di 50¢ dan memegangnya sampai penyelesaian, estimasi probabilitas Anda harus mengungguli pasar sebesar 1.75 poin. Bukan 1.75 persen secara relatif. Nilai absolut. Jika Anda keluar sebelum penyelesaian alih-alih menahan posisi, biaya itu dibayar dua kali, ditambah spread.

3.5%biaya satu arah pada 50¢, sebagai bagian dari taruhan
1.75ppedge probabilitas agar impas di harga tersebut
1penyelesaian per instrumen, seumur hidup

CLOB Polymarket secara historis memiliki profil biaya yang sangat berbeda, lebih mendekati nol untuk transaksinya sendiri, sehingga seluruh biaya beralih ke spread dan kedalaman. Jadi, logika strategi yang sama memiliki ekonomi yang sama sekali berbeda bergantung pada venue, dan perbandingan lintas venue apa pun yang menggunakan satu model biaya hanyalah fiksi. Kini kami menggunakan fungsi biaya per venue, bukan satu nilai skalar.

Jika Anda hanya membaca satu baris dari laporan backtest pasar prediksi, bacalah baris biaya dalam poin probabilitas. Strategi dengan klaim edge prediksi 1.2 poin pada pasar 50¢ adalah strategi merugi di Kalshi bahkan sebelum biaya lain dihitung. Fakta itu harus terlihat di halaman pertama, bukan perlu disimpulkan pembaca.

Hari 3: order book bertingkat dan dangkal

Model dampak pasar kami berupa fungsi akar kuadrat yang dikalibrasi pada order book BTC perp. Bentuknya keliru. Dengan tick 1¢ pada instrumen senilai $1, hanya ada 99 kemungkinan tingkat harga di seluruh order book, dan pasar dengan likuiditas sedang mungkin memiliki beberapa ratus kontrak yang menunggu di tingkat teratas, lalu ada jarak kosong.

Berikut cuplikan pasar data ekonomi yang kami pantau, sisi YES, sekitar 30 jam sebelum penyelesaian:

LevelUkuran (kontrak)Biaya kumulatif pembelian
42¢310310 @ rata-rata 42.0¢
43¢85395 @ rata-rata 42.2¢
45¢140535 @ rata-rata 42.9¢
49¢6001,135 @ rata-rata 46.1¢

Order 1,000 kontrak — risiko lima ratus dolar, nilai yang nyaris tak berarti di kripto — menggeser harga efektif sebesar empat sen. Empat sen itu lebih dari dua kali biaya. Tidak ada fungsi mulus yang bisa dicocokkan di sini; Anda harus menelusuri order book tingkat demi tingkat, atau sekadar mengarang. Kami menghapus model akar kuadrat untuk kelas aset ini dan menulis penelusur order book secara langsung, yang lebih lambat tetapi benar.

Di tengah proses ini, saya sadar kesal karena pasar-pasar ini "terlalu kecil untuk berarti." Ukurannya kecil karena yang dihargai adalah satu pertanyaan dunia nyata dengan tenggat, dan hanya ada begitu banyak orang yang punya pendapat tentang klaim tunjangan pengangguran awal AS pada hari Rabu. Ukuran adalah pasarnya. Mengeluh soal itu seperti mengeluh meja poker hanya menyediakan sembilan kursi.

Hari 4: hari ketika kurva ekuitas tampak indah

Sharpe 4.1 pada 1,400 pasar. Mulus. Perut setiap peneliti seharusnya terasa mual melihatnya, dan perut saya akhirnya juga begitu, sekitar empat puluh menit setelah saya mengambil tangkapan layarnya.

Bug-nya ada di resampler. Riwayat harga pasar tidak likuid muncul dengan cap waktu yang tidak teratur, jadi kami mengindeks ulang ke kisi per jam yang seragam. Titik terakhir setiap deret arsip adalah nilai penyelesaian, 1.00 atau 0.00. Pengindeksan ulang kami menggunakan pengisian tetangga terdekat tanpa batasan arah, sehingga untuk pasar mana pun yang transaksi terakhirnya terjadi beberapa jam sebelum penyelesaian, nilai penyelesaian merambat mundur melewati celah waktu. Model membaca jawaban esok hari pada baris hari ini, tepat di pasar tidak likuid tempat model bisa mengambil posisi lebih besar tanpa terbentur batas kedalaman.

Pengisian tetangga terdekat baik-baik saja untuk instrumen berkelanjutan. Pada instrumen yang observasi terakhirnya merupakan kebenaran aktual, cara itu menjadi mesin lookahead. Kini kami memastikan setiap pengisian hanya bergerak maju dan baris penyelesaian diberi tag serta dikecualikan dari penghitungan fitur apa pun. Pemeriksaan itu hanya sembilan baris kode dan merupakan kode paling berharga yang kami tulis sepanjang pekan.

Hari 5–6: 1,412 pasar, kira-kira 180 taruhan

Ukuran sampel di pasar prediksi adalah jebakan yang tampak ramah. Anda menyelesaikan 1,412 pasar, merasa punya 1,412 observasi, lalu menghitung t-stat yang sesuai. Namun, empat belas pertandingan NFL pada hari Minggu yang sama berbagi sistem cuaca, rilis laporan cedera, dan aliran petaruh yang sama. Lima puluh satu pasar pemilu tingkat negara bagian berbagi satu ayunan nasional. "Apakah X akan terjadi paling lambat 31 Maret" dan "Apakah X akan terjadi paling lambat 30 Juni" adalah taruhan yang sama dengan masa berlaku berbeda, dan keduanya diselesaikan bersamaan.

Kami mengelompokkan pasar berdasarkan sumber peristiwa yang mendasarinya dan tanggal penyelesaian, lalu mendapatkan jumlah efektif observasi independen sekitar 180. Itu tidak cukup untuk membedakan edge sungguhan dari noise pada besaran efek yang kami amati. Bootstrap per pasar juga tidak bisa memperbaikinya, karena bootstrap harus mengambil sampel ulang berdasarkan kelompok, bukan baris. Jika ini keliru, signifikansi Anda membesar dua atau tiga kali lipat tanpa disadari.

Hari 7: penyelesaian juga merupakan distribusi probabilitas

Hal-hal yang sama sekali belum kami modelkan dan baru kami temukan dengan cara yang sulit:

Kami menambahkan komponen biaya penahanan dan variasi acak tanggal penyelesaian ke simulator. Keduanya tidak presisi. Namun, keduanya lebih baik daripada asumsi tersirat bahwa penyelesaian pasti terjadi tepat pada tanggal yang disebutkan.

Hari 8: hal yang akan kami lewati dan yang akan kami kerjakan lebih dulu

  1. Lewati seluruh kerangka kerja berbasis return. Jangan mengadaptasi lapisan risiko penargetan volatilitas untuk instrumen dengan imbal hasil terminal. Buat lapisan penentuan ukuran taruhan yang menggunakan probabilitas dan nilai taruhan. Kami kehilangan dua hari berusaha menyesuaikan sistem lama.
  2. Buat fungsi biaya sebelum strateginya. Tampilkan kurva edge impas untuk setiap venue yang ingin Anda perdagangkan, lalu pasang di atas meja kerja. Langkah ini mematikan sekitar separuh ide sebelum menghabiskan waktu untuk menjalankan backtest.
  3. Telusuri order book sejak hari pertama. Model dampak parametrik apa pun yang diimpor dari pasar berkelanjutan akan keliru dengan cara yang membuat hasil Anda tampak lebih baik.
  4. Kelompokkan sebelum menghitung. Tentukan kunci pengelompokan untuk ukuran sampel efektif saat menentukan semesta pasar, bukan setelah mendapatkan Sharpe yang Anda sukai.
  5. Pastikan arah pengisian. Satu baris pemeriksaan untuk setiap join. Jika deret berakhir dengan kebenaran aktual, perlakukan pengisian mundur sebagai bug sejak awal, bukan sesuatu yang baru akan Anda sadari saat peninjauan.

Delapan hari itu sepadan, terutama karena pasar prediksi menyingkirkan ambiguitas yang membuat backtest kripto begitu mudah menipu diri sendiri. Tidak ada funding rate untuk diabaikan begitu saja, tidak ada konvensi harga mark yang diperdebatkan. Hanya sebuah pertanyaan, tenggat, dan jawaban. Ketika backtest keliru di sini, Anda bisa menunjuk tepat pada letak kesalahannya.

pasar prediksibacktestingbiayamikrostruktur pasarrekayasa data
← Semua artikel