Toda-Yamamoto vs Differenced Granger: Does the BTC Lead-Lag Survive?
Hampir setiap hasil Granger-causality yang diterbitkan pada crypto dikira berdasarkan pulangan log. Pilihan itu tidak percuma. Pembezaan menjadikan siri pegun, yang diperlukan oleh ujian-F standard, tetapi ia juga membuang perhubungan tahap — dan jika dua syiling disatukan, VAR yang dibezakan salah ditentukan dan ujian menjawab soalan yang sedikit berbeza daripada yang anda tanya.
Toda dan Yamamoto (1995) menawarkan jalan keluar: muatkan VAR pada tahap dengan ketinggalan tambahan, uji hanya yang asal dan dapatkan tahap yang sah tanpa mengira punca unit atau kointegrasi. Ia terkenal dalam ekonometrik dan hampir tidak pernah digunakan untuk crypto lead-lag.
Jadi artikel ini melakukan satu perkara: jalankan kedua-dua ujian pada pasangan yang sama, pada tetingkap yang sama dan laporkan sama ada mereka tidak bersetuju. Kemudian gunakan susulan yang jujur — pembetulan ujian berbilang keluarga berkorelasi pada matriks yang terhasil dan nilai p bergulir untuk melihat sama ada ketinggalan "ketara" cukup stabil untuk didagangkan atau hanya berkelip merentasi ambang.
Teori di bawah hanya sebanyak yang diperlukan untuk membuat perbandingan boleh dibaca. Blog sudah merangkumi punca unit, kointegrasi, pemuatan data, saiz dan kos; itu adalah pautan, bukan bahagian.
Apa yang sebenarnya dituntut oleh kausaliti Granger

Kausalitas Granger ialah dahuluan ramalan, bukan mekanisme: Granger-sebab kalau lepas mengurangkan varians ralat ramalan bagi melebihi masa lalu sudah menerangkan.
Granger-sebab jika
Dua siri yang didorong oleh faktor tersembunyi biasa boleh menunjukkan kaitan Granger tanpa hubungan langsung antara mereka. Dalam crypto, kaveat itu bukan akademik — BTC ialah faktor dominan tunggal di seluruh kompleks altcoin, jadi hampir mana-mana "kausalitas" alt-to-alt ialah artifak calon yang mempunyai kelajuan tindak balas yang berbeza kepada kejutan BTC yang sama.
Rangka kerja VAR
Ujian ini hidup di dalam Vector Autoregression. Untuk dua pembolehubah dengan ketinggalan:
Dalam bentuk matriks, VAR(p) dengan pembolehubah:
Menguji sama ada Granger-sebab sedang menguji sekatan sendi dalam persamaan pertama. Laluan standard ialah ujian-F pada jumlah sisa petak terhad vs tidak terhad,
dengan bentuk Wald yang setara secara asimptotik . Semua yang berikut ialah soalan tentang pekali yang mana sekatan digunakan dan pada data apa VAR telah dipasang.
Pemilihan ketinggalan
perkara yang lebih penting daripada kebanyakan penulisan akui: terlalu sedikit ketinggalan merindui dinamik, terlalu banyak membakar darjah kebebasan dan memusnahkan kuasa.
Julat carian yang munasabah: 1-60 pada data kedua, 1-30 pada data minit, 1-48 pada setiap jam. BIC ialah lalai yang betul di sini — ia adalah kriteria yang lebih parsimoni, dan lead-lag dalam pasangan kripto cair ialah fenomena ingatan pendek. Setiap keputusan di bawah melaporkan BIC yang dipilih setiap pasangan dan bukannya menetapkan satu ketinggalan merentasi alam semesta, kerana ketinggalan tetap secara senyap menukar pilihan pemilihan ketinggalan kepada tuntutan kepentingan.
Mengapa ujian yang berbeza adalah lalai yang salah

