Physics-Informed Neural Networks for Options Pricing
الجزء المثير في تطبيق PINN على المشتقات ليس Black-Scholes. فـ Black-Scholes له صيغة مغلقة؛ والشبكة التي تعيد إنتاجها ليست نتيجة بل اختبار سلامة. الجزء المثير هو كل ما لا يملك صيغة مغلقة وحيث تنفد إمكانات الفروق المحدودة: معادلة Heston الجزئية ذات العاملين مع المشتقة المختلطة ، ومسألة الحد الحر للخيار الأمريكي، ومعادلة Merton الجزئية التفاضلية التكاملية التي يربط حد تكاملها كل نقطة في المجال بكل نقطة أخرى.
يتناول هذا المنشور كيفية إدخال كل واحدة من هذه المسائل في دالة خسارة. وتحديدًا: الباقي في إحداثي log-price الذي يجعل PINN لـ Black-Scholes قابلًا للتدريب، وشبكة Heston ذات المدخلات الثلاثة التي تأتي مشتقتها المختلطة تلقائيًا من autograd، ومعالجة التنفيذ المبكر بالعقوبة مقابل شبكتين، وتربيع Gauss-Hermite الذي يضع تكامل القفزات داخل باقي PDE.
ما لا يقدمه المنشور هو benchmark. كل رقم أدناه يبدو كأنه نتيجة هو إما هدف أو اقتباس، وموسوم على هذا الأساس. نطاق القياس موضح في النهاية.
قدّم Raissi et al. (2019) شبكات PINN، كما أن آلياتها مغطاة في هذه المدونة في مسألة Navier-Stokes، حيث تبحث حيلة autograd-residual نفسها عن التفردات في معادلات الموائع: تصبح PDE حدًا في الخسارة، ويوفر autodiff مشتقات دقيقة للشبكة بالنسبة إلى مدخلاتها، ولا تُبنى أي شبكة. الشيء الوحيد الذي يتغير هنا هو معادلة PDE الداخلة في الخسارة.
معادلة Black-Scholes الجزئية كقيد فيزيائي

معادلة Black-Scholes، وterminal payoff ، وحجة no-arbitrage وراءها مغطاة في صيغة Black-Scholes — يفترض هذا القسم معرفتها وينتقل مباشرة إلى الصيغة التي يمكن تدريب شبكة عليها.
تحويل log-price
العمل مباشرة مع إشكالي: المجال هو ومعادلة PDE لها معاملات متغيرة. التحويل القياسي يحولها إلى صيغة ذات معاملات ثابتة:
هذه معادلة حمل-انتشار-تفاعل على . تختفي المعاملات المتغيرة و، وهذا مهم للشبكة: الباقي الذي يتدرج حجمه مع يهيمن عليه الطرف البعيد من المجال وينفق المحسن ميزانيته هناك.
خسارة PINN لـ Black-Scholes
لتكن هي الشبكة. خذ نقطة collocation في الداخل، و على الحدود، و عند الزمن النهائي:
تُحسب كل مشتقة جزئية عبر torch.autograd.grad مع create_graph=True، بحيث تتدفق التدرجات عبر حساب المشتقة أثناء backpropagation. هذا العلم الواحد هو حيلة التنفيذ كلها.
تطبيق PyTorch

المعاملات أدناه بطابع العملات المشفرة لا textbook: و (خيار BTC لمدة 30 يومًا تقريبًا) بدلًا من و في مكتب الأسهم. النضج القصير مع التقلب العالي هو النظام الذي تكون فيه kink الخاصة بالـ payoff حادة ويصعب فيه تدريب 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
هناك خياران بنيويان يجدر التنبيه إليهما:
- وزن الشرط النهائي. يحصل payoff على وزن 10x لأنه يحدد المسألة. من دون فرض قوي قد تحقق الشبكة PDE بصورة تافهة بإخراج صفر في كل مكان — فـ homogeneous PDE لها حلول لا نهائية، والشرط النهائي هو ما يختار واحدًا منها.
- إعادة أخذ نقاط collocation في كل epoch. تُسحب النقاط جديدة في كل خطوة، وهذا يعمل كتنظيم عشوائي على الباقي. البديل — مجموعة نقاط ثابتة — يسمح للشبكة بفرط الملاءمة للباقي عند الإحداثيات نفسها.
التمديد إلى نموذج Heston للتقلب العشوائي

