← 返回文章列表
August 7, 2026
5 分鐘閱讀

Toda-Yamamoto vs Differenced Granger: Does the BTC Lead-Lag Survive?

Toda-Yamamoto vs Differenced Granger: Does the BTC Lead-Lag Survive?
#causal-inference
#Granger-causality
#lead-lag
#crypto
#VAR

幾乎所有已發布的加密貨幣格蘭傑因果關係結果都是根據對數返回計算的。這種選擇不是自由的。差分使序列平穩,這是標準 F 檢定所要求的,但它也放棄了水平關係 - 如果兩個硬幣是協整的,則差分 VAR 會被錯誤指定,並且測試回答的問題與您提出的問題略有不同。

Toda 和 Yamamoto (1995) 提供了一條出路:將 VAR 擬合到具有額外滯後的水平上,僅測試原始水平,並獲得有效的 χ2\chi^2,無論單位根或協整如何。它在計量經濟學中眾所周知,但幾乎從未應用於加密貨幣的超前滯後。

因此,本文做了一件事:**在同一視窗上對同一對進行這兩項測試,並報告它們是否不一致。 **然後應用誠實的後續措施 - 對結果矩陣進行相關係列多重測試校正,並滾動 p 值以查看“顯著”滯後是否足夠穩定以進行交易或只是在閾值上閃爍。

下面的理論僅是讓比較清晰所需的內容。該部落格已經涵蓋了單位根、協整、數據加載、大小調整和成本;這些是鏈接,而不是部分。

格蘭傑因果關係實際上主張什麼

市場事件中的定向超前-滯後路徑

Granger causality is predictive precedence, not mechanism: XX Granger-causes YY if past XX reduces the forecast error variance of YY beyond what past YY already explains.

XX 格蘭傑原因 YY 如果 σ2(YtYt1,,Ytp)>σ2(YtYt1,,Ytp,Xt1,,Xtp)\sigma^2(Y_t \mid Y_{t-1}, \ldots, Y_{t-p}) > \sigma^2(Y_t \mid Y_{t-1}, \ldots, Y_{t-p}, X_{t-1}, \ldots, X_{t-p})

由共同隱藏因素驅動的兩個序列可以顯示格蘭傑因果關係,但它們之間沒有直接聯繫。在加密貨幣中,這項警告並不是學術性的——BTC 是整個山寨幣複合體中的一個主導因素 ,因此幾乎任何山寨幣與山寨幣之間的「因果關係」都是對同一 BTC 衝擊的不同響應速度的候選產物。

VAR 框架

此測試位於向量自回歸內。對於具有 pp 滯後的兩個變數:

Yt=α0+i=1pαiYti+i=1pβiXti+ϵ1tY_t = \alpha_0 + \sum_{i=1}^{p} \alpha_i Y_{t-i} + \sum_{i=1}^{p} \beta_i X_{t-i} + \epsilon_{1t} Xt=γ0+i=1pγiXti+i=1pδiYti+ϵ2tX_t = \gamma_0 + \sum_{i=1}^{p} \gamma_i X_{t-i} + \sum_{i=1}^{p} \delta_i Y_{t-i} + \epsilon_{2t}

以矩陣形式,具有 kk 變數的 VAR(p):

yt=c+A1yt1++Apytp+ut\mathbf{y}_t = \mathbf{c} + \mathbf{A}_1 \mathbf{y}_{t-1} + \cdots + \mathbf{A}_p \mathbf{y}_{t-p} + \mathbf{u}_t

測試 XX 格蘭傑原因 YY 是否正在測試第一個方程式中的聯合限制 H0:β1==βp=0H_0: \beta_1 = \cdots = \beta_p = 0。標準路線是對受限制與無限制殘差平方和進行 F 檢驗,

F=(RSSrRSSu)/pRSSu/(T2p1)F = \frac{(RSS_r - RSS_u) / p}{RSS_u / (T - 2p - 1)}

具有漸近等價的 Wald 形式 W=T(RSSrRSSu)/RSSudχ2(p)W = T \cdot (RSS_r - RSS_u)/RSS_u \xrightarrow{d} \chi^2(p)。接下來的一切都是關於**限制適用於哪些係數以及 VAR 擬合在哪些數據上的問題。 **

滯後選擇

