転送エントロピー:暗号資産間の情報はどちらへ流れるのか?
このブログでは、暗号資産が一因子市場に近いことをすでに示してきた。ペア間のシグナル相関 によれば PC1(BTC 因子)が分散の 65% を占め、4 因子で 90% を説明する。つまり「分散された」10 ペアが、3〜4 個の独立したペアと同じ情報しか持たない。また依存構造が一定でないことも示した。DCC-GARCH は相関行列を固有のレジームを持つ時系列としてモデル化し、その Limitations 節では、言いにくいことをはっきり述べている——「相関は因果ではなく、方向でもない」。
この記事が扱うのは、その最後の一節にある空白だ。DCC は依存関係が いつ 強まるかを示すが、どちらへ 向いているかは示せない。転送エントロピーなら示せる。これはモデルに依存せず本質的に非対称な指標で、ある系列の過去が別の系列の未来予測に何ビット寄与するかを、対象系列自身の過去がすでに説明する分を超えて測る。ETH が AAVE の値付け変更に先立って一貫して情報を送るなら、相関行列では表せない非対称性を転送エントロピーが捉える。
以下では指標と推定量を説明する。ただし指標そのものより重要なのは、測定された情報フローネットワークがシグナルなのか飾りなのかを決める帰無校正と感度分析である。
測定されたネットワーク

状況:まだ実行していない。 下のパイプラインは実装済みだが、この記事では実データに対して実行していない。実行されるまでは、この記事は結果ではなく手法の説明である。このブログの基準——正直なネガティブ結果 と デフレート・シャープと多重検定 を参照——では、校正されていないネットワークは反証されるまでノイズである。
ここでは次の四つをこの順番で報告しなければならない。どれも文献から断定してはならない。
- 有効 TE 行列。 ユニバース、取引所、日付範囲、バーサイズ、順序付きペアごとのビット単位の有効 TE、ペアごとの p 値、有意性フィルターを通過した有向グラフ。これにより「BTC が主な発信源で DeFi トークンが受信先」といった手振りの説明を、出力強度・入力強度・ネットフローの表に置き換える。
- 有意性検定の偽陽性率。 シャッフル系列と、相互に独立な合成系列でパイプライン全体を実行して測定する。下の 帰無校正 を参照。
- 感度スイープ。 二つの自由なつまみ、
n_bins∈ {3, 5} とk∈ {1, 2, 3, 5} の全組み合わせを試す。リーダー/フォロワー順位がグリッドの一セルでしか成立しないなら、それが発見である。 - 時間的安定性。 測定した順位はサンプル外でも続くのか、それともウィンドウごとに入れ替わるのか。これに答えるまで、下流の応用を書く価値はない。
仕組み

三つの構成要素
シャノンエントロピーは確率変数 の不確実性を測る。
コイン投げは 1 ビット、公正なサイコロは ビット、決定論的な変数は 0 である。
条件付きエントロピーは を知った後に の不確実性がどれだけ残るかを測る。
が を決めるときは 0、独立なら に等しい。
相互情報量は両者が共有する情報である。
これは対称で、 である。その対称性こそ崩す必要があるものだ。
転送エントロピー
Schreiber(2000)が導入した転送エントロピーは、対象の過去を条件にすることで対称性を崩す。これは、対象 の過去がすでに説明する分を超えて、発信源 の過去が対象 の未来に関する不確実性をどれだけ減らすかを測る。
を長さ の履歴 、 を長さ の発信源履歴とする。
同値な条件付きエントロピーの差としては次のように書ける。
の過去が 自身の過去を超えて の予測に役立たなければ である。役立つなら、その大きさは流れる予測情報のビット数になる。
主な性質は次の通り。
- 非負: 。
- 非対称: 一般に 。これが要点である。
- ノンパラメトリック: モデルの仮定を置かず、線形・非線形の依存関係をともに扱う。
- 単位: ならビット、 ならナット。
ネット転送エントロピーは支配的な方向を示す。
正なら が へのネット発信源、負なら が先行することを意味する。
転送エントロピーとグレンジャー因果性

