オプション価格評価のための物理法則情報ニューラルネットワーク
デリバティブに PINN を適用する際に面白いのは、ブラック・ショールズではない。ブラック・ショールズには閉形式解があり、それを再現するネットワークは健全性チェックであって成果ではない。面白いのは、閉形式解が存在せず、有限差分法では行き詰まる問題のすべてだ。つまり、混合偏導関数 を含むヘストンの二因子 PDE、アメリカン・オプションの自由境界問題、そして積分項によって領域内の各点が他のすべての点と結び付くマートンの偏積分微分方程式である。
この記事では、それぞれをどのように損失関数へ組み込むかを扱う。具体的には、ブラック・ショールズ PINN を学習可能にする対数価格残差、混合偏導関数を autograd から追加コストなく得る三入力のヘストン・ネットワーク、早期行使をペナルティまたは二つのネットワークで扱う方法、そしてジャンプ積分を PDE 残差に組み込むガウス・エルミート求積である。
これはベンチマークではない。以下で結果に見える数値はすべて目標値か引用値のどちらかであり、その旨を明記している。測定作業の範囲は最後に示す。
PINN は Raissi et al. (2019) によって導入された。その仕組みは、このブログの ナビエ・ストークス問題 ですでに説明している。そこでは同じ autograd 残差の手法で流体方程式の特異点を探す。PDE が損失項になり、自動微分がネットワーク入力に対する厳密な導関数を与え、グリッドは一切構築しない。ここで変わるのは、損失に入る PDE だけだ。
物理制約としてのブラック・ショールズ PDE

ブラック・ショールズ PDE、その満期ペイオフ 、そしてその背後にある無裁定の議論は ブラック・ショールズ公式 で扱っている。この節ではそれらを前提に、ネットワークを実際に学習できる形へ直行する。
対数価格変換
を直接扱うのは問題がある。領域は で、PDE の係数も変数依存だからだ。標準的な変換 により、定数係数の形になる。
これは 上の移流・拡散・反応方程式である。変数係数 と が消えることはネットワークにとって重要だ。 に比例して大きくなる残差は領域の遠端に支配され、最適化器はそこに計算資源を使ってしまう。
ブラック・ショールズの PINN 損失
ネットワークを とする。内部から 個のコロケーション点 、境界から 個、満期時刻から 個をサンプリングする。
すべての偏導関数は torch.autograd.grad と create_graph=True を使って計算するため、逆伝播時にも導関数の計算を通じて勾配が流れる。この一つのフラグが実装上の核心である。
PyTorch による実装

