1 September 2026 · aksi korporasi

Data split-adjusted, dibongkar: apa yang dilakukan split 10-for-1 NVDA pada setiap baris di belakangnya

Data split-adjusted, dibongkar: apa yang dilakukan split 10-for-1 NVDA pada setiap baris di belakangnya

Berikut satu baris dari file saham harian. NVDA, Jumat 7 Juni 2024, sesi terakhir sebelum split 10-for-1 berlaku.

KolomNilai
date2024-06-07
close1208.88
volume42,800,000 (dibulatkan)
split_factor1.0
dividend0.00
adj_close120.8781

Saya sengaja mengeluarkan kolom OHLC dari tampilan ini. Mereka akan kembali menjelang akhir, dan merekalah yang diam-diam rusak.

Segala yang menarik tentang baris ini berada di celah antara kolom dua dan kolom enam. Tape pada 7 Juni mencetak 1208.88. Tidak ada yang akan bertransaksi lagi pada harga itu, dalam arti saham yang dirujuknya tidak lagi ada sebagai satuan. Angka 120.8781 adalah rekonstruksi, dan bukan sekadar 1208.88 dibagi sepuluh. Mari kita bahas kolom demi kolom.

10:1divisor yang diterapkan pada setiap baris sebelumnya
0.99991789faktor dividen, dicap satu hari kemudian
$45komisi fiktif per round trip
2.8ppbeban tahunan yang diciptakan sebuah divisor

date: 2024-06-07, dan dua tanggal lain yang lebih penting

Split diumumkan pada 22 Mei 2024 bersamaan dengan earnings. Tanggal pencatatan adalah 6 Juni. Perdagangan dimulai dengan basis split-adjusted pada Senin 10 Juni. Tiga tanggal, dan kolom split_factor vendor Anda tepat berada di salah satunya, biasanya sesi split-adjusted yang pertama. Off-by-one di sini adalah bug aksi korporasi yang paling sering saya lihat, dan tidak terlihat secara agregat: kurva ekuitas Anda mendapat satu gap-down 90% atau satu gap-up 900% pada satu hari, yang hampir tidak tercatat oleh Sharpe yang dihitung selama 2,000 hari, tetapi max-drawdown atau aturan stop-loss mutlak merasakannya.

Dividen punya masalah tanggal sendiri, dan itu berubah diam-diam di bawah semua orang pada 2024. Dividen kuartalan $0.01 pasca-split NVDA memiliki tanggal pencatatan 11 Juni. Settlement AS pindah ke T+1 pada 28 Mei 2024, yang berarti ex-date dan tanggal pencatatan sekarang hari yang sama. Loader mana pun yang menghitung ex-date sebagai "tanggal pencatatan dikurangi satu hari kerja", yang benar selama puluhan tahun, mulai diam-diam menghasilkan penyesuaian dividen satu sesi lebih awal pada Juni 2024. Tidak ada exception yang dilempar. Faktornya hanya mendarat di baris yang salah.

Mode kegagalan kode aksi korporasi tidak pernah berupa exception. Itu adalah angka yang meleset satu hari dan terlihat sepenuhnya masuk akal.

close: 1208.88 — harga yang tidak ada di file

Ini adalah print mentah, dan di sebagian besar pipeline riset ia hanya ada sebagai kolom yang tidak dibaca siapa pun. Sinyal dihitung pada adj_close. Dan aturan apa pun yang merujuk tingkat harga per saham dalam dolar sekarang merujuk angka yang tidak pernah dilihat peserta pasar mana pun.

Pergerakan bertahap NVDA menuju $1,000 pada musim semi 2024 adalah hal nyata dengan order flow nyata di baliknya: magnet angka bulat, strike opsi yang mengelompok di 950 dan 1000, risiko headline di setiap pendekatan. Dalam data yang disesuaikan, seluruh episode itu terjadi di $100. Jika Anda menguji perilaku level psikologis, logika gap-fill di dekat angka bulat, atau fitur kedekatan strike, Anda mengujinya terhadap seri harga yang diubah skalanya oleh peristiwa yang belum terjadi.

