Toda-Yamamoto vs Granger yang Berbeda: Apakah Lead-Lag BTC Bertahan?
Hampir setiap hasil kausalitas Granger yang dipublikasikan pada kripto dihitung berdasarkan pengembalian log. Pilihan itu tidaklah gratis. Perbedaan membuat rangkaian tersebut stasioner, yang disyaratkan oleh uji F standar, namun hal ini juga menghilangkan hubungan level — dan jika dua koin terkointegrasi, VAR yang berbeda salah ditentukan dan pengujian tersebut menjawab pertanyaan yang sedikit berbeda dari yang Anda tanyakan.
Toda dan Yamamoto (1995) menawarkan jalan keluarnya: sesuaikan VAR pada level dengan kelambatan ekstra, uji hanya yang asli, dan dapatkan validitas yang valid. terlepas dari akar unit atau kointegrasi. Ini terkenal dalam ekonometrik dan hampir tidak pernah diterapkan pada lead-lag kripto.
Jadi artikel ini melakukan satu hal: jalankan kedua pengujian pada pasangan yang sama, melalui jendela yang sama, dan laporkan apakah keduanya tidak setuju. Kemudian terapkan tindak lanjut yang jujur — koreksi pengujian ganda kelompok yang berkorelasi pada matriks yang dihasilkan, dan nilai p bergulir untuk melihat apakah jeda "signifikan" cukup stabil untuk diperdagangkan atau hanya berkedip melewati ambang batas.
Teori di bawah ini hanya diperlukan agar perbandingannya dapat dibaca. Blog ini sudah mencakup akar unit, kointegrasi, pemuatan data, ukuran, dan biaya; itu adalah tautan, bukan bagian.
Apa yang sebenarnya diklaim oleh kausalitas Granger

Kausalitas Granger adalah prioritas prediktif, bukan mekanisme: Penyebab Granger jika lewat mengurangi varians kesalahan perkiraan sebesar melampaui masa lalu sudah menjelaskan.
Penyebab Granger jika
Dua seri yang didorong oleh faktor tersembunyi yang sama dapat menunjukkan kausalitas Granger tanpa hubungan langsung di antara keduanya. Dalam kripto, peringatan itu tidak bersifat akademis — BTC adalah satu-satunya faktor dominan di seluruh kompleks altcoin, jadi hampir semua "kausalitas" alt-to-alt merupakan artefak kandidat dengan kecepatan respons berbeda terhadap guncangan BTC yang sama.
Kerangka VAR
Tes ini ada di dalam Autoregresi Vektor. Untuk dua variabel dengan tertinggal:
Dalam bentuk matriks, VAR(p) dengan variabel:
Menguji apakah Penyebab Granger sedang menguji pembatasan bersama pada persamaan pertama. Rute standarnya adalah uji-F pada jumlah kuadrat sisa yang dibatasi dan tidak dibatasi,
dengan bentuk Wald yang setara secara asimtotik . Berikut ini adalah pertanyaan tentang koefisien mana yang pembatasannya diterapkan, dan pada data apa VAR dipasang.
Seleksi jeda
lebih penting daripada yang diakui sebagian besar artikel: terlalu sedikit kelambatan yang meleset dari dinamika, terlalu banyak kelambatan yang membakar derajat kebebasan dan menghancurkan kekuasaan.
Rentang pencarian yang masuk akal: 1-60 pada data kedua, 1-30 pada data menit, 1-48 pada data per jam. BIC adalah default yang tepat di sini — ini adalah kriteria yang lebih pelit, dan lead-lag pada pasangan kripto likuid adalah fenomena memori pendek. Setiap hasil di bawah melaporkan BIC yang dipilih per pasangan daripada memperbaiki satu lag di seluruh alam semesta, karena lag yang tetap secara diam-diam mengubah pilihan pemilihan lag menjadi klaim signifikansi.
Mengapa tes yang berbeda adalah default yang salah