以下のパラメータは教科書的なものではなく、暗号資産寄りに設定している。株式デスクで想定される 、 の代わりに、、(およそ 30 日満期の BTC オプション)とした。短い満期と高いボラティリティは、ペイオフの折れ曲がりが最も鋭く PINN の学習が最も難しい領域である——それが狙いだ。
import torch
import torch.nn as nn
import numpy as np
r = 0.05 # risk-free rate
sigma = 0.7 # volatility
K = 1.0 # strike (moneyness-normalized)
T = 0.08 # ~30 days
x_min, x_max = -1.0, 1.0 # log-price domain (S/K in [0.37, 2.72])
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
class BSPINN(nn.Module):
"""Physics-Informed Neural Network for Black-Scholes PDE."""
def __init__(self, hidden_dim=128, num_layers=4):
super().__init__()
layers = [nn.Linear(2, hidden_dim), nn.Tanh()]
for _ in range(num_layers - 1):
layers += [nn.Linear(hidden_dim, hidden_dim), nn.Tanh()]
layers.append(nn.Linear(hidden_dim, 1))
self.net = nn.Sequential(*layers)
def forward(self, x, t):
inputs = torch.cat([x, t], dim=1)
return self.net(inputs)
def compute_pde_residual(model, x, t):
"""Compute Black-Scholes PDE residual using autodiff."""
x.requires_grad_(True)
t.requires_grad_(True)
u = model(x, t)
grads = torch.autograd.grad(u, [x, t], grad_outputs=torch.ones_like(u),
create_graph=True)
u_x, u_t = grads[0], grads[1]
u_xx = torch.autograd.grad(u_x, x, grad_outputs=torch.ones_like(u_x),
create_graph=True)[0]
residual = u_t + 0.5 * sigma**2 * u_xx + (r - 0.5 * sigma**2) * u_x - r * u
return residual
def terminal_condition(x):
"""European call payoff: max(S - K, 0) = max(exp(x) - K, 0)."""
return torch.relu(torch.exp(x) - K)
def train_pinn(epochs=10000, lr=1e-3, n_interior=5000, n_boundary=500, n_terminal=1000):
model = BSPINN().to(device)
optimizer = torch.optim.Adam(model.parameters(), lr=lr)
scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=epochs)
for epoch in range(epochs):
optimizer.zero_grad()
x_int = (torch.rand(n_interior, 1, device=device)
* (x_max - x_min) + x_min)
t_int = torch.rand(n_interior, 1, device=device) * T
residual = compute_pde_residual(model, x_int, t_int)
loss_pde = (residual ** 2).mean()
x_tc = (torch.rand(n_terminal, 1, device=device)
* (x_max - x_min) + x_min)
t_tc = torch.ones(n_terminal, 1, device=device) * T
u_tc = model(x_tc, t_tc)
loss_ic = ((u_tc - terminal_condition(x_tc)) ** 2).mean()
t_bc = torch.rand(n_boundary, 1, device=device) * T
x_lo = torch.full((n_boundary, 1), x_min, device=device)
loss_bc_lo = (model(x_lo, t_bc) ** 2).mean()
x_hi = torch.full((n_boundary, 1), x_max, device=device)
target_hi = torch.exp(x_hi) - K * torch.exp(-r * (T - t_bc))
loss_bc_hi = ((model(x_hi, t_bc) - target_hi) ** 2).mean()
loss = loss_pde + 10.0 * loss_ic + loss_bc_lo + loss_bc_hi
loss.backward()
optimizer.step()
scheduler.step()
if epoch % 1000 == 0:
print(f"Epoch {epoch:5d} | PDE: {loss_pde:.2e} | "
f"IC: {loss_ic:.2e} | BC: {loss_bc_lo + loss_bc_hi:.2e}")
return model
強調しておきたい構造上の選択は二つある:
- 満期条件の重み。 ペイオフが問題を定義するため、その重みを 10 倍にしている。強く課さなければ、ネットワークはどこでもゼロを出力して PDE を自明に満たせる——斉次 PDE には無限個の解があり、満期条件がそのうちの一つを選ぶ。
- 各エポックでコロケーション点を再サンプリングする。 各ステップで新しい点を引くため、残差に対する確率的正則化として働く。もう一つの方法である固定点集合では、ネットワークがその正確な座標の残差に過学習しやすい。
ヘストン確率的ボラティリティモデルへの拡張

ブラック・ショールズは単一の定数 で価格を決める。これは、GARCH(1,1) ボラティリティ予測 が否定するために作られた仮定そのものだ。ヘストンでは、ボラティリティを二つ目の確率因子、瞬間分散 とする。
ここで は平均回帰速度、 は長期分散、 はボラティリティのボラティリティ、 である。
価格評価 PDE は状態変数について二次元になる。
ここでメッシュレス手法の魅力が見えてくる。有限差分法には のグリッドが必要で、典型的な なら ノードになる。確率金利のような三つ目の確率因子を加えると、グリッドは実用にならない。モンテカルロ法は次元に対するスケーリングはよいが、特にグリークスの収束が遅い。
ヘストン PINN のアーキテクチャ
ネットワークは とともに、三つの入力 を受け取る。ADI スキームを扱いにくくする項、混合偏導関数 は、autograd.grad をもう一度呼ぶだけで得られる。
class HestonPINN(nn.Module):
def __init__(self, hidden_dim=256, num_layers=5):
super().__init__()
layers = [nn.Linear(3, hidden_dim), nn.Tanh()]
for _ in range(num_layers - 1):
layers += [nn.Linear(hidden_dim, hidden_dim), nn.Tanh()]
layers.append(nn.Linear(hidden_dim, 1))
self.net = nn.Sequential(*layers)
def forward(self, x, v, t):
return self.net(torch.cat([x, v, t], dim=1))
def heston_pde_residual(model, x, v, t, kappa, theta, xi, rho, r):
x.requires_grad_(True)
v.requires_grad_(True)
t.requires_grad_(True)
u = model(x, v, t)
u_x, u_v, u_t = torch.autograd.grad(
u, [x, v, t], torch.ones_like(u), create_graph=True
)
u_xx = torch.autograd.grad(u_x, x, torch.ones_like(u_x), create_graph=True)[0]
u_vv = torch.autograd.grad(u_v, v, torch.ones_like(u_v), create_graph=True)[0]
u_xv = torch.autograd.grad(u_x, v, torch.ones_like(u_x), create_graph=True)[0]
residual = (
u_t
+ 0.5 * v * u_xx
+ rho * xi * v * u_xv
+ 0.5 * xi**2 * v * u_vv
+ (r - 0.5 * v) * u_x
+ kappa * (theta - v) * u_v
- r * u
)
return residual
u_xv は、最初の呼び出しで作ったグラフを再利用し、u_x を v で微分して得ている。混合偏導関数の対称性から、u_v を x で微分しても同じテンソルになるはずだが、float32 では厳密には一致しない。その差は、グラフが正しく動いているかを確認する安価な診断になる。
アメリカン・オプションと自由境界問題

