Files
nexus-quant-terminal/backend/app/core/surface.py
T

34 lines
1.3 KiB
Python
Raw Normal View History

"""surface.py — 2-D risk surface computation over spot × vol grid."""
import numpy as np
from .greeks import portfolio_greeks
from .garman_kohlhagen import gk_price
def compute_surfaces(options, S_range, sigma_range, T, r_d, r_f):
"""Compute Delta, Gamma, Vega, Theta, and P&L surfaces."""
n_s, n_v = len(S_range), len(sigma_range)
D = np.zeros((n_s, n_v)); G = np.zeros((n_s, n_v))
V = np.zeros((n_s, n_v)); Th = np.zeros((n_s, n_v))
for i, S in enumerate(S_range):
for j, sigma in enumerate(sigma_range):
g = portfolio_greeks(options, S, sigma, T, r_d, r_f)["total"]
D[i,j]=g["delta"]; G[i,j]=g["gamma"]
V[i,j]=g["vega"]; Th[i,j]=g["theta"]
# P&L via Delta-Gamma approx around grid midpoint
S0 = S_range[len(S_range)//2]
sig0 = sigma_range[len(sigma_range)//2]
base = portfolio_greeks(options, S0, sig0, T, r_d, r_f)["total"]
PnL = np.zeros((n_s, n_v))
for i, S in enumerate(S_range):
dS = S - S0
PnL[i,:] = base["delta"]*dS + 0.5*base["gamma"]*dS**2
return {
"S_range": S_range.tolist(), "sigma_range": sigma_range.tolist(),
"delta": D.tolist(), "gamma": G.tolist(),
"vega": V.tolist(), "theta": Th.tolist(), "pnl": PnL.tolist(),
}