Hal yang sama berlaku untuk filter universe. "Kecualikan saham di bawah $5" adalah proksi yang sah untuk klaster nyata masalah mikrostruktur: spread relatif yang lebar, aturan marginability, rezim tick. Jalankan terhadap riwayat yang disesuaikan dan Anda mengecualikan perusahaan untuk periode ketika mereka diperdagangkan di $30 dan kemudian mengalami reverse split. Jalankan "harga di atas $500" dan Anda diam-diam mengeluarkan NVDA dari setiap tahun sebelum Juni 2024. Filter harga harus diterapkan pada print yang tidak disesuaikan. Titik.

split_factor: 1.0 — dan 0.1 di baris berikutnya

Faktornya adalah hasil kali kumulatif yang berjalan mundur dari hari ini. Setiap baris sebelum 10 Juni 2024 membawa 0.1 dari split ini, dikalikan 0.25 dari 4-for-1 pada 2021, dikalikan apa pun yang datang sebelumnya. Riwayat NVDA pra-2021 diskalakan dengan 0.025, jadi bar yang tercetak di $200 pada 2019 muncul sebagai $5.00.

Dua konsekuensi yang layak diingat. Pertama, riwayat yang disesuaikan berubah setiap kali aksi korporasi baru mendarat. Backtest yang Anda jalankan pada Mei 2024 dan yang Anda jalankan hari ini menghasilkan angka berbeda pada kode identik di tanggal identik, dan jika Anda men-cache fitur yang dikunci pada simbol dan tanggal tanpa stempel versi data, Anda sekarang punya cache yang mencampur dua skala. Kami memasukkan epoch penyesuaian ke dalam kunci fitur justru karena alasan ini; kami butuh satu sore yang sangat membingungkan untuk mempelajarinya.

Kedua, pada penskalaan 0.025, saham yang diperdagangkan dalam tick $0.01 sekarang bergerak dalam kelipatan $0.00025. Logika pembulatan tick Anda, perbandingan "apakah ini high baru", pemeriksaan kesetaraan float: semuanya sekarang beroperasi jauh di bawah resolusi yang sebenarnya dimiliki pasar.

dividend: 0.01 — angka yang melepaskan setiap harga di belakangnya dari kisi

Satu sen. Terlihat seperti noise, dan itulah alasan adj_close menampilkan 120.8781, bukan 120.888 yang rapi.

Close 10 Juni adalah 121.79. Faktor ex-dividend adalah (121.79 − 0.01) / 121.79 = 0.99991789. Faktor itu mengalikan setiap harga sebelum 11 Juni, jadi 120.888 yang sudah split-adjusted menjadi 120.878074. Kecil, dan permanen, dan diterapkan lagi pada setiap dari sekitar enam puluh ex-date yang mundur sepanjang riwayat NVDA. Efek compounding-nya yang penting: pada saat Anda melihat 2015, Anda melihat harga yang telah dikalikan puluhan faktor yang agak irasional. Tidak satu pun harga historis yang disesuaikan berada di kisi sen.

Artinya setiap perbandingan == terhadap level bulat bernilai salah, setiap pemeriksaan "apakah kita menyentuh limit price" membutuhkan toleransi, dan OHLC yang direkonstruksi tidak lagi memenuhi invarians bahwa low ≤ open ≤ high setelah pembulatan naif ke 4 desimal. Artinya juga adj_close adalah seri total-return sementara close adalah seri price-return, dan jika Anda menghitung return dari yang satu dan drawdown dari yang lain, Anda telah mencampur dua definisi berbeda tentang apa yang terjadi.

volume: 42,800,000 — divisor yang tidak diterapkan siapa pun secara konsisten

Volume saham perlu dikalikan 10 agar dapat dibandingkan dengan sesi pasca-split. Beberapa vendor melakukannya. Beberapa tidak. Beberapa menyesuaikan OHLC dan membiarkan volume mentah, yang terburuk dari ketiganya karena file terlihat konsisten secara internal sampai Anda mengalikan harga dengan volume.

Langkah yang jujur adalah berhenti memakai volume saham sebagai fitur dan memakai dollar volume, yang secara konstruksi invarian terhadap split. Filter likuiditas rata-rata dollar volume 20 hari tidak membutuhkan logika penyesuaian sama sekali dan tidak bisa rusak oleh aksi korporasi. Invarians fitur mengalahkan kode penyesuaian yang benar, karena kode penyesuaian yang benar adalah sesuatu yang harus terus Anda jaga kebenarannya.

Tiga bentuk file vendor, tiga mode kegagalan.