يسعر Black-Scholes مع ثابت واحد، وهو الافتراض الذي صُمم تنبؤ تقلب GARCH(1,1) لرفضه. يجعل Heston التقلب عاملًا عشوائيًا ثانيًا، هو التباين اللحظي :
حيث سرعة العودة إلى المتوسط، و التباين طويل الأجل، و تقلب التقلب، و.
معادلة التسعير الجزئية ثنائية الأبعاد في الحالة:
هنا تبدأ طريقة بلا شبكة تبدو جذابة. تحتاج الفروق المحدودة شبكة في — النموذج المعتاد يساوي عقدة. إضافة عامل عشوائي ثالث، مثل معدلات عشوائية، تجعل الشبكة غير عملية. يتوسع Monte Carlo أفضل مع البعد لكنه يتقارب ببطء، خصوصًا بالنسبة إلى Greeks.
معمارية PINN لـ Heston
تأخذ الشبكة ثلاثة مدخلات مع . المشتقة المختلطة — الحد الذي يجعل مخططات 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 يجب أن يعطي tensor نفسه؛ لكن في float32 لن يكون ذلك مطابقًا تمامًا، والفجوة تشخيص رخيص لسلوك الرسم البياني.
الخيارات الأمريكية ومسائل الحد الحر

تضيف الخيارات الأمريكية قيد التنفيذ المبكر: يجب ألا تنخفض القيمة تحت القيمة الجوهرية. وهذا يحول PDE إلى مسألة حد حر، أو بصورة مكافئة مسألة تكاملية خطية (LCP):
حيث إن مؤثر Black-Scholes و هو payoff. توجد طريقتان لإدخال ذلك في الخسارة.
طريقة العقوبة
استبدل قيد التكاملية بعقوبة ناعمة:
مع كبير (عادة إلى ). عندما تنخفض تحت القيمة الجوهرية، تجبرها العقوبة على الارتفاع، وتصبح خسارة PINN:
لا يتغير التصميم، بل يتغير الباقي فقط. التكلفة هي hyperparameter جديد مع مفاضلة conditioning سيئة: الصغير جدًا ينتهك القيد، والكبير جدًا يجعل مشهد الخسارة خاضعًا لحد العقوبة.
منهج الحد الحر المباشر
درّب شبكتين معًا: واحدة للسعر وأخرى لحد التنفيذ الأمثل . تحمل الخسارة PDE في منطقة الاستمرار، وشرط smooth-pasting عند الحد، وpayoff في منطقة التنفيذ. يظهر الحد كمخرج من الدرجة الأولى، وهو ما تحتاجه فعليًا للتحوط من دفتر أمريكي.
نماذج Jump-Diffusion مع PINN

يضيف نموذج Merton قفزات Poisson إلى الحركة البراونية الهندسية:
حيث إن عملية Poisson مركبة بكثافة وأحجام قفزات log-normal. يصبح التسعير معادلة جزئية تفاضلية تكاملية (PIDE):
حيث كثافة مضاعف القفزة.
التكامل هو ما يكسر الفروق المحدودة — فهو يربط كل نقطة في المجال بكل نقطة أخرى ويدمر البنية ذات النطاق التي يعتمد عليها solver. لا تملك PINN هذه البنية كي تخسرها. التكامل مجرد حد آخر في الباقي، يُقيّم بالتربيع عند كل نقطة collocation، وبما أن الشبكة معرفة في كل مكان فإن هو forward pass مجاني وليس interpolation:
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 forward passes إضافية في كل خطوة تدريب، وكلها تدخل رسم autograd — السعر الحقيقي للقفزات هو الذاكرة، لا الرياضيات.
المقارنة مع الطرق التقليدية