Siri harga kripto ialah I(1). Pembaikan biasa — ambil pulangan log — membeli pegun pada kos tahap kointegrasi, dan jika pasangan itu berkongsi keseimbangan jangka panjang, VAR yang dibezakan adalah salah ditentukan. Jentera unit-root dan kointegrasi di belakang ayat tersebut (ADF, Engle-Granger dengan nilai kritikal Monte-Carlonya, Johansen pada sistem VAR) telah pun diliputi dalam arbitraj statistik dan perdagangan pasangan; andaikan di sini. Intinya hanyalah bahawa ubat biasa - perbezaan, kemudian ujian - adalah keputusan pemodelan dengan akibat, dan Toda-Yamamoto adalah cara untuk mengelak daripada membuatnya.
Prosedur Toda-Yamamoto
Pasangkan VAR dengan ketinggalan, di mana ialah susunan ketinggalan yang optimum dan ialah susunan penyepaduan maksimum siri, kemudian menguji sekatan hanya pada yang pertama ketinggalan. Tambahan ketinggalan menyerap tidak pegun; statistik Wald pada yang pertama pekali mengikut piawaian tidak kira sama ada siri itu adalah I(0), I(1), atau bersepadu.
- Tentukan — ADF dan KPSS pada setiap siri. Untuk harga crypto hampir selalu.
- Pilih — muatkan VAR pada tahap, pilih mengikut BIC.
- Anggarkan VAR yang ditambah() pada tahap, tiada perbezaan.
- Wald-uji yang pertama ketinggalan sahaja, mengabaikan tambahan. Hasilnya ialah .
Hasilnya: tiada ujian pra kointegrasi, tiada perbezaan dan saiz ujian yang betul — kadar penolakan di bawah nol kekal hampir nominal walau apa pun sifat penyepaduan itu. Kosnya ialah langkah 4 bukan apa test_causality lakukan secara lalai, di mana kebanyakan pelaksanaan secara senyap-senyap menjadi salah.
Pelaksanaan

Andaikan anda sudah mempunyai bar minit yang dijajarkan dalam DataFrame — pelat dandang pengambilan dan indeks ccxt berada dalam pengesan rejim dengan HMM, dan pembungkus ADF yang anda akan gunakan untuk langkah 1 adalah dalam arbitraj statistik dan perdagangan pasangan.
Satu nota versi sebelum mana-mana ini dijalankan: grangercausalitytests(..., verbose=False) telah ditamatkan dan kemudian dialih keluar dalam model statistik 0.15. Lepaskan hujah (fungsi tidak lagi mencetak secara lalai) atau pin statsmodels<0.15. Kod di bawah menganggap tandatangan moden.
Toda-Yamamoto, dilakukan dengan betul
Sekatan itu perlu dibina dengan tangan. VARResults.test_causality menguji semua ketinggalan pembolehubah penyebab dalam model yang dipasang — pada VAR tambahan() yang merangkumi ketinggalan dalam sekatan, iaitu apa yang Toda-Yamamoto katakan jangan lakukan. Pembetulan adalah eksplisit matriks terhadap kovarians pekali 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 butiran yang mudah tersalah dan yang membatalkan ujian jika anda melakukannya. Pertama, aritmetik indeks mesti sepadan dengan cara model statistik diratakan params — sahkan pada model yang dipasang itu beta[target_idx * n_per_eq + 1] sama res.params.iloc[1, target_idx] sebelum mempercayai mana-mana nilai-p. Kedua, gunakan np.linalg.solve, bukan pinv: jika adalah tunggal sekatan itu merosot dan larian harus gagal dengan kuat dan bukannya mengembalikan nombor yang kelihatan munasabah. Pseudo- songsang di sini ialah cara ujian Wald yang rosak bertahan dalam semakan kod.
Granger berbeza standard, sebagai perbandingan
Garis dasar perbandingan menentang — pulangan log, pasangan yang sama, ketinggalan 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}
Nota maxlag=[p] bukannya maxlag=p: melepasi int menjalankan setiap ketinggalan dari 1 hingga dan menggoda anda untuk melaporkan yang terbaik, iaitu ujian berbilang yang tidak dilog di atas berbilang ujian yang anda sedang jalankan.
Perbandingannya
Untuk setiap pasangan, jalankan ujian berbeza pada pulangan dan Toda-Yamamoto pada tahap, pada BIC-dipilih yang sama , dan jadual di mana kedua-duanya tidak bersetuju. Percanggahan pendapat ialah sel yang menarik: pasangan yang ketara pada perbezaan tetapi tidak pada tahap ialah artifak calon yang membezakan hubungan kointegrasi; sebaliknya mencadangkan hubungan tahap membawa maklumat yang tidak dapat dilihat oleh ujian pulangan.
Perbandingan berbilang pada matriks kausaliti

