Toda-Yamamoto vs Differenced Granger: Does the BTC Lead-Lag Survive?
Casi todos los resultados de causalidad de Granger publicados en criptomonedas se calculan en retornos de registros. Esa elección no es gratuita. La diferenciación hace que la serie sea estacionaria, lo que requiere la prueba F estándar, pero también descarta la relación de nivel, y si dos monedas están cointegradas, el VAR diferenciado está mal especificado y la prueba responde una pregunta ligeramente diferente a la que usted formuló.
Toda y Yamamoto (1995) ofrecen una salida: instalar el VAR en niveles con retrasos adicionales, probar sólo los originales y obtener un resultado válido. independientemente de las raíces unitarias o la cointegración. Es bien conocido en econometría y casi nunca se aplica al avance y retraso de las criptomonedas.
Entonces, este artículo hace una cosa: ejecutar ambas pruebas en los mismos pares, en la misma ventana, e informar si no están de acuerdo. Luego, aplique el seguimiento honesto: una corrección de pruebas múltiples de familias correlacionadas en la matriz resultante y un valor p móvil para ver si el retraso "significativo" es lo suficientemente estable como para negociarse o simplemente parpadea a través del umbral.
La teoría siguiente es sólo la necesaria para que la comparación sea legible. El blog ya cubre raíces unitarias, cointegración, carga de datos, dimensionamiento y costos; Esos son enlaces, no secciones.
Lo que realmente afirma la causalidad de Granger

La causalidad de Granger es precedencia predictiva, no mecanismo: causas-granger si pasado reduce la variación del error de pronóstico de más allá de lo pasado ya lo explica.
causas-granger si
Dos series impulsadas por un factor oculto común pueden mostrar la causalidad de Granger sin un vínculo directo entre ellas. En criptografía, esa advertencia no es académica: BTC es un único factor dominante en todo el complejo de altcoins, por lo que casi cualquier "causalidad" de alt a alt es un artefacto candidato de diferentes velocidades de respuesta al mismo shock de BTC.
El marco VAR
La prueba se encuentra dentro de un vector autorregresión. Para dos variables con retrasos:
En forma matricial, un VAR(p) con variables:
Probando si causas-granger está probando la restricción conjunta en la primera ecuación. La ruta estándar es una prueba F sobre sumas de cuadrados residuales restringidas versus no restringidas,
con la forma de Wald asintóticamente equivalente . Todo lo que sigue es una pregunta sobre a qué coeficientes se aplica esa restricción y sobre qué datos se ajustó el VAR.
Selección de retraso
Importa más de lo que admiten la mayoría de los artículos: muy pocos retrasos pierden la dinámica, demasiados queman grados de libertad y destruyen el poder.
Rangos de búsqueda razonables: 1-60 en datos por segundo, 1-30 en datos por minuto, 1-48 en datos por hora. BIC es el valor predeterminado correcto aquí: es el criterio más parsimonioso, y el retraso en los pares de criptomonedas líquidos es un fenómeno de memoria corta. Cada resultado a continuación informa el BIC seleccionado por par en lugar de fijar un retraso en todo el universo, porque un retraso fijo convierte silenciosamente una elección de selección de retraso en una afirmación de importancia.
Por qué la prueba diferenciada es el valor predeterminado incorrecto

Las series de precios de las criptomonedas son I(1). La solución habitual (tomar rendimientos logarítmicos) compra la estacionariedad al costo del nivel de cointegración, y si el par comparte un equilibrio de largo plazo, el VAR diferenciado está mal especificado. La raíz unitaria y la maquinaria de cointegración detrás de esa oración (ADF, Engle-Granger con sus valores críticos de Monte-Carlo, Johansen en un sistema VAR) ya están cubiertas en arbitraje estadístico y comercio de pares; asúmelo aquí. La cuestión es sólo que el remedio habitual (diferencia, luego prueba) es una decisión modeladora con consecuencias, y Toda-Yamamoto es la manera de evitar tomarla.
El procedimiento Toda-Yamamoto
Montar un VAR con retrasos, donde es el orden de retraso óptimo y es el orden de integración máximo de la serie, luego pruebe las restricciones solo en la primera retrasos. el extra los rezagos absorben la no estacionariedad; la estadística de Wald en el primer Los coeficientes siguen un estándar. independientemente de si las series son I(0), I(1) o cointegradas.
- Determinar — ADF y KPSS en cada serie. Para precios de criptomonedas casi siempre.
- Seleccionar — colocar un VAR en los niveles, elegir por BIC.
- Estime el VAR aumentado() en niveles, sin diferenciación.
- Pruebe Wald el primero solo retrasos, ignorando el extras. El resultado es .
La recompensa: no hay prueba previa de cointegración, no hay diferenciación y el tamaño de la prueba es correcto: la tasa de rechazo bajo la nula se mantiene cerca de lo nominal, cualesquiera que sean las propiedades de integración. El costo es que el paso 4 no es lo que test_causality lo hace de forma predeterminada, que es donde la mayoría de las implementaciones fallan silenciosamente.
Implementación

