← 記事一覧に戻る
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 テストで要求されますが、水準関係も破棄されます。また、2 つのコインが共積分されている場合、差分 VAR の指定が間違っており、テストは、質問したものとはわずかに異なる質問に答えます。

Toda と山本 (1995) は解決策を提供しています。余分な遅れのあるレベルで VAR を当てはめ、元のレベルのみをテストし、単位根や共積分に関係なく有効な χ2\chi^2 を取得します。これは計量経済学ではよく知られていますが、仮想通貨のリードラグにはほとんど適用されていません。

したがって、この記事では 1 つのことを行います。同じペアで、同じウィンドウで両方のテストを実行し、それらが一致しないかどうかを報告します。 次に、正直なフォローアップを適用します。つまり、結果の行列に対する相関ファミリーの複数テストの補正とローリング p 値を適用して、「有意な」ラグが取引できるほど安定しているか、それともしきい値を超えてちらつくだけであるかを確認します。

以下の理論は、比較を読みやすくするために必要なだけです。このブログではすでに単位根、共積分、データの読み込み、サイジング、コストについて取り上げています。これらはセクションではなくリンクです。

グレンジャーの因果関係が実際に主張していること

市場イベントにおける方向性リードラグ経路

グレンジャーの因果関係は予測の優先順位であり、メカニズムではありません: XX 過去の XX が過去の YY ですでに説明されている以上に YY の予測誤差分散が減少する場合、グレンジャーは YY を引き起こします。

XX σ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}) の場合、グレンジャーによって YY が発生します

共通の隠れた要因によって駆動される 2 つのシリーズは、それらの間に直接のつながりがなくても、グレンジャーの因果関係を示す可能性があります。暗号通貨では、その警告は学術的ではありません — BTC は、アルトコイン複合体 全体にわたる単一の支配的な要因であるため、ほぼすべてのアルト間の「因果関係」は、同じ BTC ショックに対する異なる応答速度の候補アーティファクトです。

VAR フレームワーク

テストはベクトル自己回帰内に存在します。 pp ラグのある 2 つの変数の場合:

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 が正しいデフォルトです。これはより倹約的な基準であり、流動的な暗号通貨ペアのリードラグはメモリ不足の現象です。 以下のすべての結果は、ユニバース全体で 1 つのラグを修正するのではなく、ペアごとに BIC で選択された pp を報告します。これは、固定されたラグがラグ選択の選択を重要性の主張に静かに変換するためです。

差分テストが間違ったデフォルトである理由

差異により、進みと遅れの関係が分断される可能性があります

暗号価格シリーズは I(1) です。通常の修正 (対数リターンの取得) では、共積分レベルを犠牲にして定常性を獲得します。ペアが長期均衡を共有する場合、差分 VAR は誤って指定されます。この文の背後にあるユニットルートと共積分機構 (ADF、モンテカルロ臨界値を備えた Engle-Granger、VAR システム上の Johansen) はすでに 統計的裁定取引とペア取引;ここでそれを想定してください。重要なのは、通常の救済策(違いを出してからテストする)は、結果を伴うモデル化された決定であり、戸田・山本はそれを回避する方法だということだけだ。

戸田・山本手順

p+dmaxp + d_{max} ラグで VAR を当てはめます。ここで、pp は最適なラグ次数、dmaxd_{max} は系列の最大積分次数です。その後、最初の pp ラグについてのみ制限をテストします。追加の dmaxd_{max} ラグは非定常性を吸収します。最初の pp 係数の Wald 統計量は、系列が I(0)、I(1)、または共積分であるかどうかに関係なく、標準の χ2(p)\chi^2(p) に従います。

  1. dmaxd_{max} を決定します。各シリーズの ADF および KPSS。仮想通貨の価格はほぼ常に dmax=1d_{max} = 1 です。
  2. pp を選択 — レベルに VAR を適合させ、BIC によって選択します。
  3. 拡張 VAR(p+dmaxp + d_{max}) を差分なしでレベルで推定します。
  4. 最初の pp の遅れのみを Wald テストします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 は、制限に dmaxd_{max} ラグを含む拡張 VAR(p+1p+1) 上で、近似モデル内の原因変数の「すべて」のラグをテストします。これはまさに戸田・山本が「やってはいけない」と言っていることです。修正は、完全な係数共分散に対する明示的な 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,
    }

