Physics-Informed Neural Networks for Options Pricing
PINN을 파생상품에 적용할 때 흥미로운 부분은 Black-Scholes가 아닙니다. Black-Scholes에는 폐쇄형 해가 있으므로, 이를 재현하는 네트워크는 결과가 아니라 정상 작동 여부를 확인하는 검사일 뿐입니다. 진짜 흥미로운 부분은 폐쇄형 해가 없고 유한 차분으로도 더 나아갈 수 없는 문제들입니다. 혼합 편미분 가 있는 Heston 2요인 PDE, 미국형 옵션의 자유 경계 문제, 그리고 적분 항이 영역의 모든 점을 다른 모든 점과 결합하는 Merton의 편적분미분방정식이 여기에 해당합니다.
이 글에서는 이 각각을 손실 함수에 어떻게 넣는지 설명합니다. 구체적으로는 Black-Scholes PINN을 학습 가능하게 만드는 로그 가격 잔차, 교차 미분을 autograd가 그대로 계산하는 3입력 Heston 네트워크, 조기 행사를 페널티 방식과 두 네트워크 방식으로 처리하는 방법, 그리고 점프 적분을 PDE 잔차 안에 넣는 Gauss-Hermite 구적법을 다룹니다.
이 글은 벤치마크가 아닙니다. 아래에서 결과처럼 보이는 모든 수치는 목표 또는 인용이며, 그렇게 표시되어 있습니다. 측정 작업의 범위는 마지막에 정리합니다.
PINN은 Raissi 외 (2019)가 소개했으며, 그 작동 원리는 이 블로그의 Navier-Stokes 문제에서 이미 다루었습니다. 여기서도 같은 자동미분 잔차 기법을 사용해 유체 방정식의 특이점을 찾습니다. PDE는 손실 항이 되고, 자동미분은 입력에 대한 네트워크의 정확한 미분값을 제공하며, 격자는 전혀 만들지 않습니다. 여기서 달라지는 것은 손실에 넣는 PDE뿐입니다.
물리 제약으로서의 Black-Scholes PDE

Black-Scholes PDE, 종단 보수 , 그리고 그 배경의 무차익 논증은 Black-Scholes 공식에서 다루었습니다. 이 절에서는 이를 전제로 하고 네트워크가 실제로 학습할 수 있는 형태로 바로 들어갑니다.
로그 가격 변환
를 직접 사용하면 문제가 생깁니다. 영역이 이고 PDE 계수가 가변적이기 때문입니다. 표준 변환 을 적용하면 상수 계수 형태가 됩니다.
이는 에서의 대류-확산-반응 방정식입니다. 가변 계수 와 가 사라지는 것은 네트워크에 중요합니다. 크기가 에 따라 변하는 잔차는 영역의 먼 끝부분이 지배하게 되고, 최적화기는 그곳에 자원을 집중하게 됩니다.
Black-Scholes PINN 손실
네트워크를 라고 하겠습니다. 내부에서 배치점 를 개, 경계에서 개, 종단 시점에서 개 샘플링합니다.
모든 편미분은 create_graph=True를 설정한 torch.autograd.grad로 계산하므로 역전파 중에도 미분 계산을 거쳐 그래디언트가 흐릅니다. 이 단일 플래그가 구현의 핵심입니다.
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배의 가중치를 둡니다. 강하게 적용하지 않으면 네트워크는 어디서나 0을 출력해 PDE를 자명하게 만족할 수 있습니다. 동차 PDE에는 무한히 많은 해가 있고, 종단 조건이 그중 하나를 선택하기 때문입니다.
- 매 epoch 배치점 재표본추출. 매 단계 새로운 점을 뽑으면 잔차에 확률적 정규화 효과가 생깁니다. 고정된 점 집합을 쓰면 네트워크가 바로 그 좌표에서 잔차를 과적합할 수 있습니다.
Heston 확률적 변동성 모델로 확장