pp 比大多數文章所承認的更重要:太少的滯後會錯過動態,太多的滯後會燒毀自由度並破壞力量。

AIC(p)=lnΣ^u(p)+2pk2T,BIC(p)=lnΣ^u(p)+pk2lnTT\text{AIC}(p) = \ln|\hat{\Sigma}_u(p)| + \frac{2pk^2}{T}, \qquad \text{BIC}(p) = \ln|\hat{\Sigma}_u(p)| + \frac{pk^2 \ln T}{T} HQIC(p)=lnΣ^u(p)+2pk2ln(lnT)T\text{HQIC}(p) = \ln|\hat{\Sigma}_u(p)| + \frac{2pk^2 \ln(\ln T)}{T}

合理的搜尋範圍:秒數據1-60,分鐘數據1-30,每小時1-48。 BIC 在這裡是正確的預設值——它是更簡約的標準,而流動加密貨幣對中的超前滯後是一種短記憶現象。 下面的每個結果都報告了每對 BIC 選擇的 pp,而不是修復整個宇宙中的一個滯後,因為固定滯後會默默地將滯後選擇選擇轉換為顯著性聲明。

為什麼差分檢驗不是正確的預設選擇

差異可能會破壞超前-滯後關係

加密貨幣價格系列為 I(1)。通常的修復方法——採用對數回報——以協整水準為代價購買平穩性,如果貨幣對共享長期均衡,則差異 VAR 被錯誤指定。這句話背後的單位根和協整機制(ADF、Engle-Granger 及其 Monte-Carlo 臨界值、Johansen 在 VAR 系統上)已包含在統計套利和配對交易;假設在這裡。關鍵在於,通常的補救措施——差異,然後測試——是一個具有後果的建模決策,而戶田山本是避免這樣做的方法。

正確實作 Toda-Yamamoto

擬合具有 p+dmaxp + d_{max} 滯後的 VAR,其中 pp 是最優滯後階數,dmaxd_{max} 是級數的最大積分階數,然後測試限制僅對第一個 pp 滯後。額外的 dmaxd_{max} 滯後吸收了非平穩性;第一個 pp 係數的 Wald 統計量遵循標準 χ2(p)\chi^2(p),無論序列是 I(0)、I(1) 還是協整。

  1. 確定 dmaxd_{max} — 每個系列上的 ADF 和 KPSS。對於加密貨幣價格,dmax=1d_{max} = 1 幾乎總是如此。
  2. 選擇 pp — 在等級上擬合 VAR,按 BIC 選擇。
  3. 估計水準上的增強VAR(p+dmaxp + d_{max}),無差異。
  4. Wald 測試第一個 pp 僅滯後,忽略 dmaxd_{max} 附加功能。結果是χ2(p)\chi^2(p)

回報:沒有協整預測試,沒有差異,且測試大小正確 - 無論積分屬性結果如何,零值下的拒絕率都保持在標稱值附近。代價是步驟 4 並不是 test_causality 預設執行的操作,而這正是大多數實作悄悄出錯的地方。

## 執行

滯後矩陣實現流程

假設您已經在 DataFrame 中對齊了分鐘柱 — ccxt 獲取和索引樣板位於 使用 HMM 進行製度檢測,並且您將用於步驟 1 的 ADF 包裝器位於 統計套利和配對交易 ] 中。

在運行任何此操作之前有一個版本說明:grangercausalitytests(..., verbose=False) 已棄用,然後在 statsmodels 0.15 中刪除。刪除參數(預設情況下函數不再列印)或固定 statsmodels<0.15。下面的程式碼採用現代簽名。

###戶田山本,正確完成

該限制必須手動建置。 VARResults.test_causality 測試擬合模型中導致變數的所有滯後 - 在增強 VAR(p+1p+1) 上,其中包括限制中的 dmaxd_{max} 滯後,這正是 Toda-Yamamoto 所說不要做的事情。修復方法是針對全係數協方差使用顯式 RR 矩陣:

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,
    }

有兩個細節很容易出錯,一旦出錯就會導致測試無效。首先,索引算術必須匹配 statsmodels 展平 params 的方式 — 在信任任何 p 值之前,在擬合模型上驗證 beta[target_idx * n_per_eq + 1] 等於 res.params.iloc[1, target_idx]。其次,使用 np.linalg.solve,而不是 pinv:如果 VV 是單數,則限制是退化的,並且運行應該大聲失敗,而不是返回看起來合理的數字。這裡的偽逆是破碎的 Wald 測試如何在程式碼審查中倖存下來。

