エピステミックとアレアトーリク:リターンモデルが「知らないこと」を測る
このブログのすべてのポジションサイジングルールは、不確実性を単一のスカラーに圧縮している。ケリ critionは分散で割る。適合予測は区間幅で割る。ボラティリティターゲティングはGARCH予測で割る。3つすべて正しいが、トレードで重要な区別を捨てている:「ノイズの多い市場」と「無知なモデル」の違いだ。
これは同じリスクではない。市場ノイズには価格がついている——それを負うことに対して補償されるからだ。モデルの無知には価格がついておらず、補償もされず、まさにエッジ推定が最も信頼できない状態にある。両者を同等にペナルティするサイジングルールは、利益を取り逃していることになる。
この投稿は、その分割を測定可能にすることについてだ。具体的には:
これをケリーの分母に全分散の代わりに入れる。記事の残りの部分は、2つのコンポーネント(MCドロップアウト、ディープアンサンブル)を推定する方法と、実際のデータではその分割がどのように見えるかについてだ。
論点:2つの不確実性には2つの対応が必要
| エピステミック | アレアトーリク | |
|---|---|---|
| ソース | 限られたデータ / モデル | データ固有のノイズ |
| 削減可能? | はい(より多くのデータが助けになる) | いいえ |
| トレードアクション | ポジションを縮小するか abstain | ストップを広げ、レバレッジを削減 |
| シグナル | 「このレジームは見たことがない」 | 「この市場は今ノイズが多い」 |
「トレードアクション」行の非対称性が議論の全体だ。高いアレアトーリク分散は既知の未知:それに合わせてサイジングし、ヘッジし、保有することでリスクプレミアムが支払われると期待できる。高いエピステミック分散は未知の未知:モデルは外挿しており、その平均推定は分散推定と同じほど疑わしく、独自のパラメータについて間違えることにプレミアムは付かない。
2つを混同するモデルは、見慣れないレジームで過度トレードする(エピステミック不確実性を無視)か、見慣れているがノイズの多いレジームでトレード不足になる(アレアトーリク不確実性を過度にペナルティする)かのどちらかだ。に適用される標準的なケリーは、どちらのコンポーネントが支配的かによって両方を行う。
分解
エピステミック不確実性は、モデルパラメータに関する不確実性から来る。単一の(最尤推定のように)ではなく、分布を維持し、積分する:
について積分することで生じる広がりがエピステミックだ。が成長して入力領域をカバーするにつれて縮小する。
アレアトーリク不確実性は、データ生成プロセスの条件付きノイズだ。ニューラルネットワークでは、入力依存の分散を放出する第2の出力ヘッドでモデル化される:
その異分散性ヘッドは、GARCHが古典的に推定するのと同じ対象を推定している——オーバーナイト時に高く、ピーク時間に低い状態依存の条件分散だ。暗号通貨でのその対象の実証値が必要な場合は、GARCH(1,1) for crypto volatilityが適切にカバーしており、なぜライブ条件付き予測(無条件標本分散ではない)がケリー分母に属するかも含んでいる。NNヘッドは、平均と共同でフィットされた同じ対象の別の推定器に過ぎない。
GARCHが与えられないのはもう一方の項だ。これがこの投稿の残りの部分の目的だ。
既に公開されているものとの位置づけ
以前の2つの投稿が隣接する領域をカバーしており、最初に読む価値がある。なぜならこの投稿は意図的にそれらを繰り返さないからだ:
- 予測に注意を払うポジションサイジングのための適合予測は、有限標本カバレッジ保証付きの区間を与え、分布仮定なし、幅の逆数サイジング、エッジ比率ノートレードフィルター付きだ。正しくサイジングされた区間だけが必要な場合、より強力なツールだ。
- Temporal Fusion Transformersは分位点を直接放出し、ピンボール損失分位点はサンプル外で自動的に校正されないと既に警告している。
トレードオフは明快だ。適合予測は保証を与えるが1つの数字——区間幅は分解不可能なので、なぜ広がったかを教えてくれない。ベイズ手法は分解を与えるが保証はない——MCドロップアウトの区間は近似事後分布と同じ程度にしか良い。この記事は分解を購入することについてだ。カバレッジのために、その上に適合予測を残しておくべきだろう。
方法1:変分推論(Backpropによるベイズ)