Yang dikirimYang rusak
Hanya adjusted close, OHLC mentahLogika gap dan intrabar menghitung lintas dua skala harga
OHLC yang disesuaikan, volume mentahDollar volume meleset sebesar rasio split; filter ADV salah tembak
OHLCV mentah plus kolom faktorTidak ada, jika Anda menerapkannya. Semuanya, jika Anda menerapkannya di baris yang salah

Kolom yang tidak ada di sini: adj_open, adj_high, adj_low

Sekarang kembalikan OHLC. Jika feed hanya menyesuaikan close dan strategi Anda menghitung overnight gap sebagai open / prev_adj_close − 1, maka pada 10 Juni 2024 ia menghitung 120.37 / 120.8781 − 1, yang merupakan angka yang masuk akal, sekitar −0.4%. Jalankan kode yang sama mundur ke 7 Juni 2024 dan ia menghitung open dari file mentah (sekitar 1207) terhadap close yang disesuaikan dengan 0.025 dari split yang lebih lama, dan menghasilkan gap beberapa ribu persen.

Apa pun yang mencampur kolom mentah dengan kolom yang disesuaikan adalah aritmetika lintas dua sistem koordinat. Saya sekarang memperlakukan pembacaan mixed-adjustment sebagai assertion tingkat loader, bukan sesuatu yang harus diingat peneliti, karena peneliti tidak akan mengingatnya, termasuk saya.

Apa yang tidak dikatakan kolom mana pun: berapa banyak saham yang sebenarnya akan Anda beli

Inilah yang memakan biaya di model biaya backtest, dan inilah alasan saya menulis tentang stock split sama sekali.

Komisi saham AS sering kali per saham. Sebut saja $0.005 dengan minimum order $1.00, yang merupakan tingkatan tetap broker ritel yang umum. Sekarang backtest posisi NVDA $400,000 setahun sebelum split, ketika harga mentah dekat $400 dan harga yang disesuaikan tampil sebagai $40.

SahamKomisi
Apa yang sebenarnya terjadi (mentah $400)1,000$5.00
Apa yang dilihat backtest (disesuaikan $40)10,000$50.00

Eksposur sama, trade sama, biaya yang dimodelkan 10x. Itu $45 fiksi per leg, $90 per round trip, dan strategi dengan turnover harian menghabiskan sekitar $22,000 setahun biaya yang tidak pernah ada. Pada book $400k, 5.6 poin persentase return tahunan, seluruhnya diciptakan oleh sebuah divisor. Di sini itu membuat Anda terlihat lebih buruk dari kenyataan, yang masih bisa ditoleransi.

Reverse split berjalan ke arah sebaliknya, dan itulah arah yang berbahaya. Reverse split 1-for-10 berarti riwayat yang disesuaikan menampilkan harga 10x lebih tinggi dan jumlah saham 10x lebih rendah dari yang akan Anda perdagangkan. Model biaya Anda diam-diam membagi komisi per saham dengan sepuluh. Universe tempat reverse split umum adalah universe small-cap, sub-$5, spread lebar, di mana biaya per saham adalah pos terbesar dalam tumpukan biaya. Backtest justru memanjakan tepat nama-nama yang seharusnya dihukum.

Jadi perbaikannya membosankan dan struktural: tentukan ukuran posisi dalam dolar, konversi ke saham memakai harga tidak disesuaikan untuk tanggal itu, dan kenakan biaya per saham pada jumlah itu. Pertahankan kolom harga mentah di loader selamanya, bukan sebagai artefak audit melainkan sebagai input langsung ke fill engine.

  1. Sinyal dan return: seri yang disesuaikan.
  2. Jumlah saham, biaya per saham, pembulatan tick, filter tingkat harga: seri yang tidak disesuaikan.
  3. Likuiditas dan kapasitas: dollar volume, yang tidak membutuhkan keduanya.

Enam kolom, satu baris, satu aksi korporasi yang cukup biasa yang diumumkan tiga minggu sebelumnya dan tidak mengejutkan siapa pun. Pasar menanganinya dalam satu pagi. Merekonstruksinya secara setia dalam pipeline riset jauh lebih sulit dari itu, dan tanda bahwa sebuah pipeline belum melakukannya hampir tidak pernah berupa pesan error.

aksi korporasipenyesuaian splitsaham ASrekayasa databacktesting
← Semua artikel