アメリカン・オプションには早期行使制約が加わる。価値は本質価値を下回ってはならない。これにより PDE は自由境界問題、すなわち線形相補性問題(LCP)になる。
ここで はブラック・ショールズ作用素、 はペイオフである。これを損失に組み込む方法は二つある。
ペナルティ法
相補性制約を滑らかなペナルティに置き換える。
は大きな値(通常は から )にする。 が本質価値を下回ると、ペナルティが上へ押し戻し、PINN の損失は次のようになる。
アーキテクチャを変える必要はなく、残差を変更するだけだ。代償は、条件数とのトレードオフを持つ新しいハイパーパラメータである。小さすぎれば制約違反が起き、大きすぎれば損失地形がペナルティ項に支配される。
直接的な自由境界アプローチ
二つのネットワークを同時に学習する。一つは価格 、もう一つは最適行使境界 用だ。損失には継続領域の PDE、境界での滑らかな接続条件、行使領域のペイオフを入れる。境界が第一級の出力として得られるため、アメリカン・オプションのポジションをヘッジする際に本当に欲しい情報になる。
PINN によるジャンプ拡散モデル

マートンのモデルは、幾何ブラウン運動にポアソンジャンプを加える。
ここで は、強度 と対数正規分布のジャンプサイズを持つ複合ポアソン過程である。価格評価は偏積分微分方程式(PIDE)になる。
ここで はジャンプ倍率の密度である。
有限差分法を壊すのはこの積分だ——領域内の各点を他のすべての点と結び付け、ソルバーが依存する帯行列構造を破壊する。PINN には失うべきその構造がない。積分は残差のもう一つの項にすぎず、各コロケーション点で求積によって評価できる。さらにネットワークはあらゆる場所で定義されているため、 は補間ではなく、そのまま順伝播で計算できる。
def jump_integral(model, x, t, lam, mu_j, sigma_j, n_quad=32):
"""Approximate jump integral using Gauss-Hermite quadrature."""
nodes, weights = np.polynomial.hermite.hermgauss(n_quad)
nodes = torch.tensor(nodes, dtype=torch.float32, device=x.device)
weights = torch.tensor(weights, dtype=torch.float32, device=x.device)
y_nodes = mu_j + sigma_j * np.sqrt(2) * nodes
integral = torch.zeros_like(x)
for i in range(n_quad):
x_shifted = x + y_nodes[i]
v_shifted = model(x_shifted, t)
integral += weights[i] * v_shifted
integral *= 1.0 / np.sqrt(np.pi)
return integral
PIDE 残差は次のようになる。
ここで は求積近似である。このループは学習ステップごとに n_quad 回の追加順伝播を必要とし、それらすべてが autograd グラフに入る——ジャンプの本当のコストは数学ではなくメモリだ。
従来手法との比較