ベイズニューラルネットワークは、重みに事前分布を置き、事後分布を求める。正規化子にはすべての重み設定に関する積分が必要であり、これは数個以上のパラメータを持つものでは扱えない。
変分推論は、扱えない事後分布を扱いやすい族——典型的には因数分解されたガウス——で置き換え、最小化する:
これには未知の事後分布が含まれるため、代わりに証拠下界を最大化する:
第1項はをデータ説明に向かわせ、第2項は事前分布の近くに保つ。Bayes by Backprop(Blundell et al., 2015)は、再パラメータ化トリックでこれを微分可能にする:をサンプリングし、と設定する。
実際にはVIはパラメータ数を2倍にし、勾配分散を上げ(各順伝播は異なる重みを使用)、平均場仮定は重みの相関を無視するため、エピステミック不確実性を過小評価する傾向がある。既に訓練された決定論的モデルを持つトレードスタックでは、以下の2つの安価な方法の方が通常、より良いエントリーポイントだ。
方法2:MCドロップアウト

GalとGhahramani(2016)は、ドロップアウトで訓練され、テスト時にもドロップアウトが有効になった状態で評価されるネットワークが、深いガウス過程での近似変分推論手続きであることを示した。ドロップアウトは既にサブネットワークに関する分布を誘導しており、推論時もオンにして回の順伝播を実行すると、その暗黙的事後分布からサンプリングされる。
これはこのブログの他の場所にはない。ここで公開されているコードは、ドロップアウトを訓練時正則化としてしか使用していない(spread modeling、TFTでdropout=0.1–0.3)。推論時オンにするのは1行の変更だが、全く異なる意味を持つ。
予測統計量
回の確率的順伝播がを生成し、各パスの分散がある場合:
予測平均:
エピステミック(パス間の不一致):
アレアトーリク(予測ノイズの平均):
分解は全分散の法則そのもの:条件付き平均の分散プラス条件付き分散の平均。全予測分散はそれらの合計だ。
PyTorch実装
import torch
import torch.nn as nn
import numpy as np
class MCDropoutNet(nn.Module):
"""
不確実性推定のためのMCドロップアウト付きリターン予測ネットワーク。
予測平均と対数分散(アレアトーリク)の両方を出力する。
"""
def __init__(self, input_dim: int, hidden_dim: int = 128, dropout_p: float = 0.1):
super().__init__()
self.net = nn.Sequential(
nn.Linear(input_dim, hidden_dim),
nn.ReLU(),
nn.Dropout(p=dropout_p),
nn.Linear(hidden_dim, hidden_dim),
nn.ReLU(),
nn.Dropout(p=dropout_p),
)
self.head_mu = nn.Linear(hidden_dim, 1) # 予測リターン
self.head_logvar = nn.Linear(hidden_dim, 1) # log(アレアトーリク分散)
def forward(self, x: torch.Tensor):
h = self.net(x)
return self.head_mu(h), self.head_logvar(h)
def heteroscedastic_loss(mu, log_var, target):
"""学習された入力依存分散を持つガウスの負の対数尤度。"""
precision = torch.exp(-log_var)
return torch.mean(0.5 * precision * (target - mu) ** 2 + 0.5 * log_var)
@torch.no_grad()
def mc_predict(model: MCDropoutNet, x: torch.Tensor, n_samples: int = 100):
"""
MCドロップアウト推論:ドロップアウトをONにしてT回の順伝播を収集し、
予測分散をエピステミックとアレアトーリクに分解する。
"""
model.train() # NOT eval() -- これがドロップアウトを有効に保つ鍵
mus, log_vars = [], []
for _ in range(n_samples):
mu, log_var = model(x)
mus.append(mu)
log_vars.append(log_var)
mus = torch.stack(mus) # (T, batch, 1)
log_vars = torch.stack(log_vars) # (T, batch, 1)
pred_mean = mus.mean(dim=0)
epistemic_var = mus.var(dim=0) # パス間分散
aleatoric_var = log_vars.exp().mean(dim=0) # パス間期待値
return {
"mean": pred_mean.squeeze(-1),
"epistemic_std": epistemic_var.sqrt().squeeze(-1),
"aleatoric_std": aleatoric_var.sqrt().squeeze(-1),
"total_std": (epistemic_var + aleatoric_var).sqrt().squeeze(-1),
}
訓練は異分散性損失を使用し、これが分散ヘッドに意味を持たせる。自己調整構造に注意:0.5 * precision * (target - mu)**2項は小さな分散を求め、0.5 * log_var項はそれを罰し、バランスポイントは条件ノイズレベルだ。
model = MCDropoutNet(input_dim=50, hidden_dim=128, dropout_p=0.1)
optimizer = torch.optim.AdamW(model.parameters(), lr=1e-3, weight_decay=1e-4)
for epoch in range(200):
model.train()
for x_batch, y_batch in train_loader:
mu, log_var = model(x_batch)
loss = heteroscedastic_loss(mu, log_var, y_batch)
optimizer.zero_grad()
loss.backward()
optimizer.step()
この方法を黙って殺すgotcha:mc_predict内でmodel.eval()を呼ぶこと。ドロップアウトを無効にし、すべてのパスが同じ値を返し、epistemic_varは正確にゼロに崩壊し、サイジングルールは暗黙にアレアトーリク分散のみのプレインケリーに戻る。エラーなしで失敗する。推論パスでepistemic_var > 0をassertせよ。
順伝播回数の選択
- :安定した平均のための合理的下限
- :平均と分散のための実用的デフォルト
- :テイル分位点が必要でない限り diminishing returns
方法3:ディープアンサンブル