Supongamos que ya tiene barras de minutos alineadas en un DataFrame: el texto estándar de búsqueda e indexación de ccxt está en detección de régimen con HMM, y el contenedor ADF que usaría para el paso 1 está en arbitraje estadístico y pares trading.
Una nota de versión antes de que se ejecute todo esto: grangercausalitytests(..., verbose=False) quedó obsoleto y luego eliminado en statsmodels 0.15. Suelte el argumento (la función ya no se imprime de forma predeterminada) o fije statsmodels<0.15. El código siguiente asume la firma moderna.
Toda-Yamamoto, hecho correctamente
La restricción debe construirse a mano. VARResults.test_causality prueba todos los retrasos de la variable causante en el modelo ajustado - en un VAR aumentado() que incluye el retrasar la restricción, que es exactamente lo que Toda-Yamamoto dice que no se debe hacer. La solución es explícita. matriz contra la covarianza del coeficiente completo:
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,
}
Dos detalles en los que es fácil equivocarse y que invalidan la prueba si lo haces. Primero, la aritmética del índice debe coincidir con la forma en que se aplanan los modelos de estadísticas. params — verificar en un modelo equipado que beta[target_idx * n_per_eq + 1] es igual res.params.iloc[1, target_idx] antes de confiar en cualquier valor p. Segundo, use np.linalg.solve, no pinv: si es singular, la restricción es degenerada y la ejecución debería fallar ruidosamente en lugar de devolver un número que parezca plausible. Una pseudoinversa aquí es cómo las pruebas de Wald fallidas sobreviven a la revisión del código.
Granger diferenciada estándar, para comparar
La línea de base con la que se compara: rendimientos logarítmicos, mismos pares, mismo retraso BIC:
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] en vez de maxlag=p: pasar un int ejecuta cada retraso de 1 a y lo tienta a informar cuál es la mejor, que es una prueba múltiple no registrada además de la prueba múltiple que ya está ejecutando.
La comparación
Para cada par, ejecute la prueba diferenciada sobre rendimientos y Toda-Yamamoto sobre niveles, en el mismo BIC seleccionado. y tabular los puntos en los que no estén de acuerdo. El desacuerdo es la celda interesante: un par significativo en diferencias pero no en niveles es un artefacto candidato para descartar una relación de cointegración; lo contrario sugiere que la relación de nivel contiene información que la prueba de retorno no puede ver.
Comparaciones múltiples en una matriz de causalidad

el completo Matrix es donde esto se vuelve peligroso. Un barrido de 20 activos y 10 retrasos equivale a 3.800 pruebas de hipótesis, y Bonferroni es la corrección incorrecta para una familia tan correlacionada: las pruebas comparten datos, comparten el factor BTC y no son ni de lejos independientes, por lo que Bonferroni es simultáneamente demasiado conservador en conjunto y engañoso sobre qué células sobreviven. Utilice la maquinaria N efectiva de el artículo desinflado de Sharpe, que está diseñada exactamente para esta situación: agrupar la familia de pruebas correlacionadas, contar ensayos independientes en lugar de los sin procesar, y establecer un umbral en contra de eso.
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
El número que importa no es cuántas células están por debajo de 0,05, sino cuántas sobreviven al umbral corregido de N efectivo.
Lea la matriz superviviente estructuralmente, no celda por celda: las filas donde un activo causa que muchos otros confirmen una jerarquía de información; una columna causada por nada sugiere una dinámica idiosincrásica y específica de un token en lugar de un descubrimiento.
La prueba honesta: estabilidad en rodadura