Seri harga kripto adalah I(1). Perbaikan yang biasa dilakukan – ambil log-return – membeli stasioneritas dengan mengorbankan tingkat kointegrasi, dan jika pasangan mata uang tersebut memiliki keseimbangan jangka panjang, perbedaan VAR akan salah ditentukan. Akar unit dan mesin kointegrasi di balik kalimat tersebut (ADF, Engle-Granger dengan nilai kritis Monte-Carlo, Johansen pada sistem VAR) sudah tercakup dalam arbitrase statistik dan perdagangan berpasangan; asumsikan di sini. Intinya hanyalah bahwa perbaikan yang biasa dilakukan - perbedaan, kemudian pengujian - adalah keputusan pemodelan dengan konsekuensi, dan Toda-Yamamoto adalah cara untuk menghindari pengambilan keputusan tersebut.
Prosedur Toda-Yamamoto
Pasang VAR dengan tertinggal, di mana adalah urutan lag optimal dan adalah urutan integrasi maksimum rangkaian, lalu uji batasan hanya pada rangkaian pertama tertinggal. Ekstra kelambanan menyerap ketidakstasioneran; statistik Wald pada yang pertama koefisien mengikuti standar terlepas dari apakah deret tersebut I(0), I(1), atau terkointegrasi.
- Menentukan — ADF dan KPSS pada setiap seri. Untuk harga kripto hampir selalu.
- Memilih — sesuaikan VAR pada level, pilih berdasarkan BIC.
- Perkirakan VAR yang diperbesar() pada level, tidak ada perbedaan.
- Uji Wald yang pertama hanya tertinggal, mengabaikan tambahan. Hasilnya adalah .
Imbalannya: tidak ada pra-uji kointegrasi, tidak ada pembedaan, dan ukuran pengujian yang benar — tingkat penolakan di bawah nol tetap mendekati nominal, apa pun properti integrasinya. Biayanya adalah langkah 4 tidak berapa test_causality dilakukan secara default, sehingga sebagian besar implementasi menjadi salah.
Pelaksanaan