Lakshminarayanan et al.(2017)は、異なるランダム初期化から個の独立ネットワークを訓練し集約する。形式的にはベイズではないが、ディープアンサンブルは一貫して不確実性校正ベンチマークでより原理的な手法を破る。
メンバー間の不一致がエピステミック推定だ。アンサンブルはこのブログの他の場所では集約デバイスとして登場する——異常検出、HMMレジーム検出、適合予測のEnbPIブロックブートストラップ——しかしメンバー間広がりによる不確実性推定器としては登場しない。これがここでの用途だ。
アンサンブル実装
多様性は独立訓練から来る。個のオブジェクトを構築からではない。未訓練または同一訓練メンバーのアンサンブルは、ノイズまたはゼロエピステミック分散を返す:
class DeepEnsemble:
def __init__(self, input_dim: int, n_models: int = 5, hidden_dim: int = 128):
self.models = []
for seed in range(n_models):
torch.manual_seed(seed) # メンバーごとに異なるinit
self.models.append(
MCDropoutNet(input_dim, hidden_dim, dropout_p=0.0)
)
def fit(self, train_loader, epochs: int = 200, lr: float = 1e-3):
"""各メンバーは独立して訓練される。ここに多様性が生まれる——
異なるinit、異なるシャッフル順序。これをスキップすると
epistemic_var == 0(同一メンバー)または純粋なノイズ(未訓練)になる。"""
for seed, model in enumerate(self.models):
torch.manual_seed(1000 + seed) # 異なるシャッフル/ドロップアウトストリーム
opt = torch.optim.AdamW(model.parameters(), lr=lr, weight_decay=1e-4)
model.train()
for _ in range(epochs):
for x_batch, y_batch in train_loader:
mu, log_var = model(x_batch)
loss = heteroscedastic_loss(mu, log_var, y_batch)
opt.zero_grad()
loss.backward()
opt.step()
return self
@torch.no_grad()
def predict(self, x: torch.Tensor):
mus, variances = [], []
for model in self.models:
model.eval() # ここでは正しい:ドロップアウトサンプリングなし
mu, log_var = model(x)
mus.append(mu.squeeze(-1))
variances.append(log_var.exp().squeeze(-1))
all_mus = torch.stack(mus)
all_vars = torch.stack(variances)
epistemic_var = all_mus.var(dim=0) # メンバー間広がり
aleatoric_var = all_vars.mean(dim=0)
return {
"mean": all_mus.mean(dim=0),
"epistemic_std": epistemic_var.sqrt(),
"aleatoric_std": aleatoric_var.sqrt(),
"total_std": (epistemic_var + aleatoric_var).sqrt(),
}
model.eval()はDeepEnsemble.predictでは正しく、mc_predictでは間違っていることに注意。確率性ソースは異なる:アンサンブルは独立訓練から、MCドロップアウトはライブドロップアウトマスクから得る。
トレードオフ:MCドロップアウト vs ディープアンサンブル
| MCドロップアウト | ディープアンサンブル | |
|---|---|---|
| 訓練コスト | 1x(単一モデル) | x(モデル) |
| 推論コスト | 順伝播 | 順伝播 |
| メモリ | 1xパラメータ | xパラメータ |
| 不確実性品質 | エピステミックを過小評価傾向 | 全体的により良く校正 |
| 実装容易性 | 自明(フラグ反転) | 自明(モデルを訓練) |
| 並列性 | 順次パス(同一モデル) | 完全並列 |
実用的ハイブリッド:小さなアンサンブル()を訓練し、各メンバーもMCドロップアウトを使用し、モデル間不一致とモデル内確率性の両方を捕捉する。
利点:非対称サイジング

