working cva computation using quantlib

This commit is contained in:
local
2026-02-08 13:40:35 +00:00
parent d484f9c236
commit 8b5eb8797f
6 changed files with 1337 additions and 0 deletions

View File

@@ -0,0 +1,66 @@
import QuantLib as ql
def build_calibrated_hw(
curve_handle,
swaption_helpers,
a_init=0.05,
sigma_init=0.01
):
hw = ql.HullWhite(curve_handle, a_init, sigma_init)
optimizer = ql.LevenbergMarquardt()
end_criteria = ql.EndCriteria(1000, 500, 1e-8, 1e-8, 1e-8)
hw.calibrate(swaption_helpers, optimizer, end_criteria)
return hw
import numpy as np
def simulate_hw_state(
hw: ql.HullWhite,
curve_handle,
time_grid,
n_paths,
seed=42
):
a, sigma = hw.params()
dt = np.diff(time_grid)
n_steps = len(time_grid)
np.random.seed(seed)
x = np.zeros((n_paths, n_steps))
for i in range(1, n_steps):
decay = np.exp(-a * dt[i-1])
vol = sigma * np.sqrt((1 - np.exp(-2 * a * dt[i-1])) / (2 * a))
z = np.random.normal(size=n_paths)
x[:, i] = x[:, i-1] * decay + vol * z
return x
def swap_npv_from_state(
swap,
hw,
curve_handle,
t,
x_t,
today
):
ql.Settings.instance().evaluationDate = today + int(t * 365)
hw.setState(x_t)
engine = ql.DiscountingSwapEngine(
curve_handle,
False,
hw
)
swap.setPricingEngine(engine)
return swap.NPV()