mirror of
https://github.com/Mihirkansara/nexus-quant-terminal.git
synced 2026-08-12 18:18:05 +00:00
34 lines
1.3 KiB
Python
34 lines
1.3 KiB
Python
"""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(),
|
|||
|
|
}
|