これが実際の貢献だ。ガウスケリーは。導出、成長放物線、ドローダウン確率テーブル、フルケリーではなく分数ケリーを実行する4つの理由はすべて戦略のためのケリー基準にあり、ここでは繰り返さない。四分の一ケリー分数でのを所与とする。
変更点は分母だ。全予測分散の代わりに:
の論拠:アレアトーリク分散は市場のノイズであり、価格がついており、それを負うことが戦略が収入を得る方法だ。エピステミック分散はあなたの無知——プレミアムはつかず、さらに悪いことに、あなたの推定が間違っていることと相関している。が大きいとき、ケリーの分子は分母と同時に信頼できないので、サイジングエラーが複合する。市場ノイズに対して超線形的にペナルティを課すことが、その直接的な表現だ。
def uncertainty_adjusted_position_size(
pred_mean: float,
epistemic_std: float,
aleatoric_std: float,
max_position: float = 1.0,
lam: float = 2.0, # エピステミックペナルティ;検証でチューン
max_epi_ratio: float = 0.5, # このepi/alea比率以上でabstain
base_kelly_fraction: float = 0.25,
) -> float:
"""エピステミック分散がアレアトーリクより厳しくペナルティされるケリーサイジング。"""
effective_var = aleatoric_std ** 2 + lam * epistemic_std ** 2
if effective_var < 1e-10:
return 0.0
position = (pred_mean / effective_var) * base_kelly_fraction
epi_ratio = epistemic_std / (aleatoric_std + 1e-8)
if epi_ratio > max_epi_ratio:
position *= max(0.0, 1.0 - epi_ratio)
return float(np.clip(position, -max_position, max_position))
ゲートには注意が必要。信頼性閾値以下でポジションをゼロにすることはここでは新しいではない——適合予測記事は、min_edge閾値を持つ一般ノートレードフィルターをとして指定・コード化しており、閾値の選び方とゼロまたぎ区間の幾何学的読み方を含んでいる。その機械については適合予測を参照すること。新しいのは分母:でのゲートは、モデルが市場よりも自分のパラメータについて混乱しているときに具体的に発火する——全不確実性ゲートでは検出できない状態だ。なぜなら、穏やかだが見慣れないレジームは低い全分散を持つことができ、ひどいエピステミック比率を持つことがあるからだ。
校正:これは任せる
不確実性推定は校正されていて初めて有用だ:名目95%区間は真を約95%含むべきだ。ここで独自のガウス分位点信頼性チェックを展開しないこと——太いテイルリターン残差でのパラメトリック区間は、適合予測が存在することを回避する失敗モードそのものであり、背後にある有限サンプル保証付きでターゲット対実証カバレッジを報告する稼働evaluate()を出荷する。TFT投稿も分位点ヘッドについて同じ点を主張している。
事後再スケーリング(検証セットにフィットした)は安価な修正であり、Adaptive Conformal Inferenceの弱いいとこだ。ACIはオンラインミスカバレッジレベルを長期カバレッジ境界で維持し、静的再スケールではない。ACIはより強力な選択肢;線形再スケールを好む唯一の理由は、ACIの単一幅がそうではないエピステミック/アレアトーリク比率を保つことだ。
公開前に計測が必要なもの
上記の方法は確立されている。分割がトレードで何かを買うという主張はそうではなく、このブログは議論のみでサイジングルールを公開しない。バー:
1. データセットとターゲット。 銘柄、バーサイズ、明示的日付範囲、特徴セット、予測ターゲットを名指す。
2. 分割そのもの。 全予測分散の何割がエピステミック対アレアトーリクか、そしてその比率が名指しいくつかの穏やかなウィンドウと名指しいくつかのボラタイルなウィンドウの間でどのように動くか。これが金銭的なチャートであり、まだ存在しない。反証に値する仮説:比率は実現ボラティリティの前にスパイクする。なぜなら、見慣れないさが乱れに先立つからだ。
3. 適合予測とのカバレッジ。 同じデータの公開された記事からのsplit-conformal区間と比較した、MCドロップアウト区間のサンプル外カバレッジの計測。そのヘッドツーヘッドはそれ自体新しい結果であり、2つの投稿間の自然な架け橋だ。
4. は何かを買うか? 検証でエピステミックペナルティをスイープし、ベースラインに対するPnLと最大ドローダウンを報告する。何も買わないならそう言うこと——The Honest Negativeはその結果のテンプレートであり、公開可能な結果だ。
5. 推論コスト。 ターゲットハードウェアで各で計測。
ここでの評価はすべてwalk-forward optimization規律下で実行される——はハイパーパラメータであり、全標本でチューンされたは結果ではない。
本番への実用的なヒント
1. 事前分布をウォームアップする。 変分推論では、ランダムではなく事前訓練された決定論的ネットワークから変分平均を初期化する。通常、収束時間が半減する。
2. 分散崩壊を監視する。 学習された分散はほぼゼロに drift し、BNNを暗黙に決定論的ネットワークに戻すことがある。訓練中に平均を監視し;必要ならKLアニーリングを追加する。
3. 固定検証セットではなくローリングベースで再校正する。 市場は非定常であり、一度フィットした校正は劣化する。walk-forward規律下でローリングウィンドウで再訓練するか、ACIにモデルの陳腐化をオンラインで吸収させるか——適合予測投稿は再訓練頻度トレードオフを直接カバーしている。
4. アンサンブル多様性が重要。 異なるシード、異なるシャッフル、オプションでメンバーごとに異なるハイパーパラメータ。初期化多様性がアンサンブル品質の主要なドライバであり、上記のfit()ループがオプションではない理由だ。
5. 分解を記録する。 全体だけでなく両方のコンポーネントを実現結果と共に保存する。これがなければ、レビューで唯一重要な問題に答えられない:サイザーがエクスポージャーを削減したとき、それは市場がノイズが多かったからか、モデルが迷子になったからか——そしてそれは正しかったか?
6. 不確実性を特徴として。 ローリングエピステミック統計はそれ自体、ドローダウンを予測可能かもしれない。もっともで、未計測、別の投稿に値する。
制限と正直な免責
- 近似事後分布はまだ近似だ。 MCドロップアウトとVIは真の事後分布の限られたビューを与える。ないよりは良いが真実ではなく、どちらにもカバレッジ保証は付かない。
- 校正は必要な時にこそ劣化する。 真に新しいレジームではモデルはまだmis-calibratedかもしれない——決定論的なものよりも* less * mis-calibratedな傾向があるだけだ。分布外入力からの不確実性推定はそれ自体が分布外出力だ。
- アレアトーリク分散はエピステミックシグナルを吸収できる。 異分散性ヘッドが十分柔軟なら、モデル不確実性をデータノイズとして説明することを学び、をゼロに向かわせ、分解全体を暗黙に破る。これがこの投稿で最も重要な失敗モードであり、自分を告発しない。レジーム間で比率を監視すること;動かない比率は壊れた分解であり、安定した市場ではない。
- は自由パラメータ。 チューン可能なノブをサイジングルールに導入することは、オーバーフィットサイジングルールが構築される方法だ。walk-forward正当化が必要か、1に固定される必要がある。
結論
適合予測は既にこのブログにカバレッジ保証付き区間幅を与え、ケリーは既にサイジングルールを与えている。どちらも与えないのは、なぜ区間が広いかという答えだ。予測分散をエピステミックとアレアトーリクに分割することでそれに答え、答えは合計がそうであるように行動可能だ:市場ノイズは補償されるリスク、モデルの無知はそうではなく、サイジング分母はそう言うべきだ。
MCドロップアウトは分割をほぼ無料にする——1行(推論時のmodel.train())がどのドロップアウトネットワークも近似ベイズにする。ディープアンサンブルはxのコストでより良く校正する。両方が同じ非対称分母に供給する。
が実際に支払うかどうかは、このドラフトがまだ答えていない実証的問いだ。上記に挙げられた計測がそれを公開する価格だ。
参考文献:
- Blundell, C., Cornebise, J., Kavukcuoglu, K., & Wierstra, D. (2015). Weight Uncertainty in Neural Networks. ICML.
- Gal, Y. & Ghahramani, Z. (2016). Dropout as a Bayesian Approximation: Representing Model Uncertainty in Deep Learning. ICML.
- Lakshminarayanan, B., Pritzel, A., & Blundell, C. (2017). Simple and Scalable Predictive Uncertainty Estimation using Deep Ensembles. NeurIPS.
- Kendall, A. & Gal, Y. (2017). What Uncertainties Do We Need in Bayesian Deep Learning for Computer Vision? NeurIPS.
- Gibbs, I. & Candes, E. (2021). Adaptive Conformal Inference Under Distribution Shift. NeurIPS.
- Kelly, J. L. (1956). A New Interpretation of Information Rate. Bell System Technical Journal.
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.