yang penuh matriks adalah di mana ini menjadi berbahaya. Sapuan 20 aset, 10 lag ialah 3,800 ujian hipotesis, dan Bonferroni ialah pembetulan yang salah untuk keluarga yang berkorelasi ini — ujian berkongsi data, berkongsi faktor BTC dan tidak berdikari, jadi Bonferroni pada masa yang sama terlalu konservatif secara agregat dan mengelirukan tentang sel yang bertahan. Gunakan jentera effective-N daripada artikel Sharpe yang kempis, yang dibina untuk situasi ini: kumpulkan keluarga ujian yang berkorelasi, kira percubaan bebas dan bukannya ujian mentah, dan ambang terhadapnya.
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
Nombor yang penting bukanlah bilangan sel yang berada di bawah 0.05 — tetapi bilangan sel yang bertahan dalam ambang pembetulan N berkesan.
Baca matriks yang masih hidup secara berstruktur, bukan sel demi sel: baris yang mana satu aset menyebabkan banyak yang lain mengesahkan hierarki maklumat; lajur yang disebabkan oleh tiada apa-apa menunjukkan dinamik khusus token yang istimewa dan bukannya penemuan.
Ujian jujur: kestabilan bergolek

Satu nilai p dalam sampel hampir tidak bernilai untuk dagangan. Persoalan yang berkaitan ialah sama ada kepentingan berterusan. Perhubungan silang aset dalam kripto adalah bergantung kepada rejim — struktur korelasi berbeza dengan ketara antara tenang dan panik, dan rejim itu sendiri boleh dianggarkan (pengesan rejim HMM) — jadi lag pendahuluan yang dianggarkan pada satu tetingkap ialah pernyataan tentang tetingkap 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 perkara daripada siri ini: pecahan tingkap di bawah 0.05, dan bilangan lintasan ambang. Hubungan yang signifikan dalam 80% tingkap dengan tiga lintasan ialah objek yang berbeza daripada satu signifikan dalam 55% tingkap dengan empat puluh lintasan, walaupun jika nilai p terkumpul adalah sama. Yang kedua tidak boleh didagangkan — anda tidak boleh menentukan saiz kedudukan pada isyarat yang kewujudannya bertukar setiap beberapa ratus bar, dan lag anggaran semula menjamin anda sentiasa berdagang dengan rejim sebelumnya.
Perangkap data yang khusus untuk Granger

Kebersihan data kripto generik diliputi di tempat lain — jurang dan lilin yang hilang dalam pariti langsung ujian belakang, disiplin cap masa dalam taksonomi berat sebelah pandangan ke hadapan dan membuktikan tiada pandangan ke hadapan merentasi jangka masa. Satu mod kegagalan, bagaimanapun, adalah khusus Granger dan cukup teruk untuk menamakan:
Pengisian ke hadapan menghasilkan hasilnya. Lilin yang diisi ke hadapan mengulangi penutup sebelumnya, yang menyuntik autokorelasi tulen ke dalam siri — dan autokorelasi lag-1 dalam yang diselaraskan secara mekanikal dengan tidak dapat dibezakan, kepada ujian-F, daripada hubungan sebab akibat satu lag. Perkara yang sama berlaku di seluruh venue: 1 saat mengimbangi antara dua pertukaran pada bar minit boleh mencipta atau memusnahkan kepentingan lag-1 secara langsung, kerana ia mengalihkan bahagian sempadan bar yang mana satu pergerakan mendarat. Sebelum menjalankan mana-mana ini, sahkan bahawa jurang digugurkan dan bukannya diisi dan kedua-dua siri dicop dari jam yang sama.
Melaporkan penemuan lead-lag dalam literatur