Asumsikan Anda sudah menyelaraskan bilah menit di DataFrame - boilerplate pengambilan dan indeks ccxt ada di deteksi rezim dengan HMM, dan pembungkus ADF yang akan Anda gunakan untuk langkah 1 sudah ada arbitrase statistik dan perdagangan berpasangan.
Satu catatan versi sebelum semua ini berjalan: grangercausalitytests(..., verbose=False) tidak digunakan lagi dan kemudian dihapus di statsmodels 0.15. Hilangkan argumen (fungsi tidak lagi dicetak secara default) atau sematkan statsmodels<0.15. Kode di bawah ini mengasumsikan tanda tangan modern.
Toda-Yamamoto, dilakukan dengan benar
Pembatasan harus dibuat dengan tangan. VARResults.test_causality menguji semua kelambatan dari variabel penyebab dalam model yang dipasang — pada VAR yang ditambah () yang mencakup kelambatan dalam pembatasan, hal yang menurut Toda-Yamamoto tidak boleh dilakukan. Perbaikannya bersifat eksplisit matriks terhadap kovarians koefisien penuh:
import numpy as np
from scipy.stats import chi2
from statsmodels.tsa.api import VAR
def toda_yamamoto_test(data, target, predictor, max_lag=15, d_max=1,
significance=0.05):
"""
Toda-Yamamoto Granger causality on levels (no differencing).
Fits VAR(p + d_max) and applies a Wald test to the predictor's
coefficients at lags 1..p ONLY, leaving the d_max augmenting lags
unrestricted. Statistic is chi2(p).
"""
pair = data[[target, predictor]].dropna()
n_vars = pair.shape[1]
target_idx = list(pair.columns).index(target)
pred_idx = list(pair.columns).index(predictor)
model = VAR(pair)
p = model.select_order(maxlags=max_lag).bic or 1
res = model.fit(p + d_max)
beta = res.params.values.ravel(order="F")
cov = res.cov_params()
cov = cov.values if hasattr(cov, "values") else np.asarray(cov)
n_per_eq = res.params.shape[0]
idx = [target_idx * n_per_eq + 1 + lag * n_vars + pred_idx
for lag in range(p)] # first p lags only
R = np.zeros((p, beta.size))
R[np.arange(p), idx] = 1.0
Rb = R @ beta
V = R @ cov @ R.T
wald = float(Rb @ np.linalg.solve(V, Rb)) # no pinv: V must be PD
p_value = float(chi2.sf(wald, df=p))
return {
"target": target, "predictor": predictor,
"p": p, "augmented_lag": p + d_max, "d_max": d_max,
"wald_stat": wald, "p_value": p_value,
"significant": p_value < significance,
}
Dua detail yang mudah salah dan membuat tes tidak valid jika Anda melakukannya. Pertama, aritmatika indeks harus sesuai dengan bagaimana statsmodels diratakan params — verifikasi pada model yang terpasang itu beta[target_idx * n_per_eq + 1] sama res.params.iloc[1, target_idx] sebelum mempercayai nilai p apa pun. Kedua, gunakan np.linalg.solve, bukan pinv: jika bersifat tunggal, pembatasannya merosot dan proses tersebut harusnya gagal total daripada mengembalikan angka yang tampak masuk akal. Kebalikan semu di sini adalah bagaimana pengujian Wald yang rusak dapat bertahan dalam tinjauan kode.
Granger yang berbeda standar, sebagai perbandingan
Garis dasar yang dibandingkan dengan perbandingan ini — pengembalian log, pasangan yang sama, lag BIC yang sama:
from statsmodels.tsa.stattools import grangercausalitytests
def differenced_granger(data, target, predictor, p):
"""Standard Granger test on log-returns at a fixed lag p."""
pair = data[[target, predictor]].dropna() # returns, not levels
out = grangercausalitytests(pair, maxlag=[p]) # statsmodels >= 0.15
f_stat, p_value = out[p][0]["ssr_ftest"][:2]
return {"target": target, "predictor": predictor, "lag": p,
"f_stat": f_stat, "p_value": p_value}
Catatan maxlag=[p] daripada maxlag=p: meneruskan int menjalankan setiap lag dari 1 hingga dan menggoda Anda untuk melaporkan yang terbaik, yaitu beberapa pengujian yang tidak dicatat di atas beberapa pengujian yang sudah Anda jalankan.
Perbandingannya
Untuk setiap pasangan, jalankan tes perbedaan pada pengembalian dan Toda-Yamamoto pada level, pada BIC yang sama yang dipilih , dan tabulasikan jika keduanya tidak setuju. Ketidaksepakatan adalah sel yang menarik: pasangan yang signifikan dalam hal perbedaan tetapi tidak dalam tingkatan merupakan artefak kandidat yang membedakan hubungan kointegrasi; kebalikannya menunjukkan bahwa hubungan level membawa informasi yang tidak dapat dilihat oleh tes pengembalian.
Beberapa perbandingan pada matriks kausalitas

Penuh matriks adalah tempat ini menjadi berbahaya. Sapuan 20 aset, 10 lag berarti 3.800 pengujian hipotesis, dan Bonferroni adalah koreksi yang salah untuk kelompok yang berkorelasi ini — pengujian tersebut berbagi data, berbagi faktor BTC, dan sama sekali tidak independen, sehingga Bonferroni secara bersamaan terlalu konservatif dalam agregat dan menyesatkan tentang sel mana yang bertahan. Gunakan mesin efektif-N dari artikel Sharpe yang kempes, yang dibuat untuk situasi ini: mengelompokkan rangkaian pengujian yang berkorelasi, menghitung uji coba independen, bukan uji coba mentah, dan melakukan ambang batas terhadap uji tersebut.
def granger_matrix(data, max_lag=15, d_max=1):
"""Toda-Yamamoto p-value matrix. Entry (i, j): does col_j cause col_i?"""
cols = list(data.columns)
out = pd.DataFrame(np.nan, index=cols, columns=cols, dtype=float)
for target in cols:
for predictor in cols:
if target == predictor:
continue
r = toda_yamamoto_test(data, target, predictor,
max_lag=max_lag, d_max=d_max)
out.loc[target, predictor] = r["p_value"]
return out
Angka yang penting bukanlah berapa banyak sel yang berada di bawah 0,05 — namun berapa banyak yang bertahan pada ambang batas efektif-N yang dikoreksi.
Baca matriks yang masih ada secara struktural, bukan sel demi sel: baris di mana satu aset menyebabkan banyak aset lainnya mengonfirmasi hierarki informasi; kolom yang disebabkan oleh ketiadaan menunjukkan dinamika yang unik dan spesifik terhadap token, bukan sebuah penemuan.
Tes yang jujur: stabilitas bergulir