الفروق البنيوية حقيقية ويمكن صياغتها دون benchmark:
| المعيار | الفروق المحدودة | Monte Carlo | PINN |
|---|---|---|---|
| شبكة مطلوبة | نعم (شبكة منظمة) | لا | لا (meshfree) |
| لعنة الأبعاد | شديدة (>3D غير عملية) | خفيفة (تقارب ) | خفيفة (قدرة الشبكة تتوسع) |
| Greeks | تقريب بالفروق المحدودة | مقدرات Pathwise/LR | دقيقة عبر autodiff |
| إعادة الاستخدام عبر المعاملات | يجب إعادة الحل | يجب إعادة المحاكاة | Parametric: تدريب مرة واحدة |
| الخيارات الأمريكية | SOR/PSOR على LCP | انحدار Longstaff-Schwartz | عقوبة أو حد حر |
| حدود الخطأ | نعم (رتبة المخطط) | نعم (CLT) | لا — خسارة تجريبية فقط |
صفوف الأداء التي تعيش عادة هنا — زمن التدريب، latency الاستدلال، الدقة — غائبة عمدًا، لأن قياسها هو العمل المفتوح وليس خانة في جدول.
أين قد تتفوق PINN بشكل معقول
إعادة التسعير في الوقت الحقيقي. بعد التدريب، التقييم forward pass على batch، لذلك يعاد تسعير دفتر كامل في kernel launch واحد بدل حل واحد لكل مجموعة معاملات. ما إذا كان هذا يتفوق على Crank-Nicolson مضبوط جيدًا عند أحجام دفاتر واقعية سؤال تجريبي لم يُقَس هنا.
النماذج عالية الأبعاد. التقلب العشوائي مع المعدلات العشوائية والقفزات يعني 4+ أبعاد، حيث تموت الفروق المحدودة عمليًا. تتدهور PINN تدريجيًا مع البعد، مع خضوعها لصعوبة التدريب.
Greeks مستمرة. الشبكة ملساء وقابلة للاشتقاق، لذا تأتي Delta وGamma وTheta وVega من machinery autograd نفسها الخاصة بباقي PDE — بلا bump-and-revalue وبلا ضجيج الفروق المحدودة. هذا أقوى ادعاء في المنشور، وهو أيضًا الأكثر احتياجًا إلى سطح Gamma مقاس خلفه.
حلول Parametric. إدخال معاملات النموذج (، ، ) كمدخلات للشبكة يسمح لـ PINN واحدة بتغطية عائلة نماذج بدل calibration واحدة.
أين تواجه PINN صعوبة
كلفة التدريب. لخيار واحد ومجموعة معاملات واحدة، ينتهي حل الفروق المحدودة قبل أن تنهي PINN أول ألف epoch.
لا حدود للخطأ. تصل الفروق المحدودة مع Richardson extrapolation إلى دقة الآلة برتبة تقارب معلومة. تعرض PINN قيمة loss، وهي ليست حدًا للخطأ. أما النسخ المدركة لعدم اليقين (Bai et al., 2025) فتضيف فواصل ثقة، لكن المجال حديث.
صعوبة التحسين. مشهد الخسارة غير محدب بشدة، والموازنة بين PDE والحدود والحد النهائي مسألة tuning. الفشل المميز هو شبكة تدفع باقي PDE إلى الصفر تقريبًا وتتجاهل شروط الحدود بالكامل — حل صحيح تمامًا للمسألة الخطأ.
قابلية إعادة الإنتاج. قد تصل البذور والتوزيعات المختلفة لنقاط collocation وإعدادات optimizer إلى حلول مختلفة بصورة ذات معنى. يساعد ensembling لكنه يضاعف التكلفة.
الجزآن الأخيران هما الأكثر استحقاقًا لتحويلهما إلى plots، لأنهما نمطا فشل سيصطدم بهما أي شخص يعيد تنفيذ هذا العمل.
ما يزال يحتاج إلى قياس