Ini adalah petikan, bukan ukuran daripada artikel ini. Mereka di sini untuk menyatakan apa yang didakwa oleh rekod yang diterbitkan, supaya perbandingan di atas mempunyai sesuatu untuk dipersetujui atau tidak dipersetujui.
- BTC kepada altcoin. Kajian 2026 dalam Pasaran Kewangan Asia-Pasifik (Springer) melaporkan penghantaran harga frekuensi tinggi daripada Bitcoin kepada altcoin, dengan syiling bermodal kecil menunjukkan respons tertangguh dengan ketara dan kecairan yang lebih rendah dikaitkan dengan tindak balas yang lebih perlahan. Magnitud ketinggalan yang lazimnya dipetik daripada barisan kerja ini — kira-kira 1-3 minit BTC ke ETH, lebih lama untuk had pertengahan dan kecil, semakin satu arah apabila had pasaran jatuh — ialah dapatan yang dipetik, tidak diperoleh semula di sini. Peringkat kapitalisasi pasaran yang mereka gunakan ialah tangga yang sama digunakan dalam pengesahan berbilang simbol.
- CEX mengetuai DEX. Penyelidikan tentang struktur mikro kripto (MDPI) melaporkan tempat berpusat yang mendominasi penemuan harga, dengan aliran maklumat berjalan CEX-to-DEX dan tiada sebab-musabab songsang yang ketara — konsisten dengan enjin padanan sub-milisaat berbanding penyelesaian masa sekatan.
- ETH sebagai syiling bebas. Kerja VAR-SVAR (MDPI) mencari rejim di mana Ethereum bertindak sebagai sumber dan Bitcoin sebagai penerima limpahan, terutamanya semasa fasa didorong DeFi dan NFT.
Pertukaran silang, secara ringkas
Jeda syiling-dua-tempat yang sama adalah persediaan sebenar, tetapi ekonominya — ambang yuran, tangga kependaman, sebab lag itu wujud sama sekali — sudah diatasi dalam arbitraj statistik dan perdagangan pasangan dan kimchi premium. Satu-satunya perkara yang Granger tambah ialah soalan kestabilan: adakah kausaliti Binance-to-Coinbase berterusan penting, atau adakah ia berkelip seperti yang lain? Jalankan ujian bergolek pada pasangan tempat; jawapannya ialah siri masa nilai-p, bukan ya.
Mengubah ketinggalan yang masih ada kepada kedudukan

Jika pasangan mengosongkan ambang yang diperbetulkan dan ujian guling, isyarat itu sendiri adalah remeh: peramal terkumpul kembali ke atas tetingkap ketinggalan, ambang.
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 perkara yang bukan sebahagian daripada artikel ini kerana ia telah diselesaikan di sini:
- Kos menentukannya. Isyarat lag skala minit pada altcoin perlu menghapuskan sebaran, impak dan yuran — lihat model gelinciran dan kos dan ekonomi pembuat-pengambil, dan apa yang berlaku apabila kos dikenakan kepada pemenang yang dipilih.
- Sizing bukan transformasi nilai-p. Penskalaan pendedahan secara songsang dengan nilai p Granger adalah salah: nilai-p ialah bukti terhadap nol, bukan saiz kesan dan ia bergerak dengan panjang sampel. Saiz pada anggaran kesan dan ketidakpastiannya — lihat Saiz Kelly.
- Pengesahan adalah berjalan ke hadapan. Anggarkan semula secara bergilir dan nilaikan kehabisan sampel; pengoptimuman berjalan ke hadapan ialah protokol.
Had