グレンジャー因果性(GC)は、 の過去が の線形自己回帰予測を改善するかを問う。これは 統計的アービトラージとペアトレーディング で扱った Engle-Granger の共和分検定ではない。同じ姓だが別の概念である。Engle-Granger は非定常な二系列の線形結合が定常かを問う一方、グレンジャー因果性は一方の系列が他方の予測を助けるかを問う。このブログの読者は混同しやすいので、明確にしておく価値がある。
ガウス過程における理論的同値性
Barnett、Barrett、Seth(2009)は、同時ガウス過程では、グレンジャー因果性と転送エントロピーが単調変換を除いて同値であることを証明した。
ここで はグレンジャー因果性統計量(対数尤度比)である。線形ガウスデータなら、どちらの手法からもまったく同じ因果構造を復元できる。したがって転送エントロピーは GC の競合というよりノンパラメトリックな一般化であり、GC の仮定が成り立つ場所では正確に GC に還元される。
両者が分岐するところ
| 性質 | グレンジャー因果性 | 転送エントロピー |
|---|---|---|
| モデル仮定 | 線形 VAR | なし(モデルフリー) |
| 非線形依存 | 取り逃す | 捉える |
| 分布仮定 | ガウス(F 検定用) | なし |
| 必要標本数 | 中程度 | 多い |
| 計算 | 高速(OLS) | 低速(密度推定) |
| 解釈 | 予測改善 | 情報転送(ビット) |
原理上、この差は暗号資産で重要だ。リターンはファットテールで、ボラティリティはクラスター化し、関係はレジーム依存であり、線形 VAR はそれらを平坦化してしまう。ただし実データで測定したリーダー順位を変えるほど差が大きいかは実証問題であり、この記事が仮定するのではなく答えるべき問いである。
Dimpfl and Peter(2013)は、特にストレス下で、転送エントロピーがグレンジャー因果性なら見逃す金融系列のフローを検出すると報告した。Keskin and Aste(2020)は暗号資産の非線形 TE からより豊かなネットワークを報告した。ここでの引用はこのデータセットの証拠ではなく、動機付けとしてである。
有効転送エントロピー:バイアス補正

ここは間違えやすい。生の TE 推定値は有限標本で 上方バイアス を持つ。独立な二系列を入力しても、経験的同時分布のサンプリングノイズだけで と推定される。バイアスは同時状態数とともに増え、その数は に対して指数的に増加する。
有効転送エントロピーはそのバイアスを差し引く。
ここでサロゲートは周辺分布を保ったまま の時間構造を壊す。何であり何でないかに注意したい。サロゲート平均は推定量自身のバイアスの推定値であり、それを差し引く。 信頼区間ではなく、有効 TE は「誤差棒付き TE」でもない。同じサロゲートアンサンブルが p 値の帰無分布にも使えるが、減算と検定は別の用途である。
サロゲートはブロックブートストラップで生成するため、ブロック内の の自己相関は残る。ブロック再サンプリングの仕組みと理由は バックテストのモンテカルロとブートストラップ で扱っている。
実装