الحالة الصادقة للمقال: الصياغات صحيحة والكود يعمل، لكن لم يُقَس شيء هنا على عتاد هذا المكتب أو بياناته. المرور الذي سيجعله نتيجة بدل اشتقاق:
- Sup-norm وRMSE مقابل Black-Scholes المغلق عبر شبكة ، لكل seed، وخمس seeds. الهدف المتداول عادة هو اتفاق إلى 4+ منازل عشرية؛ النقطة هي اختبار ذلك عند و ونشر seeds التي يفشل فيها.
- خطأ Delta وGamma، لا خطأ السعر فقط. شبكة تطابق الأسعار إلى أربع خانات مع صاخب غير صالحة للتحوط، لذا Gamma هو معيار القبول.
- زمن التدريب wall-clock وlatency الاستدلال لكل خيار لدفتر من 10,000 خيار، مقابل Crank-Nicolson لنفس المسألة على GPU نفسه.
- أنماط الفشل معاد إنتاجها عمدًا. خفّض وزن خسارة الحدود حتى تحقق الشبكة PDE وتفشل في الحدود؛ شغّل خمس seeds وارسم الانتشار. كلاهما رخيص وأكثر فائدة من سطح سعر آخر يبدو صحيحًا.
- الملاءمة لأسعار Deribit BTC الحقيقية أو، على الأقل، الإبقاء على المعاملات الواقعية للعملات المشفرة أعلاه بدل العودة إلى و.
- خيارات architecture وoptimizer كنتائج لا نصائح. الأوسع مقابل الأعمق،
tanhمقابل ReLU (المشتقة الثانية غير المستمرة لـ ReLU ينبغي أن تفسد الباقي بوضوح)، ومسح ، وAdam-then-L-BFGS مقابل Adam وحده كلها تجارب من سطر واحد. حتى تُجرى، فهي folklore مكرر من الأدبيات، ويرفض هذا المنشور تكرارها كتوصيات.
الادعاءان البنيويان اللذان يصمدان دون قياس، لأنهما خصائص الصياغة لا نتيجة تشغيل: استخدام إحداثيات log-price (تصبح PDE ذات معاملات ثابتة، وهذه حقيقة جبرية)، وإعطاء الشرط النهائي وزنًا أكبر من حد PDE (تقبل PDE المتجانسة حل الصفر، وهذه حقيقة في المسألة).
ما الموجود أيضًا

اتجاهات تستحق المعرفة، لم يُختبر أي منها هنا:
- Residual-adaptive collocation sampling — ضع النقاط حيث يكون الباقي كبيرًا، قرب strike في Black-Scholes أو قرب Feller boundary في Heston، بدلًا من التوزيع المنتظم. التنفيذ قصير:
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 عبر strikes وmaturities — أجر fine-tune من مجاور بدل التدريب من الصفر لبناء مكتبة تغطي سلسلة الخيارات.
- Physics-Informed Extreme Learning Machines — جمّد hidden weights ودرّب output layer فقط، فتختزل التدريب إلى linear solve واحد. أقل تعبيرًا، لكن Black-Scholes منخفض الأبعاد بما يكفي لعل ذلك لا يهم.
- Operator learning (DeepONet, FNO) — تعلّم solution operator بدل الحل، مع mapping بحيث لا تحتاج بنى payoff الجديدة إلى إعادة تدريب. راجع DeepSVM.
الخلاصة

لا تستبدل PINN الفروق المحدودة أو Monte Carlo. لخيار واحد منخفض الأبعاد عند مجموعة معاملات واحدة، تفوز الفروق المحدودة والفارق ليس قريبًا. حالة PINN ضيقة ومحددة: نماذج عالية الأبعاد تموت فيها الشبكات، وحلول Parametric يعاد استخدامها عبر دفتر، وGreeks تأتي من pass autograd نفسه الذي يأتي منه السعر.
ما يقدمه هذا المنشور هو طبقة الترجمة — كيف تصبح مشتقة Heston المختلطة، والحد الحر الأمريكي، وتكامل قفزات Merton كل واحدة حدًا في دالة خسارة. وما لا يقدمه بعد هو دليل على أن الشبكات الناتجة دقيقة بما يكفي للتحوط بها. ذلك هو المرور التالي، وإلى أن يحدث، اعتبر كل ما سبق اشتقاقًا لا توصية.
المراجع والقراءة الإضافية
- 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.
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.