間違いやすい 2 つの詳細は、間違えるとテストが無効になります。まず、インデックス演算は、statsmodels が params を平坦化する方法と一致する必要があります。p 値を信頼する前に、近似モデルで beta[target_idx * n_per_eq + 1]res.params.iloc[1, target_idx] と等しいことを確認します。 2 番目に、pinv ではなく np.linalg.solve を使用します。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 で、リターンについての差分テストを実行し、レベルについて戸田-山本について差分テストを実行し、2 つが一致しない箇所を表にします。不一致は興味深いセルです。差異に関しては重要だがレベルに関しては重要ではないペアは、共積分関係を区別するアーティファクトの候補です。逆は、レベルの関係がリターン テストでは確認できない情報を伝達していることを示唆しています。

因果関係行列での複数の比較

大規模な因果関係行列のフィルタリング

これが危険になるのは、完全な n×nn \times n マトリックスです。 20 のアセット、10 ラグのスイープは 3,800 の仮説テストに相当し、ボンフェローニはこれに相関するファミリーの誤った補正です。テストはデータを共有し、BTC 係数を共有し、独立とは程遠いため、ボンフェローニは同時に全体として保守的すぎるため、どのセルが生き残るかについて誤解を招きます。 収縮したシャープの記事**] の **Effective-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 補正しきい値を超えて生き残るセルの数です。

生き残ったマトリックスをセルごとではなく構造的に読み取ります。1 つの資産が他の多くの資産を引き起こしている行は、情報階層を確認します。何も原因で発生しない列は、発見ではなく、特異なトークン固有のダイナミクスを示唆しています。

正直なテスト: 回転安定性

ローリングウィンドウによる安定した信号

単一のサンプル内 p 値は、取引ではほとんど価値がありません。関連する問題は、重要性が「持続する」かどうかです。暗号通貨における資産間関係はレジームに依存します — 相関構造は冷静とパニックの間で大きく異なります、そしてレジーム自体は推定可能です (HMM レジーム検出)] — したがって、1 つのウィンドウで推定されたリードラグは、そのウィンドウに関するステートメントとなります。

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

このシリーズから 2 つのことを報告します。0.05 未満のウィンドウの割合と、しきい値を横切る数です。たとえプールされた p 値が同じであっても、3 つの交差を持つウィンドウの 80% で有意な関係は、40 の交差を持つウィンドウの 55% で有意な関係とは異なるオブジェクトです。 2 つ目はトレード可能ではありません。数百バーごとに存在が反転するシグナルではポジションをサイズ設定することはできません。また、再推定ラグにより​​、常に前のレジームでトレードしていることが保証されます。

Granger に固有のデータ トラップ

不規則な仮想通貨ティックは因果関係のシグナルを混乱させる

一般的な暗号データ​​の衛生管理については、他の場所で説明されています。バックテストとライブパリティのギャップとローソク足の欠落、先読みバイアス分類法、およびタイムフレーム全体で先読みがないことの証明](/en/blog/post/proving-no-lookahead-multi-timeframe)]のタイムスタンプ規律。ただし、1 つの障害モードはグレンジャー固有のものであり、次のような深刻なものがあります。

フォワードフィルにより結果が製造されます。 フォワードフィルされたローソク足は前の終値を繰り返し、純粋な自己相関を系列に注入します。XX と機械的に位置合わせされた YY のラグ 1 自己相関は、F 検定では 1 ラグ因果関係と区別できません。同じことが会場全体にも当てはまります。分足バー上の 2 つの取引間の 1 秒のクロック オフセットは、足が着地する足の境界のどちら側にシフトするため、ラグ 1 の重要性を完全に生み出したり破壊したりする可能性があります。これらのいずれかを実行する前に、ギャップが埋められるのではなく削除されること、および両方のシリーズが同じクロックからスタンプされていることを確認してください。

文献で報告されているリードラグの調査結果

リードラグ研究の証拠群