データ:単一取引所における主要 USDT 無期限先物の固定ユニバースについて、明示した連続日付範囲の時間足対数リターン。 標準的な OHLCV 取得と対数リターンの構成は 統計的アービトラージとペアトレーディング で扱う定型処理であり、ここでは繰り返さない。
離散化——そしてリーケージへの警告
転送エントロピーには離散状態が必要だ。分位点ビニングが通常の選択だが、未来を漏らす場所にもなりやすい。
import numpy as np
import pandas as pd
def discretize_trailing(series, n_bins=3, warmup=500):
"""Discretize using bin edges estimated on a TRAILING window only.
Computing quantile edges over the full sample is whole-series
normalization leakage: every bar's label depends on the entire
future distribution. See the look-ahead bias taxonomy.
"""
x = np.asarray(series, dtype=float)
out = np.full(len(x), -1, dtype=int)
qs = np.linspace(0, 1, n_bins + 1)[1:-1]
for t in range(warmup, len(x)):
edges = np.quantile(x[:t], qs) # strictly past data
out[t] = np.digitize(x[t], edges)
return out
素朴な全標本版は、記述的な主張——「この期間はこの方向に情報が流れた」——には問題ないが、取引可能な主張には汚染される。この区別こそ 先読みバイアス分類 の主題である。全標本の境界を使うなら明記し、「シグナル」という語の前で止めること。
転送エントロピーをゼロから実装する
from collections import Counter
def transfer_entropy(source, target, k=1, l=1):
"""Transfer entropy T_{source -> target} in bits.
source, target : 1-D integer arrays of discrete states
k : history length for the target
l : history length for the source
"""
source = np.asarray(source)
target = np.asarray(target)
n = len(target)
max_lag = max(k, l)
y_future = target[max_lag:]
y_past = np.column_stack([target[max_lag - i - 1:n - i - 1] for i in range(k)])
x_past = np.column_stack([source[max_lag - i - 1:n - i - 1] for i in range(l)])
N = len(y_future)
yf = y_future.tolist()
yp = [tuple(row) for row in y_past]
xp = [tuple(row) for row in x_past]
c_yf_yp_xp = Counter(zip(yf, yp, xp))
c_yp_xp = Counter(zip(yp, xp))
c_yf_yp = Counter(zip(yf, yp))
c_yp = Counter(yp)
te = 0.0
for (yf_val, yp_val, xp_val), count in c_yf_yp_xp.items():
p_joint = count / N
p_yf_given_yp_xp = count / c_yp_xp[(yp_val, xp_val)]
p_yf_given_yp = c_yf_yp[(yf_val, yp_val)] / c_yp[yp_val]
if p_yf_given_yp > 0 and p_yf_given_yp_xp > 0:
te += p_joint * np.log2(p_yf_given_yp_xp / p_yf_given_yp)
return te
ブロックブートストラップ帰無による有効 TE
def effective_transfer_entropy(source, target, k=1, l=1,
n_shuffles=200, block_size=5, rng=None):
"""Effective TE plus a surrogate p-value.
Returns dict: te, ete, p_value, null_mean, null_std
"""
rng = rng or np.random.default_rng(0)
te_observed = transfer_entropy(source, target, k, l)
n = len(source)
n_blocks = int(np.ceil(n / block_size))
null_tes = np.empty(n_shuffles)
for b in range(n_shuffles):
starts = rng.integers(0, n, size=n_blocks)
shuffled = np.concatenate(
[np.take(source, range(s, s + block_size), mode='wrap')
for s in starts]
)[:n]
null_tes[b] = transfer_entropy(shuffled, target, k, l)
null_mean = null_tes.mean()
return {
'te': te_observed,
'ete': max(te_observed - null_mean, 0.0),
'p_value': (np.sum(null_tes >= te_observed) + 1) / (n_shuffles + 1),
'null_mean': null_mean,
'null_std': null_tes.std(),
}
ペア行列
def compute_te_matrix(disc_returns, k=1, n_shuffles=200):
cols = list(disc_returns.columns)
m = len(cols)
te_matrix = np.zeros((m, m))
pval_matrix = np.ones((m, m))
for i in range(m):
for j in range(m):
if i == j:
continue
r = effective_transfer_entropy(
disc_returns[cols[i]].values,
disc_returns[cols[j]].values,
k=k, n_shuffles=n_shuffles,
)
te_matrix[i, j] = r['ete']
pval_matrix[i, j] = r['p_value']
return (pd.DataFrame(te_matrix, index=cols, columns=cols),
pd.DataFrame(pval_matrix, index=cols, columns=cols))
高速な経路
pyinform は最適化済みの C 実装をラップしている。
from pyinform.transferentropy import transfer_entropy as te_pyinform
te_btc_to_eth = te_pyinform(btc_disc, eth_disc, k=2)
te_eth_to_btc = te_pyinform(eth_disc, btc_disc, k=2)
帰無校正

これは分析で最も価値が高く、最も省略される部分だ。測定したネットワークのエッジを信じる前に、離散化、有効 TE、サロゲート検定、有意性フィルターの全パイプラインを、真の答えがゼロだと分かっているデータで実行する。
- シャッフルした実リターン。 各系列の周辺分布を保ったまま、系列間の時間対応を壊す。
- 独立な合成系列。 構造上クロス依存のない、重い裾とボラティリティクラスターを持つ独立過程を 本シミュレートする。
そのうえで、検定が でフラグを立てる順序付きペアの割合を報告する。その割合が 0.05 付近でなければ検定は未校正で、実ネットワークのすべてのエッジが疑わしい。
多重検定がこれを増幅する。 8 資産なら順序付きペア検定は 個、20 資産なら 380 個になる。Bonferroni、Holm、Benjamini-Yekutieli FDR の補正は デフレート・シャープと多重検定 で詳しく導出し、素朴な検定の FDR 1.000 と BHY 0.007 の校正研究も示している。
しかし素の Bonferroni で止めてはいけない。これら 56 検定は 56 回の独立した探索ではないからだ。暗号資産同士は強く相関しており、このブログでは PC1 が分散の 65% を占めると測定した。これは同記事の Act 5 で文書化した 相関グリッドの失敗モードそのものだ。相関したグリッドの生セル数を試行数とみなすと過剰にデフレートし、本物のエッジを誤って棄却する。そこから得るべき成果物は一点ではなく有効試行数の 帯 である。ソフトな端には平均相関の一行式 、説得力のある中間には固有値推定量(参加比率、PCA-95%、Kaiser)がある。TE グリッドの有効 の帯を報告し、その全域で残るエッジが安定か確認する。
感度:二つの自由なつまみ