Black-Scholes는 단일 상수 로 가격을 책정하지만, 이는 GARCH(1,1) 변동성 예측이 부정하려는 가정입니다. Heston은 변동성을 두 번째 확률 요인, 즉 순간 분산 로 만듭니다.
여기서 는 평균 회귀 속도, 는 장기 분산, 는 변동성의 변동성이고, 입니다.
가격 책정 PDE는 상태 변수에 대해 2차원입니다.
여기서 메시 없는 방법이 매력적으로 보이기 시작합니다. 유한 차분 방식은 에 격자가 필요하며, 전형적인 격자는 개 노드입니다. 확률적 금리와 같은 세 번째 확률 요인을 추가하면 격자는 실용성을 잃습니다. 몬테카를로는 차원이 늘어날 때 더 잘 확장되지만, 특히 Greeks에서는 수렴이 느립니다.
Heston 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)가 됩니다.
여기서 은 Black-Scholes 연산자이고 는 보수입니다. 이를 손실에 넣는 방법은 두 가지입니다.
페널티 방식
상보성 제약을 매끄러운 페널티로 바꿉니다.
는 크게 둡니다(보통 에서 ). 가 내재가치 아래로 내려가면 페널티가 다시 끌어올리고, PINN 손실은 다음과 같이 됩니다.
아키텍처 변경은 없고 잔차만 수정합니다. 대가는 나쁜 조건수 절충을 가진 새 하이퍼파라미터입니다. 너무 작으면 제약을 위반하고, 너무 크면 손실 지형이 페널티 항에 지배됩니다.
직접 자유 경계 방식
두 네트워크를 함께 학습합니다. 하나는 가격 를, 다른 하나는 최적 행사 경계 를 출력합니다. 손실에는 계속 영역의 PDE, 경계에서의 매끄러운 접합 조건, 행사 영역의 보수가 들어갑니다. 경계가 일급 출력으로 나오므로 미국형 옵션 포트폴리오를 헤지할 때 실제로 필요한 정보를 직접 얻을 수 있습니다.
PINN을 이용한 점프 확산 모델