Un único valor p en la muestra es casi inútil para el comercio. La pregunta relevante es si la significación persiste. Las relaciones entre activos en criptografía dependen del régimen (la estructura de correlación difiere marcadamente entre la calma y el pánico, y el régimen en sí es estimable (detección del régimen HMM), por lo que un retraso estimado en una ventana es una declaración sobre esa ventana.
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")
Informe dos cosas de esta serie: la fracción de ventanas por debajo de 0,05 y el número de cruces de umbrales. Una relación que es significativa en el 80% de las ventanas con tres cruces es un objeto diferente de una relación significativa en el 55% de las ventanas con cuarenta cruces, incluso si el valor p combinado es idéntico. El segundo no es negociable: no se puede dimensionar una posición en una señal cuya existencia cambia cada pocos cientos de barras, y el retraso en la reestimación garantiza que siempre se estará operando con el régimen anterior.
La trampa de datos específica de Granger

La higiene genérica de los datos criptográficos se trata en otros lugares: lagunas y velas faltantes en paridad backtest-live, disciplina de marca de tiempo en la taxonomía de sesgo de anticipación y demostración de que no hay anticipación en distintos períodos de tiempo. Sin embargo, un modo de falla es específico de Granger y lo suficientemente grave como para nombrarlo:
El llenado hacia adelante produce el resultado. Una vela llena hacia adelante repite el cierre anterior, lo que inyecta autocorrelación pura en la serie, y autocorrelación de retraso 1 en que está alineado mecánicamente con es indistinguible, según la prueba F, de una relación causal de un retraso. Lo mismo se aplica en todos los lugares: un desfase de reloj de 1 segundo entre dos intercambios en las barras de minutos puede crear o destruir la importancia del retraso 1 por completo, porque cambia de qué lado del límite de la barra cae un movimiento. Antes de ejecutar cualquier cosa, verifique que los espacios se eliminen en lugar de llenarse, y que ambas series estén estampadas desde el mismo reloj.
Hallazgos de adelanto y retraso informados en la literatura

Estas son citas, no medidas de este artículo. Están aquí para decir lo que afirma el registro publicado, de modo que la comparación anterior tenga algo con lo que estar de acuerdo o en desacuerdo.
- BTC a altcoins. Un estudio de 2026 en Mercados financieros de Asia-Pacífico (Springer) informa una transmisión de precios de alta frecuencia desde Bitcoin a altcoins, donde las monedas de pequeña capitalización muestran respuestas significativamente retrasadas y una menor liquidez asociada con reacciones más lentas. Las magnitudes de retraso comúnmente citadas en esta línea de trabajo (aproximadamente 1 a 3 minutos de BTC a ETH, más largas para empresas de mediana y pequeña capitalización, cada vez más unidireccionales a medida que cae la capitalización de mercado) son hallazgos citados, no re-derivados aquí. El nivel de capitalización de mercado en el que se basan es la misma escalera utilizada en la validación de múltiples símbolos.
- CEX lidera DEX. Investigación sobre microestructura criptográfica (MDPI) informa lugares centralizados que dominan el descubrimiento de precios, con un flujo de información que va de CEX a DEX y sin una causalidad inversa significativa, en consonancia con motores de comparación de submilisegundos versus liquidación en tiempo de bloque.
- ETH como moneda independiente. Trabajo VAR-SVAR (MDPI) encuentra regímenes en los que Ethereum actúa como fuente y Bitcoin como receptor de derrame, especialmente durante las fases impulsadas por DeFi y NFT.
Intercambio cruzado, brevemente
El retraso de la misma moneda en dos lugares es una configuración real, pero su economía (umbrales de tarifas, la escala de latencia, por qué existe el retraso) ya se ha analizado en arbitraje estadístico y comercio de pares y la prima de kimchi. Lo único que Granger añade es una cuestión de estabilidad: ¿la causalidad de Binance a Coinbase es persistentemente significativa, o parpadea como todo lo demás? Ejecute la prueba continua en el par de lugares; la respuesta es una serie temporal de valor p, no un sí.
Convertir un retraso superviviente en una posición

Si un par supera el umbral corregido y la prueba móvil, la señal en sí es trivial: el predictor acumulativo regresa a través de la ventana de retraso, con umbral.
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
Tres cosas que no forman parte de este artículo porque ya están zanjadas aquí:
- Los costos lo deciden. Una señal de retraso a escala de un minuto en las altcoins tiene que eliminar el diferencial, el impacto y las tarifas; consulte modelos de costos y deslizamiento y economía del creador-tomador, y qué sucede cuando los costos se aplican a un determinado ganador.
- El tamaño no es una transformación del valor p. Escalar la exposición inversamente con el valor p de Granger es incorrecto: un valor p es evidencia contra un tamaño nulo, no un efecto, y se mueve con la longitud de la muestra. Tamaño del efecto estimado y su incertidumbre: consulte Tamaño de Kelly.
- La validación es directa. Reestimar de forma continua y evaluar fuera de la muestra; optimización anticipada es el protocolo.
Limitaciones

La causalidad de Granger no es causalidad. Los factores de confusión (un evento macro que mueve ambas piernas con una ligera desalineación de la marca de tiempo), los impulsores comunes (dos alternativas que siguen a BTC a diferentes velocidades) y las variables omitidas (probar BTC con DOGE sin ETH en el sistema) producen estadísticas significativas sin flujo de información directo. Restringir las pruebas a pruebas bivariadas, como lo hace este artículo, empeora, en lugar de mejorar, el problema de la variable omitida.
Linealidad. La prueba solo ve una estructura predictiva lineal en la media condicional. Las criptomonedas tienen agrupaciones de volatilidad, efectos de apalancamiento y cambios de régimen; consulte pronóstico de volatilidad GARCH y correlación dinámica DCC-GARCH para conocer la historia del segundo momento. Alternativas no lineales que vale la pena conocer: la prueba del kernel de Diks-Panchenko (2006), la entropía de transferencia como análogo de la teoría de la información y la causalidad de la cópula de Granger en toda la distribución conjunta.
Rupturas estructurales. Cualquier relación estimada en una ventana está condicionada al régimen de esa ventana; La prueba continua anterior es el diagnóstico mínimo y es un diagnóstico, no una solución.
Resumen

- Ajusta el VAR en niveles, selecciona por BIC por par, aumentar por y Wald prueba el primero solo retrasos. Construya la matriz de restricción a mano: la biblioteca
test_causalitytambién restringe el retraso de aumento, que no es Toda-Yamamoto. - Ejecute la prueba de rendimiento diferenciado como punto de referencia en los mismos pares y retrasos, e informe los desacuerdos**. Esa tabla es el hallazgo; una matriz de asteriscos no lo es.
- Corrija la matriz para una familia de pruebas correlacionada mediante N efectivo, no Bonferroni, e informe cuántas células sobreviven.
- Enróllelo. Informe la fracción de ventanas significativas y el recuento de cruces. Importancia de que los parpadeos no sean un retraso negociable, sin importar cuán pequeño sea el valor p agrupado.
- Elimine los espacios en lugar de llenarlos hacia adelante y verifique la alineación del reloj en todos los lugares, antes de creer en cualquier resultado de retraso 1.
Un resultado perfectamente bueno de este procedimiento es negativo: una relación BTC-alt que es significativa en la muestra, sobrevive a la corrección y aún cruza la línea 0,05 en ambas direcciones cada pocos cientos de barras es un resultado real sobre la comerciabilidad y vale la pena publicarlo como tal.
Referencias
- Granger, CWJ. (1969). "Investigación de relaciones causales mediante modelos econométricos y métodos transespectrales". Econométrica, 37(3), 424-438. -Toda, H.Y. y Yamamoto, T. (1995). "Inferencia estadística en autorregresiones vectoriales con procesos posiblemente integrados". Revista de Econometría, 66(1-2), 225-250.
- Diks, C. y Panchenko, V. (2006). "Una nueva estadística y directrices prácticas para las pruebas de causalidad de Granger no paramétricas". Revista de Control y Dinámica Económica, 30(9-10), 1647-1669.
- Sifat, IM, Mohamad, A. (2019). "Relación de avance-retraso entre Bitcoin y Ethereum: evidencia de datos horarios y diarios." Investigación en Negocios y Finanzas Internacionales, 50, 306-321.
- "Transmisión de precios de Bitcoin a Altcoins: evidencia de alta frecuencia e implicaciones para la estrategia comercial." Mercados financieros de Asia y el Pacífico, Springer, 2026.
- "Riesgos de contagio en los mercados de criptomonedas: una mirada desde la causalidad de Granger VAR-SVAR." Revista de Gestión Financiera y de Riesgos, MDPI.
- "La estructura de dos niveles de los mercados de tasas de financiación de criptomonedas." Matemáticas, MDPI.
- "Intercambios descentralizados y centralizados: ¿Qué tokens digitales suponen un mayor riesgo de contagio?" ScienceDirect, 2023.
Authors
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.