下の二つのつまみは通常、経験則で設定して見直されない。これをスイープし、各セルでのリーダー/フォロワー順位を報告する。
履歴長
は対象自身の過去をどれだけ条件付けるかを決める。小さすぎると対象の自己相関を発信源の寄与と誤認し、大きすぎると同時分布が疎になりすぎて推定できない。同時状態数は で、3 ビン、、 なら 状態、 なら数千観測に対して 状態になる。
慣例的な出発点は、時間足データなら 、日足なら で、必要なら同等の VAR ラグに対する AIC/BIC で照合する。これらは答えではなく、スイープするグリッドとして扱う。
離散化
- 3 ビン(下落/横ばい/上昇):頑健で少ないデータでも動き、方向構造だけを捉える。
- 5 ビン:規模も捉えるが、かなり多くのデータが必要。
- 分位点の境界:ほぼ均等な占有率で空ビンがない——ただし上のリーケージ警告に注意。
- 順序/記号エンコーディング:順列エントロピー型で、単調変換に頑健。
連続 カーネルベース TE は、帯域幅選択と大幅に重い計算を代償に離散化損失を完全に避ける。
スイープ
for n_bins in (3, 5):
for k in (1, 2, 3, 5):
disc = discretize_all(returns, n_bins=n_bins)
te_df, p_df = compute_te_matrix(disc, k=k)
rank = net_flow_ranking(te_df, p_df)
report(n_bins, k, rank)
問いは「順位は何か」ではなく「すべてのセルで順位は同じか」である。ある資産が 、 のときだけネット発信源なら、その不安定性 自体が 結果であり、そのように報告すべきだ。
交絡:条件付き転送エントロピー

と が潜在因子 によってともに動くなら、ペア TE は共通ドライバーの完全なアーティファクトであるフローを両者間に報告する。一因子市場ではこれは例外ではなく、デフォルトの想定だ。条件付き転送エントロピーは を条件にしてこれを除く。
SOL が AVAX に情報を送るという主張は、BTC を条件に再検証すべきである。フローが消えるなら、ペア結果は市場因子が仮装したものだった。
te_sol_avax_given_btc = te_pyinform(sol_disc, avax_disc, k=2,
condition=btc_disc)
条件付けは無料ではない。各条件変数が同時状態空間を 倍するため、同じ なら条件付き TE にはペア版より大幅に多くのデータが要る。
安定性と、これが取引可能かどうか

