Physics-Informed Neural Networks for Options Pricing
Bagian menarik dari penerapan PINN pada derivatif bukanlah Black-Scholes. Black-Scholes memiliki bentuk tertutup; jaringan yang mereproduksinya adalah pemeriksaan kewajaran, bukan hasil. Bagian menariknya adalah segala sesuatu yang tidak memiliki bentuk tertutup dan tidak dapat lagi ditangani secara praktis oleh beda hingga: PDE dua faktor Heston dengan turunan parsial campurannya , masalah batas bebas opsi Amerika, dan persamaan integro-diferensial parsial Merton yang suku integralnya menghubungkan setiap titik dalam domain dengan semua titik lainnya.
Tulisan ini membahas cara memasukkan masing-masing hal tersebut ke dalam fungsi loss. Secara konkret: residual harga log yang membuat PINN Black-Scholes dapat dilatih, jaringan Heston dengan tiga input yang turunan silangnya diperoleh langsung dari autograd, penanganan exercise lebih awal melalui penalti versus dua jaringan, serta kuadratur Gauss-Hermite yang menempatkan integral lompatan di dalam residual PDE.
Tulisan ini bukan benchmark. Setiap angka di bawah yang tampak seperti hasil sebenarnya adalah target atau kutipan, dan ditandai demikian. Tahap pengukuran dijelaskan pada bagian akhir.
PINN diperkenalkan oleh Raissi et al. (2019), dan mekanismenya telah dibahas di blog ini dalam Masalah Navier-Stokes, tempat trik residual-autograd yang sama digunakan untuk mencari singularitas dalam persamaan fluida: PDE menjadi suku loss, autodiff menyediakan turunan eksak jaringan terhadap inputnya, dan tidak ada grid yang dibangun. Di sini, satu-satunya yang berubah adalah PDE yang dimasukkan ke dalam loss.
PDE Black-Scholes sebagai Kendala Fisika

PDE Black-Scholes, payoff terminalnya , dan argumen tanpa arbitrase di baliknya dibahas dalam Rumus Black-Scholes — bagian ini menganggap semuanya sudah diketahui dan langsung membahas bentuk yang benar-benar dapat digunakan untuk melatih jaringan.
Transformasi harga log
Bekerja langsung dengan bermasalah: domainnya adalah dan PDE memiliki koefisien yang berubah-ubah. Transformasi standar mengubahnya menjadi bentuk dengan koefisien konstan:
Ini adalah persamaan konveksi-difusi-reaksi pada . Koefisien berubah-ubah dan telah hilang, yang penting bagi jaringan: residual yang besarnya berskala dengan akan didominasi ujung jauh domain dan optimizer menghabiskan anggarannya di sana.
Loss PINN untuk Black-Scholes
Misalkan adalah jaringan. Ambil sampel titik kolokasi di bagian interior, di batas, dan pada waktu terminal:
Setiap turunan parsial dihitung melalui torch.autograd.grad dengan create_graph=True, sehingga gradien mengalir melalui perhitungan turunan selama backpropagation. Satu flag itulah seluruh trik implementasinya.
Implementasi PyTorch

Parameter di bawah bernuansa crypto, bukan parameter textbook: dan (kira-kira opsi BTC 30 hari) alih-alih , yang lazim di desk saham. Maturitas pendek ditambah volatilitas tinggi adalah regime ketika kink payoff paling tajam dan PINN paling sulit dilatih — justru itulah tujuannya.
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
Ada dua pilihan struktural yang perlu diperhatikan:
- Bobot pada kondisi terminal. Payoff mendapat bobot 10x karena mendefinisikan masalah. Tanpa penegakan yang kuat, jaringan dapat memenuhi PDE secara trivial dengan menghasilkan nol di mana-mana — PDE homogen memiliki tak terhingga banyak solusi dan kondisi terminallah yang memilih salah satunya.
- Mengambil ulang titik kolokasi setiap epoch. Titik diambil ulang pada setiap langkah, yang berperan sebagai regularisasi stokastik pada residual. Alternatifnya — kumpulan titik tetap — memungkinkan jaringan overfit terhadap residual pada koordinat yang persis sama.
Memperluas ke Model Volatilitas Stokastik Heston