構造上の違いは実在し、ベンチマークなしでも述べられる:
| 基準 | 有限差分法 | モンテカルロ法 | PINN |
|---|---|---|---|
| 必要なグリッド/メッシュ | あり(構造化グリッド) | なし | なし(メッシュレス) |
| 次元の呪い | 深刻(3D 超は非実用的) | 軽度( で収束) | 軽度(ネットワーク容量に応じて拡大) |
| グリークス | 有限差分近似 | パスワイズ/LR 推定量 | 自動微分で厳密 |
| パラメータ間での再利用 | 再度解く必要がある | 再シミュレーションが必要 | パラメトリック:一度学習 |
| アメリカン・オプション | LCP 上の SOR/PSOR | ロングスタッフ・シュワルツ回帰 | ペナルティまたは自由境界 |
| 誤差限界 | あり(スキームの次数) | あり(CLT) | なし——経験的損失のみ |
通常ならここに置く性能項目——学習時間、推論レイテンシ、精度——は意図的に省いている。それらの測定は未解決の作業であって、表の項目ではないからだ。
PINN が現実的に優位になり得る場面
リアルタイムの再価格評価。 学習後の評価はバッチ全体への順伝播なので、パラメータセットごとに一度解く代わりに、カーネル起動一回でポートフォリオ全体を再価格評価できる。現実的なポートフォリオ規模で、十分に調整したクランク・ニコルソン法を上回るかどうかは実証的な問題であり、ここでは測定していない。
高次元モデル。 確率ボラティリティ、確率金利、ジャンプを組み合わせると 4 次元以上になり、有限差分法は実質的に使えなくなる。PINN は学習の難しさという条件付きではあるが、次元が増えても段階的に性能が悪化する。
連続的なグリークス。 ネットワークは滑らかで微分可能なので、デルタ、ガンマ、シータ、ベガ は PDE 残差と同じ autograd の仕組みから得られる——バンプ・アンド・リバリューも有限差分ノイズもない。これはこの記事で最も強い主張であり、その裏付けとなるガンマ曲面の測定が最も必要な主張でもある。
パラメトリック解。 モデルパラメータ(、、)をネットワーク入力にすれば、一つの PINN で単一のキャリブレーションではなくモデル族全体をカバーできる。
PINN が苦戦する場面
学習コスト。 一つのパラメータセットにおける一つのオプションなら、PINN が最初の 1,000 エポックを終える前に有限差分の解析は終わっている。
誤差限界がない。 リチャードソン外挿を使う有限差分法は、既知の収束次数で機械精度に到達する。PINN が報告するのは損失値であり、誤差限界ではない。不確実性を考慮した変種(Bai et al., 2025)は信頼区間を付けるが、この分野はまだ若い。
最適化の難しさ。 損失地形は強く非凸で、PDE、境界、満期の各項の重み付けは調整が必要になる。典型的な失敗は、ネットワークが PDE 残差をほぼゼロにしながら境界条件を完全に無視することだ——間違った問題に対する、完全に正しい解である。
再現性。 シード、コロケーション分布、最適化器の設定が違えば、意味のあるほど異なる解に到達し得る。アンサンブルは助けになるが、コストも増やす。
最後の二つはグラフにする価値が最も高い部分だ。これを再実装する人なら誰でも遭遇する失敗モードだからである。
これから測定すべきこと

この記事の正直な現状はこうだ。定式化は正しくコードも動くが、ここにあるものは、このデスクのハードウェアでもデータでもベンチマークされていない。導出を結果に変えるには、次の測定が必要になる:
- 閉形式のブラック・ショールズに対する sup-norm と RMSE。 グリッド全体で、シードごとに 5 シードを測定する。通説上の目標は小数点以下 4 桁以上の一致だが、、 でそれを検証し、失敗するシードも公開する。
- 価格誤差だけでなくデルタとガンマの誤差。 ノイズの多い のまま価格だけ 4 桁一致してもヘッジには役立たないため、ガンマを合格基準にする。
- 実時間の学習時間とオプションごとの推論レイテンシ。 10,000 オプションのポートフォリオについて、同じ GPU 上の同一問題に対するクランク・ニコルソン法と比較する。
- 失敗モードを意図的に再現する。 ネットワークが PDE を満たす一方で境界を外すまで境界損失の重みを下げ、5 シードを実行してばらつきをプロットする。どちらも安価に作れて、見栄えのよい価格曲面をもう一つ作るより有用だ。
- 実際の Deribit BTC クォートへの適合。 少なくとも、、 に戻すのではなく、上記の暗号資産寄りパラメータを維持する。
- アーキテクチャと最適化器の選択を、助言ではなく知見として示す。 広くするか深くするか、
tanhと ReLU の比較(ReLU の不連続な二階導関数は残差を明らかに壊すはずだ)、 の掃引、Adam の後に L-BFGS を使う場合と Adam のみの場合の比較は、いずれも一行の実験でできる。実行するまでは文献から繰り返される通説であり、この記事では推奨として繰り返さない。
測定なしでも成り立つ構造上の主張は二つだけだ。これは実行結果ではなく定式化の性質だからである。対数価格座標を使うこと(PDE が定数係数になるのは代数上の事実)と、PDE 項より満期条件を重くすること(斉次 PDE がゼロ解を許すのは問題自体の事実)である。
ほかに存在するもの

