working cva computation using quantlib
This commit is contained in:
83
python/cvatesting/driver.py
Normal file
83
python/cvatesting/driver.py
Normal file
@@ -0,0 +1,83 @@
|
||||
|
||||
import numpy as np
|
||||
import Quantlib as ql
|
||||
|
||||
from hullwhite import (build_calibrated_hw,simulate_hw_state,swap_npv_from_state)
|
||||
from instruments import (make_vanilla_swap,make_swaption_helpers)
|
||||
|
||||
today = ql.Date(15, 1, 2025)
|
||||
ql.Settings.instance().evaluationDate = today
|
||||
calendar = ql.TARGET()
|
||||
day_count = ql.Actual365Fixed()
|
||||
|
||||
|
||||
def expected_exposure(
|
||||
swap,
|
||||
hw,
|
||||
curve_handle,
|
||||
today,
|
||||
time_grid,
|
||||
x_paths
|
||||
):
|
||||
ee = np.zeros(len(time_grid))
|
||||
|
||||
for j, t in enumerate(time_grid):
|
||||
values = []
|
||||
|
||||
for i in range(len(x_paths)):
|
||||
v = swap_npv_from_state(
|
||||
swap, hw, curve_handle, t, x_paths[i, j], today
|
||||
)
|
||||
values.append(max(v, 0.0))
|
||||
|
||||
ee[j] = np.mean(values)
|
||||
|
||||
return ee
|
||||
|
||||
def main():
|
||||
# Time grid
|
||||
time_grid = np.linspace(0, 10, 121)
|
||||
|
||||
flat_rate = 0.02
|
||||
curve = ql.FlatForward(today, flat_rate, day_count)
|
||||
curve_handle = ql.YieldTermStructureHandle(curve)
|
||||
|
||||
#creat and calibrate HW
|
||||
a_init = 0.05
|
||||
sigma_init = 0.01
|
||||
hw = ql.HullWhite(curve_handle, a_init, sigma_init)
|
||||
|
||||
index = ql.Euribor6M(curve_handle)
|
||||
helpers=make_swaption_helpers(curve_handle,index,hw)
|
||||
optimizer = ql.LevenbergMarquardt()
|
||||
end_criteria = ql.EndCriteria(1000, 500, 1e-8, 1e-8, 1e-8)
|
||||
hw.calibrate(helpers, optimizer, end_criteria)
|
||||
|
||||
a, sigma = hw.params()
|
||||
print(f"Calibrated a = {a:.4f}")
|
||||
print(f"Calibrated sigma = {sigma:.4f}")
|
||||
|
||||
|
||||
|
||||
# Simulate model
|
||||
x_paths = simulate_hw_state(
|
||||
hw, curve_handle, time_grid, n_paths=10000
|
||||
)
|
||||
|
||||
# Swap
|
||||
swap = make_receiver_swap(
|
||||
today, curve_handle, maturity_years=10, fixed_rate=0.025
|
||||
)
|
||||
|
||||
# Exposure
|
||||
ee = expected_exposure(
|
||||
swap, hw, curve_handle, today, time_grid, x_paths
|
||||
)
|
||||
|
||||
|
||||
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ =='__main__':
|
||||
main()
|
||||
Reference in New Issue
Block a user