Black-Scholes menetapkan harga dengan satu konstan, tepatnya asumsi yang hendak ditolak oleh peramalan volatilitas GARCH(1,1). Heston menjadikan volatilitas faktor stokastik kedua, yaitu varians sesaat :
di mana adalah kecepatan mean reversion, varians jangka panjang, vol-of-vol, dan .
PDE penetapan harganya berdimensi dua dalam state:
Di sinilah metode meshfree mulai tampak menarik. Skema beda hingga memerlukan grid dalam — ukuran tipikal berarti node. Tambahkan faktor stokastik ketiga, misalnya suku bunga stokastik, dan grid menjadi tidak praktis. Monte Carlo berskala lebih baik terhadap dimensi, tetapi konvergensinya lambat, terutama untuk Greeks.
Arsitektur PINN untuk Heston
Jaringan menerima tiga input dengan . Turunan parsial campuran — suku yang membuat skema ADI rumit — hanya memerlukan satu pemanggilan autograd.grad tambahan:
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
Perhatikan bahwa u_xv diperoleh dengan menurunkan u_x terhadap v, menggunakan kembali graph yang dibangun oleh pemanggilan pertama. Simetri turunan parsial campuran berarti penurunan u_v terhadap x seharusnya menghasilkan tensor yang sama; dalam float32 hasilnya tidak akan persis sama, dan selisihnya merupakan diagnostik murah untuk memeriksa apakah graph bekerja dengan benar.
Opsi Amerika dan Masalah Batas Bebas

Opsi Amerika menambahkan kendala exercise lebih awal: nilainya tidak boleh berada di bawah nilai intrinsik. Ini mengubah PDE menjadi masalah batas bebas, atau secara ekuivalen masalah komplementaritas linear (LCP):
di mana adalah operator Black-Scholes dan adalah payoff. Ada dua cara memasukkannya ke dalam loss.
Metode penalti
Ganti kendala komplementaritas dengan penalti halus:
dengan besar (biasanya hingga ). Saat turun di bawah nilai intrinsik, penalti memaksanya naik kembali, dan loss PINN menjadi:
Tidak ada perubahan arsitektur, hanya residual yang dimodifikasi. Konsekuensinya adalah hyperparameter baru dengan tradeoff conditioning yang buruk: terlalu kecil dan kendala dilanggar, terlalu besar dan lanskap loss didominasi suku penalti.
Pendekatan batas bebas langsung
Latih dua jaringan secara bersama: satu untuk harga , satu untuk batas exercise optimal . Loss memuat PDE di region kelanjutan, kondisi smooth pasting pada batas, dan payoff di region exercise. Batas tersebut menjadi output kelas satu, yaitu yang benar-benar dibutuhkan untuk melakukan hedging pada book Amerika.
Model Jump-Diffusion dengan PINN

Model Merton menambahkan lompatan Poisson pada gerak Brownian geometris:
di mana adalah proses Poisson majemuk dengan intensitas dan ukuran lompatan log-normal. Penetapan harga menjadi persamaan integro-diferensial parsial (PIDE):
dengan adalah densitas pengali lompatan.
Integral inilah yang merusak metode beda hingga — integral menghubungkan setiap titik dalam domain dengan semua titik lain, sehingga menghancurkan struktur berpita yang diandalkan solver. PINN tidak memiliki struktur tersebut, jadi tidak ada yang hilang. Integral hanyalah suku lain dalam residual, dievaluasi dengan kuadratur pada setiap titik kolokasi, dan karena jaringan terdefinisi di mana-mana, dapat diperoleh melalui forward pass tanpa biaya tambahan alih-alih interpolasi:
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
Residual PIDE kemudian adalah:
dengan adalah aproksimasi kuadratur. Loop tersebut membutuhkan n_quad forward pass tambahan pada setiap langkah pelatihan, semuanya masuk ke graph autograd — harga sebenarnya dari lompatan adalah memori, bukan matematika.
Perbandingan dengan Metode Tradisional