これらは引用であり、この記事からの測定値ではありません。彼らは公開された記録が主張していることを言うためにここにいるので、上記の比較には同意するか同意しないことがあります。

  • BTC からアルトコインへ。 アジア太平洋金融市場 の 2026 年の研究 (Springer]) では、ビットコインからアルトコインへの高頻度の価格伝達が報告されており、小型株のコインでは反応が大幅に遅れ、反応の遅さに伴う流動性の低下が見られます。この一連の研究から一般的に引用されるラグの大きさ(BTC から ETH までは約 1 ~ 3 分、中型株と小型株では長くなる、時価総額が低下するにつれてますます一方向的になる)は、引用された調査結果であり、ここで再導出されたものではありません。それらが依存する時価総額階層は、マルチシンボル検証] で使用されるのと同じはしごです。
  • CEX が DEX をリード。 暗号通貨の微細構造に関する研究 (MDPI]) は、情報フローが CEX から DEX に流れており、重大な逆因果関係はなく、集中型の場が価格発見を支配していると報告しています。これは、ミリ秒未満のマッチング エンジンとブロックタイム決済との一致と一致しています。
  • 独立したコインとしての ETH。 VAR-SVAR の研究 (MDPI)] では、特に DeFi および NFT 主導の段階で、イーサリアムがソースとして機能し、ビットコインがスピルオーバー受信者として機能する体制が見つかりました。

相互作用について簡単に説明

同じコインと 2 つの会場のラグは現実的な設定ですが、その経済学 - 手数料のしきい値、レイテンシーのはしご、そもそもラグが存在する理由 - は、統計的裁定取引とペアの取引 キムチ プレミアム ] ですでに解決されています。グレンジャー氏が付け加えているのは、安定性に関する質問だけだ。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

すでにここで解決されているため、この記事の一部ではない 3 つの事項は次のとおりです。

制限事項

因果不確実性の境界

グレンジャーの因果関係は因果関係ではありません。 交絡要因 (わずかなタイムスタンプのずれで両足を動かすマクロ イベント)、共通の要因 (2 つの代替は両方とも異なる速度で BTC を追跡)、省略された変数 (システム内に ETH を使用せずに BTC から DOGE までのテスト) はすべて、直接的な情報フローがなくても重要な統計を生成します。この記事のように二変量テストに制限すると、変数省略の問題は改善されるどころか悪化します。

線形性 このテストでは、条件付き平均の線形予測構造のみが参照されます。暗号通貨にはボラティリティ クラスタリング、レバレッジ効果、レジーム スイッチがあります。2 番目の瞬間のストーリーについては、GARCH ボラティリティ予測 および DCC-GARCH 動的相関] を参照してください。知っておく価値のある非線形代替案: Diks-Panchenko (2006) カーネル テスト、情報理論のアナログとしての伝達エントロピー、および完全な同時分布にわたるコピュラ グレンジャー因果関係。

構造の破壊。 1 つのウィンドウで推定される関係は、そのウィンドウのレジームに依存します。上記のローリング テストは最小限の診断であり、修正ではなく診断です。

## まとめ

ノイズから抽出された堅牢なリードラグ信号

  1. レベルに VAR を当てはめ、ペアごとの BIC によって pp を選択し、dmaxd_{max} によって増加し、最初の pp ラグのみを Wald テストします。制限行列を手動で構築します。ライブラリの test_causality は拡張ラグも制限しますが、これは戸田山本ではありません。
  2. 同じペアとラグのベースラインとして差分リターン テストを実行し、不一致を報告します。その表が調査結果です。アスタリスクの行列はそうではありません。
  3. ボンフェローニではなく実効 N を介して相関テストファミリーの行列を修正し、生き残った細胞の数を報告します。
  4. 転がします。重要なウィンドウの割合と交差数を報告します。プールされた p 値がどれほど小さい場合でも、ちらつきの重要性は取引可能なラグではありません。
  5. ラグ 1 の結果を信じる前に、前方埋めの代わりにギャップを削除し、会場全体で時計の調整をチェックします。

この手順の完全に良好な結果は否定的です。サンプル内で有意であり、修正後も生き残り、依然として数百バーごとに両方向で 0.05 ラインを超える BTC と Alt の関係は、取引可能性に関する実際の結果であり、1 つとして公開する価値があります。

参考文献

blog.disclaimer

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取引の洞察、市場分析、プラットフォームの更新情報を受け取りましょう。

プライバシーを尊重します。いつでも配信停止可能です。