Merton 모델은 기하 브라운 운동에 Poisson 점프를 추가합니다.
여기서 는 강도 와 로그정규 점프 크기를 갖는 복합 Poisson 과정입니다. 가격 책정은 편적분미분방정식(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 초과는 비실용적) | 완만( 수렴) | 완만(네트워크 용량으로 확장) |
| Greeks | 유한 차분 근사 | 경로별/LR 추정량 | 자동미분으로 정확 |
| 매개변수 간 재사용 | 다시 풀어야 함 | 다시 시뮬레이션해야 함 | 매개변수화: 한 번 학습 |
| 미국형 옵션 | LCP의 SOR/PSOR | Longstaff-Schwartz 회귀 | 페널티 또는 자유 경계 |
| 오차 한계 | 있음(방법의 차수) | 있음(CLT) | 없음 — 경험적 손실만 |
여기에 보통 들어갈 성능 행, 즉 학습 시간·추론 지연·정확도는 의도적으로 제외했습니다. 측정하는 일이 아직 남은 작업이지 표의 항목이 아니기 때문입니다.
PINN이 그럴듯하게 우세한 곳
실시간 재가격. 학습이 끝나면 배치 전체를 한 번 순전파하면 되므로, 매개변수 집합마다 한 번씩 풀지 않고 한 번의 커널 실행으로 전체 포트폴리오를 재가격할 수 있습니다. 현실적인 포트폴리오 규모에서 잘 조정된 Crank-Nicolson 해석기보다 빠른지는 아직 측정하지 않은 실증 문제입니다.
고차원 모델. 확률 변동성, 확률 금리, 점프를 함께 고려하면 4차원 이상이 되며, 이 영역에서 유한 차분은 사실상 작동하지 않습니다. PINN은 차원이 늘어날 때 더 완만하게 성능이 저하되지만, 학습 난이도라는 제약이 있습니다.
연속적인 Greeks. 네트워크는 매끄럽고 미분 가능하므로 Delta, Gamma, Theta, Vega는 PDE 잔차와 동일한 autograd 메커니즘에서 나옵니다. bump-and-revalue도, 유한 차분 잡음도 없습니다. 이는 이 글에서 가장 강한 주장인 동시에, 이를 뒷받침하는 측정된 Gamma 표면이 가장 필요한 주장입니다.
매개변수화된 해. 모델 매개변수(, , )를 네트워크 입력으로 넣으면 하나의 PINN이 단일 캘리브레이션이 아니라 모델군 전체를 다룰 수 있습니다.
PINN이 어려움을 겪는 곳
학습 비용. 하나의 매개변수 집합에 대한 하나의 옵션에서는 PINN이 첫 1,000 epoch를 끝내기도 전에 유한 차분 해가 이미 끝납니다.
오차 한계 없음. Richardson 외삽을 사용하는 유한 차분은 알려진 수렴 차수로 기계 정밀도에 도달합니다. PINN이 보고하는 손실값은 오차 한계가 아닙니다. 불확실성 인식 변형(Bai 외, 2025)은 신뢰 구간을 붙이지만, 이 분야는 아직 젊습니다.
최적화의 어려움. 손실 지형은 심하게 비볼록이고 PDE, 경계, 종단 항 사이의 가중치는 조정 문제입니다. 전형적인 실패는 네트워크가 PDE 잔차를 거의 0으로 만들면서 경계 조건을 완전히 무시하는 것입니다. 즉, 잘못된 문제에 대한 완전히 유효한 해입니다.
재현성. 서로 다른 시드, 배치점 분포, 최적화기 설정은 의미 있게 다른 해를 만들 수 있습니다. 앙상블은 도움이 되지만 비용도 배로 늘립니다.
마지막 두 항목은 플롯으로 바꿀 가치가 가장 큽니다. 이 글을 다시 구현하는 사람이라면 누구나 그 실패 모드를 만나게 되기 때문입니다.
아직 측정해야 하는 것

이 글의 정직한 현재 상태는 다음과 같습니다. 정식화는 올바르고 코드도 실행되지만, 이 팀의 하드웨어나 데이터에서 벤치마크한 적은 없습니다. 유도를 결과로 바꾸려면 다음 측정이 필요합니다.
- 격자에서 폐쇄형 Black-Scholes에 대한 sup-norm과 RMSE를 시드별로, 총 5개 시드에 대해 측정합니다. 통상적인 경험적 목표는 소수점 이하 4자리 이상 일치하는 것이지만, 핵심은 , 에서 이를 검증하고 실패한 시드를 공개하는 것입니다.
- 가격 오차만이 아니라 Delta와 Gamma 오차도 측정합니다. 가격을 네 자리까지 맞춰도 잡음이 있는 라면 헤지에는 쓸모가 없으므로 Gamma가 수용 기준입니다.
- 10,000개 옵션 포트폴리오의 실제 학습 시간과 옵션당 추론 지연을 측정하고, 동일한 GPU에서 동일한 문제를 푼 Crank-Nicolson과 비교합니다.
- 실패 모드를 의도적으로 재현합니다. 네트워크가 PDE는 만족하지만 경계를 놓칠 때까지 경계 손실 가중치를 낮추고, 5개 시드를 실행해 분포를 그립니다. 두 실험 모두 저렴하고, 또 하나의 그럴듯한 가격 표면보다 유용합니다.
- 실제 Deribit BTC 시세에 적합시키거나, 최소한 위의 암호화폐 현실적 매개변수를 유지하고 , 으로 되돌리지 않습니다.
- 아키텍처와 최적화기 선택을 조언이 아닌 결과로 다룹니다. 더 넓은 네트워크와 더 깊은 네트워크,
tanh와 ReLU(ReLU의 불연속적인 2차 미분이 잔차를 눈에 띄게 망가뜨려야 함), 스윕, Adam 후 L-BFGS와 Adam 단독 실행은 모두 한 줄로 설정할 수 있는 실험입니다. 실행하기 전까지는 문헌에서 반복되는 통념일 뿐이며, 이 글은 이를 권고사항으로 되풀이하지 않습니다.
측정 없이도 유지되는 구조적 주장은 두 가지입니다. 실행 결과가 아니라 정식화의 성질이기 때문입니다. 로그 가격 좌표를 사용하면 PDE가 상수 계수가 된다는 점은 대수의 사실이고, PDE 항보다 종단 조건에 더 큰 가중치를 주어야 한다는 점은 동차 PDE가 0 해를 허용한다는 문제 자체의 사실입니다.
그 밖의 연구 방향