Nilai p tunggal dalam sampel hampir tidak berharga untuk diperdagangkan. Pertanyaan yang relevan adalah apakah signifikansi bertahan. Hubungan lintas aset dalam kripto bergantung pada rezim — struktur korelasinya sangat berbeda antara tenang dan panik, dan rezim itu sendiri dapat diperkirakan (Deteksi rezim HMM) — jadi perkiraan lead-lag pada satu jendela adalah pernyataan tentang jendela itu.
def rolling_granger(data, target, predictor, window=500, lag=5, step=50):
"""Rolling-window p-value: when is the lead-lag active vs dormant?"""
rows = []
for start in range(0, len(data) - window, step):
chunk = data.iloc[start:start + window][[target, predictor]].dropna()
if len(chunk) < window * 0.8:
continue
try:
out = grangercausalitytests(chunk, maxlag=[lag])
f_stat, p_value = out[lag][0]["ssr_ftest"][:2]
except Exception:
f_stat, p_value = np.nan, np.nan
rows.append({"timestamp": data.index[start + window - 1],
"f_stat": f_stat, "p_value": p_value})
return pd.DataFrame(rows).set_index("timestamp")
Laporkan dua hal dari rangkaian ini: pecahan jendela di bawah 0,05, dan jumlah penyeberangan ambang batas. Suatu hubungan yang signifikan pada 80% jendela dengan tiga persimpangan adalah objek yang berbeda dari satu hubungan signifikan pada 55% jendela dengan empat puluh persimpangan, meskipun nilai p yang dikumpulkan adalah identik. Yang kedua tidak dapat diperdagangkan — Anda tidak dapat mengukur posisi berdasarkan sinyal yang keberadaannya berubah setiap beberapa ratus bar, dan jeda estimasi ulang menjamin Anda selalu memperdagangkan rezim sebelumnya.
Perangkap data yang khusus untuk Granger

Kebersihan data kripto umum dibahas di tempat lain – kesenjangan dan candle yang hilang paritas backtest-live, disiplin stempel waktu di taksonomi bias melihat ke depan Dan terbukti tidak melihat ke depan dalam jangka waktu tertentu. Namun, ada satu mode kegagalan yang spesifik untuk Granger dan cukup parah untuk disebutkan:
Pengisian ke depan menghasilkan hasilnya. Lilin yang diisi ke depan mengulangi penutupan sebelumnya, yang memasukkan autokorelasi murni ke dalam rangkaian — dan autokorelasi lag-1 di yang secara mekanis selaras dengan tidak dapat dibedakan, menurut uji F, dari hubungan sebab akibat satu lag. Hal yang sama juga berlaku di berbagai lokasi: perbedaan jam 1 detik antara dua bursa pada bar menit dapat langsung menciptakan atau menghancurkan signifikansi lag-1, karena hal ini menggeser sisi batas bar mana yang menjadi tempat pergerakan. Sebelum menjalankan semua ini, pastikan bahwa celah telah dihilangkan dan bukan diisi, dan bahwa kedua rangkaian dicap dari jam yang sama.
Temuan lead-lag yang dilaporkan dalam literatur