ここでは検証していないが、知っておく価値のある方向性を挙げる:
- 残差適応型コロケーションサンプリング — 一様に配置するのではなく、残差が大きい場所、ブラック・ショールズならストライク付近、ヘストンなら Feller 境界付近に点を置く。実装は短い:
def adaptive_resample(model, x_pool, t_pool, n_select):
"""Select collocation points with highest PDE residual."""
with torch.no_grad():
residuals = compute_pde_residual(model, x_pool, t_pool).abs()
probs = residuals.squeeze() / residuals.sum()
indices = torch.multinomial(probs, n_select, replacement=False)
return x_pool[indices], t_pool[indices]
- ストライクと満期をまたぐ転移学習 — 最初から学習し直すのではなく、近隣の から微調整し、オプションチェーン全体をカバーするライブラリを維持する。
- 物理法則情報エクストリーム・ラーニング・マシン — 隠れ層の重みを固定して出力層だけを学習し、学習を一回の線形方程式求解に縮める。表現力は下がるが、ブラック・ショールズは低次元なので問題にならないかもしれない。
- 作用素学習(DeepONet、FNO) — 解そのものではなく解作用素を学習し、 を写像することで、新しいペイオフ構造でも再学習を不要にする。DeepSVM を参照。
結論

PINN は有限差分法やモンテカルロ法を置き換えるものではない。単一のパラメータセットにおける単一の低次元オプションなら、有限差分法が勝り、比較にもならない。PINN の用途は狭く明確だ。グリッドが破綻する高次元モデル、ポートフォリオ全体で再利用するパラメトリック解、そして価格と同じ自動微分パスから得られるグリークスである。
この記事が届けるのは翻訳層だ。ヘストンの混合偏導関数、アメリカン・オプションの自由境界、マートンのジャンプ積分を、それぞれ損失関数の一項に変える方法である。まだ届けられていないのは、得られたネットワークがヘッジに十分な精度を持つという証拠だ。それは次の作業であり、実行されるまでは、上記を推奨ではなく導出として扱ってほしい。
参考文献と関連資料
- Raissi, M., Perdikaris, P., Karniadakis, G.E. (2019). 物理法則情報ニューラルネットワーク:非線形偏微分方程式に関する順問題・逆問題を解く深層学習フレームワーク. Journal of Computational Physics, 378, 686-707.
- Dhiman, A., Kaur, D. (2023). オプション価格評価のための物理法則情報ニューラルネットワーク. arXiv preprint.
- Salvador, B. et al. (2023). 物理法則情報ニューラルネットワークによるアメリカン・オプション価格評価のメッシュレス手法. Engineering Analysis with Boundary Elements.
- Bai, G. et al. (2025). ブラック・ショールズ方程式の不確実性対応物理法則情報ニューラルネットワーク解. arXiv preprint.
- Chen, Y. et al. (2025). データ不足下でのアメリカン・オプション価格評価のための確率ジャンプ拡散過程情報ニューラルネットワーク. Applied Soft Computing.
- Benth, F.E. et al. (2025). DeepSVM:物理法則情報ディープ作用素ネットワークによる確率ボラティリティモデルの学習. arXiv preprint.
- He, Y. et al. (2024). ファイナンス情報ニューラルネットワーク:オプション価格評価の幾何を学習する. arXiv preprint.
- MathWorks:オプション価格評価のための物理法則情報ニューラルネットワーク(PINN). MATLAB Finance Blog, 2025.
- GitHub:BlackScholesPINN(PyTorch 実装).
- Raissi PINN GitHub リポジトリ.
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.