Penyebab Granger bukan kausaliti. Pembaur (peristiwa makro menggerakkan kedua-dua kaki dengan sedikit salah penjajaran cap masa), pemacu biasa (dua alt kedua-duanya mengikuti BTC pada kelajuan berbeza) dan pembolehubah yang ditinggalkan (menguji BTC kepada DOGE tanpa ETH dalam sistem) semuanya menghasilkan statistik penting tanpa aliran maklumat langsung. Mengehadkan kepada ujian bivariat, seperti yang dilakukan oleh artikel ini, menjadikan masalah pembolehubah yang ditinggalkan lebih teruk, bukan lebih baik.
Kelinearan. Ujian hanya melihat struktur ramalan linear dalam min bersyarat. Kripto mempunyai pengelompokan turun naik, kesan leverage dan suis rejim — lihat ramalan turun naik GARCH dan korelasi dinamik DCC-GARCH untuk cerita detik kedua. Alternatif bukan linear yang patut diketahui: ujian kernel Diks-Panchenko (2006), pemindahan entropi sebagai analog teori-maklumat, dan kausalitas kopula Granger merentas pengedaran bersama penuh.
Pemecahan struktur. Sebarang perhubungan yang dianggarkan pada satu tetingkap adalah bersyarat pada rejim tetingkap itu; ujian rolling di atas adalah diagnostik minimum, dan ia adalah diagnostik, bukan pembetulan.
Ringkasan

- Pasangkan VAR pada aras, pilih oleh BIC setiap pasangan, ditambah dengan , dan Wald-test yang pertama ketinggalan sahaja. Bina matriks sekatan dengan tangan — milik perpustakaan
test_causalitymengehadkan ketinggalan tambahan juga, yang bukan Toda-Yamamoto. - Jalankan ujian pulangan berbeza sebagai garis dasar pada pasangan dan ketinggalan yang sama, dan laporkan perselisihan faham. Jadual itu adalah penemuan; matriks asterisk bukan.
- Betulkan matriks untuk keluarga ujian berkorelasi melalui N berkesan, bukan Bonferroni, dan laporkan bilangan sel yang hidup.
- Gulungkannya. Laporkan pecahan tingkap penting dan kiraan lintasan. Kepentingan bahawa kelipan bukanlah ketinggalan yang boleh didagangkan tidak kira betapa kecilnya nilai p terkumpul.
- Kurangkan celah daripada mengisi ke hadapan, dan semak penjajaran jam merentas venue, sebelum mempercayai sebarang keputusan lag-1.
Hasil yang sangat baik bagi prosedur ini adalah negatif — perhubungan BTC-ke-alt yang ketara dalam sampel, bertahan dalam pembetulan, dan masih melepasi garisan 0.05 dalam kedua-dua arah setiap beberapa ratus bar adalah hasil sebenar tentang kebolehdagangan dan berbaloi untuk diterbitkan sebagai satu.
Rujukan
- Granger, C.W.J. (1969). "Menyiasat Hubungan Penyebab oleh Model Ekonometrik dan Kaedah Rentas spektrum." Econometrica, 37(3), 424-438.
- Toda, H.Y. dan Yamamoto, T. (1995). "Inferens statistik dalam autoregresi vektor dengan kemungkinan proses bersepadu." Jurnal Ekonometrik, 66(1-2), 225-250.
- Diks, C. dan Panchenko, V. (2006). "Garis panduan statistik dan praktikal baharu untuk ujian kausaliti Granger bukan parametrik." Jurnal Dinamik dan Kawalan Ekonomi, 30(9-10), 1647-1669.
- Sifat, I.M., Mohamad, A. (2019). "Hubungan Lead-Lag antara Bitcoin dan Ethereum: Bukti daripada data setiap jam dan harian." Penyelidikan dalam Perniagaan dan Kewangan Antarabangsa, 50, 306-321.
- "Penghantaran Harga daripada Bitcoin kepada Altcoin: Bukti Frekuensi Tinggi dan Implikasi untuk Strategi Perdagangan." Pasaran Kewangan Asia-Pasifik, Springer, 2026.
- "Risiko Limpahan pada Pasaran Matawang Kripto: Pandangan daripada VAR-SVAR Granger Causality." Jurnal Pengurusan Risiko dan Kewangan, MDPI.
- "Struktur Dua Peringkat Pasaran Kadar Pembiayaan Mata Wang Kripto." Matematik, MDPI.
- "Pertukaran terpencar dan terpusat: Token digital manakah yang menimbulkan risiko penularan yang lebih besar?" ScienceDirect, 2023.
Pengarang
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.