Ini adalah kutipan, bukan pengukuran dari artikel ini. Mereka di sini untuk menyampaikan apa yang diklaim oleh catatan yang dipublikasikan, sehingga perbandingan di atas ada yang setuju atau tidak setuju.
- BTC ke altcoin. Studi tahun 2026 di Pasar Keuangan Asia-Pasifik (Peloncat) melaporkan transmisi harga frekuensi tinggi dari Bitcoin ke altcoin, dengan koin berkapitalisasi kecil menunjukkan respons yang tertunda secara signifikan dan likuiditas yang lebih rendah terkait dengan reaksi yang lebih lambat. Besaran lag yang biasa dikutip dari pekerjaan ini — kira-kira 1-3 menit BTC ke ETH, lebih lama untuk kapitalisasi menengah dan kecil, semakin searah seiring turunnya kapitalisasi pasar — temuan yang dikutip, tidak diturunkan kembali di sini. Tingkat kapitalisasi pasar yang mereka tempati adalah tangga yang sama dengan yang digunakan validasi multi-simbol.
- CEX memimpin DEX. Penelitian tentang struktur mikro kripto (MDPI) melaporkan lokasi terpusat yang mendominasi penemuan harga, dengan aliran informasi berjalan dari CEX ke DEX dan tidak ada kausalitas balik yang signifikan — konsisten dengan mesin pencocokan sub-milidetik versus penyelesaian waktu blok.
- ETH sebagai koin independen. Pekerjaan VAR-SVAR (MDPI) menemukan rezim di mana Ethereum bertindak sebagai sumber dan Bitcoin sebagai penerima limpahan, terutama selama fase yang didorong oleh DeFi dan NFT.
Pertukaran silang, sebentar
Keterlambatan dua tempat yang sama merupakan suatu hal yang benar-benar terjadi, namun faktor keekonomiannya — ambang batas biaya, tangga latensi, alasan terjadinya kelambatan tersebut — telah diselesaikan dalam beberapa tahun terakhir. arbitrase statistik dan perdagangan berpasangan Dan premium kimchi. Satu-satunya hal yang Granger tambahkan adalah pertanyaan stabilitas: apakah kausalitas Binance-ke-Coinbase terus-menerus signifikan, atau apakah kausalitasnya berkedip-kedip seperti yang lainnya? Jalankan tes bergulir pada pasangan venue; jawabannya adalah deret waktu nilai-p, bukan ya.
Mengubah ketertinggalan menjadi sebuah posisi

Jika pasangan melewati ambang batas yang dikoreksi dan uji bergulir, sinyalnya sendiri sepele: prediktor kumulatif kembali melalui jendela jeda, ambang batas.
def lead_lag_signal(btc_returns, alt_returns, lag=5, threshold=0.001):
"""+1 / -1 / 0 on ALT from BTC's cumulative return over `lag` bars."""
btc_cum = btc_returns.rolling(lag).sum()
signal = pd.Series(0, index=alt_returns.index)
signal[btc_cum > threshold] = 1
signal[btc_cum < -threshold] = -1
return signal
Tiga hal yang bukan merupakan bagian dari pasal ini karena sudah diatur di sini:
- Biaya menentukannya. Sinyal jeda skala menit pada altcoin harus menghapus penyebaran, dampak, dan biaya — lihat model slippage dan biaya Dan ekonomi pembuat-pengambil, Dan apa yang terjadi ketika biaya diterapkan pada pemenang terpilih.
- Pengukuran bukanlah transformasi nilai p. Menskalakan eksposur secara berbanding terbalik dengan nilai p Granger adalah salah: nilai p adalah bukti yang menunjukkan nilai nol, bukan ukuran efek, dan nilai tersebut bergerak seiring dengan panjang sampel. Ukuran perkiraan dampak dan ketidakpastiannya — lihat ukuran Kelly.
- Validasi berjalan maju. Memperkirakan ulang secara bergilir dan mengevaluasi di luar sampel; optimasi berjalan ke depan adalah protokolnya.
Keterbatasan

Kausalitas Granger bukanlah kausalitas. Perancu (peristiwa makro yang menggerakkan kedua kaki dengan sedikit ketidakselarasan stempel waktu), penggerak umum (dua alt mengikuti BTC dengan kecepatan berbeda), dan variabel yang dihilangkan (menguji BTC ke DOGE tanpa ETH di sistem) semuanya menghasilkan statistik signifikan tanpa aliran informasi langsung. Membatasi pengujian bivariat, seperti yang dilakukan artikel ini, membuat masalah variabel yang dihilangkan menjadi lebih buruk, bukan lebih baik.
Linearitas. Pengujian ini hanya melihat struktur prediksi linier dalam rata-rata bersyarat. Crypto memiliki pengelompokan volatilitas, efek leverage, dan peralihan rezim — lihat Perkiraan volatilitas GARCH Dan Korelasi dinamis DCC-GARCH untuk cerita momen kedua. Alternatif nonlinier yang perlu diketahui: uji kernel Diks-Panchenko (2006), entropi transfer sebagai analog teori informasi, dan kausalitas kopula Granger di seluruh distribusi gabungan penuh.
Kerusakan struktural. Hubungan apa pun yang diperkirakan pada satu jendela bergantung pada rezim jendela tersebut; tes bergulir di atas adalah diagnostik minimum, dan ini adalah diagnostik, bukan perbaikan.
Ringkasan