Perbedaan strukturalnya nyata dan dapat dijelaskan tanpa benchmark:
| Kriteria | Beda Hingga | Monte Carlo | PINN |
|---|---|---|---|
| Memerlukan grid/mesh | Ya (grid terstruktur) | Tidak | Tidak (meshfree) |
| Kutukan dimensionalitas | Parah (>3D tidak praktis) | Ringan (konvergensi ) | Ringan (kapasitas jaringan berskala) |
| Greeks | Aproksimasi beda hingga | Estimator pathwise/LR | Eksak melalui autodiff |
| Dapat digunakan ulang lintas parameter | Harus menyelesaikan ulang | Harus melakukan simulasi ulang | Parametrik: cukup dilatih sekali |
| Opsi Amerika | SOR/PSOR pada LCP | Regresi Longstaff-Schwartz | Penalti atau batas bebas |
| Batas error | Ada (orde skema) | Ada (CLT) | Tidak ada — hanya loss empiris |
Baris performa yang biasanya ada di sini — waktu pelatihan, latensi inferensi, akurasi — sengaja tidak dicantumkan, karena pengukurannya adalah pekerjaan yang belum selesai, bukan isi tabel.
Di mana PINN kemungkinan unggul
Repricing real-time. Setelah dilatih, evaluasi adalah forward pass atas sebuah batch, sehingga seluruh book dapat dihitung ulang dalam satu peluncuran kernel, bukan satu penyelesaian untuk setiap set parameter. Apakah ini mengungguli solver Crank-Nicolson yang dituning dengan baik pada ukuran book realistis adalah pertanyaan empiris dan belum diukur di sini.
Model berdimensi tinggi. Volatilitas stokastik ditambah suku bunga stokastik dan lompatan menghasilkan 4+ dimensi, tempat beda hingga praktis tidak dapat digunakan. Kinerja PINN menurun secara bertahap ketika dimensi bertambah, dengan catatan pelatihannya lebih sulit.
Greeks kontinu. Jaringan bersifat halus dan dapat diturunkan, sehingga Delta, Gamma, Theta, dan Vega berasal dari mekanisme autograd yang sama dengan residual PDE — tanpa bump-and-revalue dan tanpa noise beda hingga. Ini adalah klaim terkuat dalam tulisan ini dan juga klaim yang paling membutuhkan permukaan Gamma hasil pengukuran sebagai pendukung.
Solusi parametrik. Memasukkan parameter model (, , ) sebagai input jaringan memungkinkan satu PINN mencakup sekumpulan model, bukan hanya satu kalibrasi.
Di mana PINN mengalami kesulitan
Biaya pelatihan. Untuk satu opsi pada satu set parameter, penyelesaian beda hingga sudah selesai sebelum PINN menuntaskan seribu epoch pertamanya.
Tidak ada batas error. Beda hingga dengan ekstrapolasi Richardson dapat mencapai presisi mesin dengan orde konvergensi yang diketahui. PINN melaporkan nilai loss, yang bukan batas error. Varian yang memperhitungkan ketidakpastian (Bai et al., 2025) menambahkan interval kepercayaan, tetapi bidang ini masih muda.
Kesulitan optimisasi. Lanskap loss sangat non-konveks dan pembobotan antara suku PDE, batas, dan terminal merupakan masalah tuning. Kegagalan yang khas adalah jaringan mendorong residual PDE mendekati nol sambil sepenuhnya mengabaikan kondisi batas — solusi yang sepenuhnya valid untuk masalah yang salah.
Reprodusibilitas. Seed, distribusi kolokasi, dan pengaturan optimizer yang berbeda dapat menghasilkan solusi yang secara bermakna berbeda. Ensemble membantu, tetapi juga melipatgandakan biaya.
Dua hal terakhir itulah bagian tulisan ini yang paling layak diubah menjadi plot, karena merupakan mode kegagalan yang akan ditemui siapa pun yang mengimplementasikan ulang metode ini.
Yang Masih Perlu Diukur

Kondisi jujur artikel ini: formulasinya benar dan kodenya berjalan, tetapi belum ada yang di-benchmark pada hardware atau data desk ini. Tahap yang akan menjadikannya hasil, bukan sekadar derivasi, adalah:
- Sup-norm dan RMSE terhadap Black-Scholes bentuk tertutup di seluruh grid , per seed, lima seed. Target yang biasa disebut adalah kesesuaian hingga 4+ angka desimal; yang perlu diuji adalah target tersebut pada , , lalu publikasikan seed saat target gagal.
- Error Delta dan Gamma, bukan hanya error harga. Jaringan yang mencocokkan harga hingga empat digit tetapi menghasilkan yang bising tidak berguna untuk hedging, jadi Gamma adalah kriteria penerimaan.
- Waktu pelatihan wall-clock dan latensi inferensi per opsi untuk book berisi 10.000 opsi, dibandingkan dengan penyelesaian Crank-Nicolson atas masalah identik pada GPU yang sama.
- Mode kegagalan yang direproduksi secara sengaja. Kurangi bobot loss batas sampai jaringan memenuhi PDE tetapi meleset dari batas; jalankan lima seed dan plot sebarannya. Keduanya murah dibuat dan lebih berguna daripada permukaan harga lain yang hanya tampak benar.
- Fitting pada kuotasi BTC Deribit nyata, atau setidaknya pertahankan parameter bernuansa crypto di atas alih-alih kembali ke , .
- Pilihan arsitektur dan optimizer sebagai temuan, bukan saran. Wider-versus-deeper,
tanhversus ReLU (turunan kedua ReLU yang diskontinu seharusnya terlihat merusak residual), sweep , serta Adam-then-L-BFGS versus Adam saja semuanya merupakan eksperimen satu baris. Sebelum dijalankan, semuanya hanyalah folklore yang diulang dari literatur, dan tulisan ini menolak mengulanginya sebagai rekomendasi.
Dua klaim struktural yang tetap bertahan tanpa pengukuran, karena merupakan sifat formulasi dan bukan hasil suatu run: gunakan koordinat harga log (PDE menjadi berkoefisien konstan, yang merupakan fakta aljabar), dan beri bobot kondisi terminal lebih tinggi daripada suku PDE (PDE homogen memiliki solusi nol, yang merupakan fakta tentang masalahnya).
Apa Lagi yang Tersedia