情報フローは静的ではない。この市場の他のものも静的ではない。それが HMM によるレジーム検出 の出発点であり、ここでの推定を一度だけフィットせずウィンドウ化すべき理由だ。ただしこの分析のローリング版は、新しい発見ではなく既知の結果を引き継ぐ。危機で暗号資産の依存が強まることは数値付きで公表済みだ。ペア間のシグナル相関 は横ばい市場の平均シグナル相関 0.15 からパニック時の 0.90 までを表にし、 は 4.2 から 1.1 へ崩れる。DCC-GARCH の Application 3 は平均ペア相関をリスクオフのレジームシグナルに変え、遅行分位点フラグと「これはアルファシグナルではなくリスクシグナル」という明示的な注意書きを備える。
TE の出力強度に対する Freeman 集中度は、異なる行列に対する異なるスカラーだが、動きは同じだ。 の依存対象を一つの数に潰して、それが上がるのを見る。したがって基準は「ドローダウン前に集中度が上がるか」ではなく、同じウィンドウ、同じドローダウンで、平均ペア相関をリスクオフシグナルとして上回るかを正面比較することだ。
def network_centralization(G):
"""Freeman centralization of out-strength. High = one dominant source."""
if G.number_of_nodes() < 2:
return 0.0
s = [sum(d['weight'] for _, _, d in G.out_edges(v, data=True)) for v in G.nodes()]
total = sum(s)
if total == 0:
return 0.0
n = len(s)
return sum(max(s) - x for x in s) / ((n - 1) * total)
下流の応用を書く価値が出る前に、二つの問いに答えなければならない。
- リーダー順位はサンプル外でも続くか? ウィンドウ でネットワークをフィットし、ウィンドウ で順位を確認する。ウィンドウ間の順位相関を報告する。毎週入れ替わる順位はノイズを表す。
- TE フィルターはリード・ラグ取引に何かを加えるか? 正しい実験は単一の制御比較である。統計的アービトラージとペアトレーディング と 距離アプローチ で扱った同じローリング z-score のエントリー/エグジット機構を、TE 有意性フィルターの有無だけ変えて二度実行し、手数料も含める。
この記事ではどちらも実行していない。 リード・ラグのバックテストも、情報モメンタム・ポートフォリオも、レジーム検出比較もない。仮想的な情報モメンタム枠の重み構成は 比較したポートフォリオ最適化アルゴリズム で扱う。ただしビット単位の生ネット強度に softmax をかけても尺度は恣意的で、意味を持たせるには正規化の議論が必要だ。未検証の戦略コードはここでは出さない。
コスト

TE はペアあたり だが、定数は同時状態数 とサロゲート数に左右される。 資産と 回のブートストラップなら、 回の TE 評価が必要で、50 資産・200 サロゲートなら 490,000 回になる。1 回のコストはハードウェア、pyinform のバージョン、 に完全に依存するため、引用値を信じず自分のマシンで測定すること。遅すぎる場合の手は三つある。
- 並列化する。 全ペアは独立している——
joblibまたはmultiprocessing。 - 事前選別する。 まず生 TE を計算し、閾値を超えるペアだけサロゲートを実行する。(ただし有意性検定が画面通過を条件にするため、考慮が必要。)
- ユニバースを縮小する。 先にクラスタリングし、クラスタ代表間で TE を計算する。
まとめ

転送エントロピーは、方向付き情報フローの原理にかなったモデルフリー指標で、このブログのツール群にある空白を埋める。DCC-GARCH が依存関係の強まる時期を示す一方、TE はその方向を示す。ガウス過程なら を介してグレンジャー因果性に正確に縮退し、競合ではなく一般化になっている。
これはまだ結果ではない。ここにあるパイプラインは実装済みで失敗モードも列挙した——サロゲートで補正する有限標本バイアス、先読みリーケージとなる全系列ビニング、素朴な多重検定補正を壊す 56 検定の相関グリッド、一因子市場の共通ドライバー交絡、そして答えを左右し得る自由パラメータ。これらはすべて、未校正 TE ネットワークを疑う理由になる。帰無校正、感度スイープ、サンプル外安定性チェックなしにネットワークを公開するのは、失敗モードを発見であるかのように公開することだ。
参考文献
- Schreiber, T. (2000). "情報転送の測定。" Physical Review Letters, 85(2), 461-464.
- Barnett, L., Barrett, A.B., Seth, A.K. (2009). "グレンジャー因果性と転送エントロピーはガウス変数に対して同値である。" Physical Review Letters, 103(23), 238701.
- Marschinski, R., Kantz, H. (2002). "金融時系列間の情報フローの分析。" European Physical Journal B, 30(2), 275-281.
- Dimpfl, T., Peter, F.J. (2013). "転送エントロピーを用いた金融市場間の情報フロー測定。" Studies in Nonlinear Dynamics & Econometrics, 17(1), 85-102.
- Keskin, Z., Aste, T. (2020). "非線形因果性検出の情報理論的指標:ソーシャルメディア感情と暗号資産価格への応用。" Royal Society Open Science, 7(9), 200863.
- Jang, S.M. et al. (2022). "転送エントロピーによる暗号資産間の情報フロー測定。" Physica A, 586, 126476.
- Nicola, G. et al. (2020). "混乱期における暗号資産の多変量転送エントロピーネットワーク分析。" Entropy, 22(7), 760.
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.