여기서는 시험하지 않았지만 알아둘 만한 방향은 다음과 같습니다.
- 잔차 적응형 배치점 샘플링 — 균일하게 뽑는 대신 잔차가 큰 곳, 즉 Black-Scholes에서는 행사가 근처, Heston에서는 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]
- 행사가와 만기에 걸친 전이 학습 — 처음부터 학습하는 대신 인접한 에서 미세 조정하여 옵션 체인을 포괄하는 라이브러리를 유지합니다.
- 물리 정보 극한 학습 머신 — 은닉 가중치를 고정하고 출력층만 학습하여, 학습을 한 번의 선형 풀이로 줄입니다. 표현력은 낮지만 Black-Scholes는 저차원이므로 문제가 되지 않을 수 있습니다.
- 연산자 학습(DeepONet, FNO) — 해 자체가 아니라 해 연산자를 학습하여 를 매핑하므로 새로운 보수 구조마다 재학습할 필요가 없습니다. DeepSVM을 참고하세요.
결론

PINN은 유한 차분이나 몬테카를로를 대체하지 않습니다. 하나의 매개변수 집합에 대한 하나의 저차원 옵션이라면 유한 차분이 이기며, 경쟁이 되지 않습니다. PINN의 적용 근거는 좁고 구체적입니다. 격자가 무너지는 고차원 모델, 포트폴리오 전체에서 재사용하는 매개변수화 해, 그리고 가격과 같은 자동미분 전달에서 나오는 Greeks입니다.
이 글이 제공하는 것은 변환 계층입니다. Heston 혼합 편미분, 미국형 자유 경계, Merton 점프 적분을 각각 손실 함수의 항으로 바꾸는 방법을 보여줍니다. 그러나 이렇게 얻은 네트워크가 헤지에 충분할 만큼 정확하다는 증거는 아직 제공하지 않습니다. 그것은 다음 작업이며, 완료될 때까지 위의 모든 내용을 권고가 아닌 유도로 받아들이세요.
참고 문헌 및 추가 읽을거리
- Raissi, M., Perdikaris, P., Karniadakis, G.E. (2019). 비선형 편미분방정식의 순방향 및 역방향 문제를 해결하기 위한 물리 정보 신경망: 딥러닝 프레임워크. Journal of Computational Physics, 378, 686-707.
- Dhiman, A., Kaur, D. (2023). 옵션 가격 책정을 위한 물리 정보 신경망. arXiv 프리프린트.
- Salvador, B. 외 (2023). 물리 정보 신경망을 통한 미국형 옵션 가격 책정의 메시 없는 방법. Engineering Analysis with Boundary Elements.
- Bai, G. 외 (2025). Black-Scholes 방정식을 위한 불확실성 인식 물리 정보 신경망 해법. arXiv 프리프린트.
- Chen, Y. 외 (2025). 데이터 부족 상황에서 미국형 옵션 가격 책정을 위한 확률적 점프 확산 과정 기반 신경망. Applied Soft Computing.
- Benth, F.E. 외 (2025). DeepSVM: 물리 정보 심층 연산자 네트워크로 확률적 변동성 모델 학습. arXiv 프리프린트.
- He, Y. 외 (2024). 금융 정보 신경망: 옵션 가격 책정의 기하 학습. arXiv 프리프린트.
- 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.