83 lines
1.8 KiB
Python
83 lines
1.8 KiB
Python
|
|
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() |