- Sesuaikan VAR pada level, pilih dengan BIC per pasang, ditambah dengan , dan uji Wald yang pertama hanya tertinggal. Bangun matriks pembatasan dengan tangan - milik perpustakaan
test_causalitymembatasi penambahan lag juga, yang bukan merupakan Toda-Yamamoto. - Jalankan pengujian return yang berbeda sebagai dasar pada pasangan dan lag yang sama, dan laporkan ketidaksepakatan. Tabel itu adalah temuannya; matriks tanda bintang tidak.
- Perbaiki matriks untuk kelompok uji yang berkorelasi melalui N yang efektif, bukan Bonferroni, dan laporkan berapa banyak sel yang bertahan.
- Gulung. Laporkan sebagian kecil jendela yang signifikan dan jumlah penyeberangan. Signifikansi bahwa kedipan bukanlah kelambatan yang dapat diperdagangkan tidak peduli seberapa kecil nilai p yang dikumpulkan.
- Hilangkan kesenjangan alih-alih mengisi ke depan, dan periksa penyelarasan jam di seluruh tempat, sebelum mempercayai hasil lag-1 apa pun.
Hasil yang sangat baik dari prosedur ini adalah negatif — hubungan BTC-ke-alt yang signifikan dalam sampel, bertahan dari koreksi, dan masih melewati garis 0,05 di kedua arah setiap beberapa ratus batang adalah hasil nyata tentang kemampuan diperdagangkan, dan layak dipublikasikan sebagai satu kesatuan.
Referensi
- Granger, C.W.J. (1969). "Menyelidiki Hubungan Sebab-Akibat dengan Model Ekonometrika dan Metode Lintas Spektral." Ekonometria, 37(3), 424-438.
- Hari ini, H.Y. dan Yamamoto, T. (1995). "Inferensi statistik dalam autoregresi vektor dengan kemungkinan proses terintegrasi." Jurnal Ekonometrika, 66(1-2), 225-250.
- Diks, C. dan Panchenko, V. (2006). "Pedoman statistik dan praktis baru untuk pengujian kausalitas Granger nonparametrik." Jurnal Dinamika dan Pengendalian Ekonomi, 30(9-10), 1647-1669.
- Sifat, IM, Mohamad, A. (2019). "Hubungan Lead-Lag antara Bitcoin dan Ethereum: Bukti dari data per jam dan harian." Penelitian Bisnis dan Keuangan Internasional, 50, 306-321.
- "Transmisi Harga dari Bitcoin ke Altcoin: Bukti dan Implikasi Frekuensi Tinggi terhadap Strategi Perdagangan." Pasar Keuangan Asia-Pasifik, Springer, 2026.
- "Risiko Limpahan di Pasar Mata Uang Kripto: Pandangan dari Kausalitas Granger VAR-SVAR." Jurnal Manajemen Risiko dan Keuangan, MDPI.
- "Struktur Dua Tingkat Pasar Suku Bunga Pendanaan Cryptocurrency." Matematika, MDPI.
- "Pertukaran terdesentralisasi dan terpusat: Token digital manakah yang memiliki risiko penularan lebih besar?" Ilmu Langsung, 2023.
Penulis
Trading-systems engineer
Trading-systems engineer building bots since 2017: cross-exchange arbitrage (connected up to 30 venues), cointegration-based pairs arbitrage across spot and futures, scalping, news and sentiment-driven strategies, trend algorithms, and portfolio management and balancing algorithms. Also builds sub-millisecond order execution, big-data warehouses, backtesting engines, AI agents, and trading interfaces (incl. open-source profitmaker.cc). Stack: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, architecture.