標準差分格蘭傑,用於比較

比較的基線 — 對數回報、相同的配對、相同的 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}

請注意 maxlag=[p] 而不是 maxlag=p:傳遞一個 int 會運行從 1 到 pp 的每個滯後,並誘使您報告最佳的一個,這是在您已經運行的多個測試之上進行的未記錄的多個測試。

比較

對於每一對,在相同的 BIC 選擇的 pp 上運行收益差異測試和 Toda-Yamamoto 水平測試,並將兩者不一致的地方製成表格。分歧是一個有趣的單元:一對在差異上顯著但在水平上不顯著的對是差分協整關係的候選工件;相反,表明級別關係攜帶返回測試無法看到的信息。

因果矩陣上的多重比較

濾波大的因果關係矩陣

完整的 n×nn \times n 矩陣是危險的地方。 20 個資產、10 個滯後的掃描需要 3,800 個假設檢驗,而 Bonferroni 對於這種相關的系列來說是錯誤的修正——測試共享數據、共享 BTC 因子,而且遠非獨立,因此 Bonferroni 同時在總體上過於保守,並且誤導了哪些細胞存活。使用收縮的 Sharpe 文章 ** 中的**有效-N 機制,該機制正是針對這種情況而構建的:對相關測試系列進行聚類,對獨立試驗而不是原始試驗進行計數,並針對該情況設置閾值。

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

重要的數字不是有多少細胞低於 0.05,而是有多少細胞在有效 N 校正閾值下存活下來。

從結構上而不是逐個單元地讀取倖存矩陣:一項資產引起許多其他資產的行確認了資訊層次結構;一篇無緣無故的專欄暗示著特殊的、特定於代幣的動態,而不是一個發現。

誠實的測試:滾動穩定性

滾動視窗訊號穩定

單一樣本內 p 值對於交易來說幾乎毫無價值。相關問題是重要性是否持續。加密貨幣中的跨資產關係是依賴政權的——冷靜和恐慌之間的相關結構差異很大,而且政權本身是可估計的(HMM政權檢測)——因此在一個窗口上估計的超前滯後是關於該窗口的一種陳述。

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")

報告本系列中的兩件事:低於 0.05 的視窗比例,以及閾值交叉的數量。即使合併的 p 值相同,在 80% 具有 3 個交叉的視窗中顯著的關係與在 55% 的具有 40 個交叉的視窗中顯著的關係是不同的物件。第二個是不可交易的——您無法根據訊號確定頭寸大小,該訊號的存在每隔幾百條柱就會翻轉一次,並且重新估計滯後保證您始終在先前的狀態下進行交易。

Granger 特有的資料陷阱

不規則的加密貨幣蜱蟲擾亂因果訊號

其他地方涵蓋了通用加密資料衛生——回測實時奇偶性中的差距和缺失蠟燭,前瞻偏差分類法中的時間戳規則]和證明跨時間範圍沒有前瞻。然而,一種故障模式是格蘭傑特有的,並且嚴重到足以命名:

**向前填充產生結果。 ** 向前填充的蠟燭重複前一個收盤價,這將純粹的自相關注入到序列中 - 並且 YY 中與 XX 機械對齊的滯後 1 自相關對於 F 測試來說與單滯後因果關係無法區分。這同樣適用於不同場地:分鐘柱上兩次交易之間的 **1 秒時鐘偏移可以直接創建或破壞 lag-1 顯著性,因為它會改變移動落在柱邊界的哪一側。在運行任何此操作之前,請驗證間隙是否已刪除而不是填充,並且兩個系列都來自同一時鐘。

文獻中報告的領先-滯後關係

超前滯後研究的證據星座