Beberapa arah yang layak diketahui, tetapi belum diuji di sini:
- Sampling kolokasi adaptif terhadap residual — tempatkan titik di lokasi residual besar, dekat strike untuk Black-Scholes atau dekat batas Feller untuk Heston, bukan secara seragam. Implementasinya singkat:
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]
- Transfer learning lintas strike dan maturitas — lakukan fine-tuning dari terdekat alih-alih melatih dari awal, agar tersedia library yang mencakup option chain.
- Extreme Learning Machine Berbasis Fisika — bekukan bobot tersembunyi, latih hanya layer output, sehingga pelatihan berkurang menjadi satu penyelesaian linear. Ekspresivitasnya lebih rendah, tetapi Black-Scholes cukup berdimensi rendah sehingga mungkin tidak menjadi masalah.
- Pembelajaran operator (DeepONet, FNO) — pelajari operator solusi, bukan solusinya, dengan memetakan sehingga struktur payoff baru tidak memerlukan pelatihan ulang. Lihat DeepSVM.
Kesimpulan

PINN tidak menggantikan beda hingga atau Monte Carlo. Untuk satu opsi berdimensi rendah pada satu set parameter, beda hingga menang dengan selisih yang jauh. Alasan menggunakan PINN bersifat sempit dan spesifik: model berdimensi tinggi yang membuat grid tidak dapat digunakan, solusi parametrik yang dipakai ulang di seluruh book, serta Greeks yang berasal dari pass autodiff yang sama dengan harga.
Yang diberikan tulisan ini adalah lapisan translasi — cara turunan parsial campuran Heston, batas bebas Amerika, dan integral lompatan Merton masing-masing menjadi suku dalam fungsi loss. Yang belum diberikan adalah bukti bahwa jaringan yang dihasilkan cukup akurat untuk digunakan dalam hedging. Itulah tahap berikutnya, dan sampai tahap tersebut dijalankan, anggap semua uraian di atas sebagai derivasi, bukan rekomendasi.
Referensi dan Bacaan Lanjutan
- Raissi, M., Perdikaris, P., Karniadakis, G.E. (2019). Physics-informed neural networks: A deep learning framework for solving forward and inverse problems involving nonlinear partial differential equations. Journal of Computational Physics, 378, 686-707.
- Dhiman, A., Kaur, D. (2023). Physics Informed Neural Network for Option Pricing. arXiv preprint.
- Salvador, B. et al. (2023). Meshless methods for American option pricing through Physics-Informed Neural Networks. Engineering Analysis with Boundary Elements.
- Bai, G. et al. (2025). An uncertainty-aware physics-informed neural network solution for the Black-Scholes equation. arXiv preprint.
- Chen, Y. et al. (2025). Stochastic jump diffusion process informed neural networks for American option pricing under data scarcity. Applied Soft Computing.
- Benth, F.E. et al. (2025). DeepSVM: Learning Stochastic Volatility Models with Physics-Informed Deep Operator Networks. arXiv preprint.
- He, Y. et al. (2024). Finance-Informed Neural Network: Learning the Geometry of Option Pricing. arXiv preprint.
- MathWorks: Physics-Informed Neural Networks (PINNs) for Option Pricing. MATLAB Finance Blog, 2025.
- GitHub: BlackScholesPINN (PyTorch implementation).
- Raissi PINNs GitHub repository.
Penulis
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.