這些是引文,而不是本文的測量結果。他們來這裡是為了說出已發表的記錄所聲稱的內容,因此上面的比較有一些同意或不同意的地方。

  • BTC 到山寨幣。 ** 亞太金融市場 (Springer) 中的一項 2026 年研究報告了從比特幣到山寨幣的高頻價格傳輸,小盤幣表現出明顯的延遲響應和與較慢的反應相關的流動性較低。這項工作中經常引用的滯後幅度——BTC 到 ETH 大約 1-3 分鐘,中小型股的時間更長,隨著市值下跌而越來越單向——是引用的發現,而不是在此處重新得出**。他們所依賴的市值分層與多交易品種驗證中使用的階梯相同。
  • **CEX 領先 DEX。 ** 對加密貨幣微觀結構的研究(MDPI)報告稱,中心化場所主導價格發現,信息流運行 CEX 到 DEX,並且沒有顯著的反向因果關係——與亞毫秒匹配引擎與區塊時間結算一致。
  • **ETH 作為一種獨立的貨幣。 ** VAR-SVAR 工作(MDPI)發現了以太坊作為來源、比特幣作為溢出接收者的機制,特別是在 DeFi 和 NFT 驅動的階段。

簡述跨交易所情況

同幣兩個場所的滯後是一個真實的設置,但它的經濟學——費用閾值、延遲階梯、滯後存在的原因——已經在統計套利和配對交易泡菜溢價]中得到解決。 Granger 唯一加入的是穩定性問題:Binance 到 Coinbase 的因果關係是否「持續」顯著,還是像其他一切一樣忽隱忽現?對場地對進行滾動測試;答案是 p 值時間序列,而不是肯定的。

將保留下來的滯後關係轉化為持倉

訊號閾值成為受控位置

如果一對清除了校正閾值滾動測試,則訊號本身是微不足道的:累積預測器在滯後視窗上返回,閾值化。

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

三件事不屬於本文的一部分,因為它們已經在這裡解決了:

限制

因果不確定性邊界

**格蘭傑因果關係不是因果關係。 ** 混雜因素(一個宏觀事件移動兩條腿,時間戳略有偏差)、共同驅動因素(兩個替代品都以不同的速度跟隨 BTC)和遺漏變數(在系統中沒有 ETH 的情況下測試 BTC 到 DOGE)都會產生重要的統計數據,但沒有直接的資訊流。正如本文所做的那樣,限制雙變量測試會使遺漏變量問題變得更糟,而不是更好。

**線性。 ** 此檢定僅在條件平均值中看到線性預測結構。加密貨幣具有波動性群集、槓桿效應和機制切換-有關第二時刻的故事,請參閱GARCH波動性預測DCC-GARCH動態相關性]。值得了解的非線性替代方案:Diks-Panchenko (2006) 內核測試、傳遞熵作為資訊理論模擬,以及整個聯合分佈中的 copula Granger 因果關係。

**結構中斷。 ** 在一個視窗上估計的任何關係都以該視窗的狀態為條件;上面的滾動測試是最低限度的診斷,它是診斷,而不是修復。

## 概括

從雜訊中提取的魯棒超前滯後訊號

  1. 將 VAR 擬合到等級,透過每對 BIC 選擇 pp,透過 dmaxd_{max} 進行增強,並僅對第一個 pp 滯後進行 Wald 測試。手動建立限制矩陣 - 庫的 test_causality 也限制了增廣滯後,這不是 Toda-Yamamoto。
  2. 在相同的對和滯後上運行差異回報測試作為基線,並報告分歧。這張表就是我們的發現;星號矩陣不是。
  3. 透過有效 N(而不是 Bonferroni)修正相關測試家族的矩陣,並報告有多少細胞存活。
  4. 捲起來。報告重要視窗的分數和交叉計數。無論匯總 p 值有多小,閃爍的顯著性都不是可交易的滯後。
  5. 在相信任何 lag-1 結果之前,放棄間隙而不是向前填充,並檢查場地之間的時鐘對齊情況。

這個過程的完美結果是負面的——樣本中顯著的 BTC 與 alt 關係,經受住修正,並且每隔幾百根柱仍然在兩個方向上穿過 0.05 線,這是關於可交易性的真實結果,值得作為一個結果發布。

## 參考

免責宣告:本文提供的資訊僅用於教育和參考目的,不構成財務、投資或交易建議。加密貨幣交易涉及重大損失風險。

Authors

Eugen Soloviov
Eugen Soloviov

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.

Newsletter

緊跟市場步伐

訂閱我們的時事通訊,獲取獨家 AI 交易見解、市場分析和平台更新。

我們尊重您的隱私。您可以隨時退訂。