def price_fd(swaption_pricer, loca_vola, swaption): expiry = swaption.expiry initial_curve = swaption_pricer.swap_pricer.initial_curve kappa = swaption_pricer.swap_pricer.kappa x_min, x_max = calculate_x_boundaries3(expiry, kappa, loca_vola, alpha=4) y_min, y_max = calculate_u_boundaries(expiry, kappa, loca_vola, alpha=4) mesher = Mesher2d() mesher.create_mesher_2d(0, expiry, 200, x_min, x_max, 400, y_min, y_max, 40) adi_runner = AdiRunner(1 / 2, kappa, initial_curve, loca_vola, mesher) swaption_t0 = pd.DataFrame(adi_runner.run_adi(swaption, swaption_pricer)) swaption_t0_x0_y0 = extract_x0_result(swaption_t0.values, mesher.xgrid, mesher.ugrid) implied_black_vola = find_implied_black_vola( swaption_t0_x0_y0, swaption, swaption_pricer.swap_pricer, swaption_pricer.swap_pricer.bond_pricer) return implied_black_vola
def lognormalimpliedvola(swaption: Swaption, swap_pricer: SwapPricer, lambda_s_bar, b_bar): black76price = Black76Pricer(lambda_s_bar, b_bar, swap_pricer, swap_pricer.bond_pricer) swaption_value = black76price.black76_price(swaption) black_implied_vola = find_implied_black_vola(swaption_value, swaption, swap_pricer, swap_pricer.bond_pricer) return swaption_value, black_implied_vola
def test_adi_swaption2(): swaption_expiry = 5 swaption_maturity = 10 freq = 0.5 rate = 0.06 initial_curve = get_mock_yield_curve_const(rate=rate) kappa = 0.3 swap_pricer = SwapPricer(initial_curve, kappa) swap = Swap(swaption_expiry, swaption_maturity, freq) swaption_pricer = SwaptionPricer(swap_pricer) coupon = swap_pricer.price(swap, 0, 0, 0) swaption = Swaption(swaption_expiry, coupon, swap) local_volatility = LinearLocalVolatility.from_const(30, 0.5, 0.1, 0.2) #local_volatility = LinearLocalVolatility.from_const(30, 0.1, 0.1, 0.1) t_min = 0 t_max = swaption_expiry t_grid_size = 100 x_grid_size = 401 y_grid_size = 20 x_min, x_max = calculate_x_boundaries2(t_max, local_volatility, alpha=3) y_min, y_max = calculate_u_boundaries(t_max, kappa, local_volatility, alpha=3) mesher = Mesher2d() mesher.create_mesher_2d(t_min, t_max, t_grid_size, x_min, x_max, x_grid_size, y_min, y_max, y_grid_size) theta = 0.5 adi_runner = AdiRunner(theta, kappa, initial_curve, local_volatility, mesher) swaption_value0 = adi_runner.run_adi(swaption, swaption_pricer) x0 = extract_x0_result(swaption_value0, mesher.xgrid, mesher.ugrid) implied_vola = find_implied_black_vola(x0, swaption, swap_pricer, swap_pricer.bond_pricer) print("Swaption value at 0: ", x0, implied_vola)
def calculate_swaption_approx_price(swaption: Swaption, swap_pricer: SwapPricer, lambda_square, b_s): lambda_s_bar, b_bar = calculate_vola_skew(swaption.expiry, lambda_square, b_s) black76price = Black76Pricer(lambda_s_bar, b_bar, swap_pricer, swap_pricer.bond_pricer) swaption_value = black76price.black76_price(swaption) black_implied_vola = find_implied_black_vola(swaption_value, swaption, swap_pricer, swap_pricer.bond_pricer) return swaption_value, black_implied_vola
def test_implied_black_vola(): kappa = 0.3 swap = Swap(5, 8, 0.5) initial_curve = LiborCurve.from_constant_rate(0.06) bond_pricer = BondPricer(initial_curve, kappa=kappa) swap_pricer = SwapPricer(initial_curve, kappa=kappa) coupon = 0.062 swaption = Swaption(expiry=5, coupon=coupon, swap=swap) swaption_pricer = Black76Pricer(lambda_s=0.2, b_s=1, swap_pricer=swap_pricer, bond_pricer=bond_pricer) swaption_value = swaption_pricer.black76_price(swaption) implied_vola = find_implied_black_vola(swaption_value, swaption, swap_pricer, bond_pricer) np.testing.assert_approx_equal(implied_vola, 0.2, significant=4)
def mc_swaption_report(): output_path = os.path.join(output_data_raw_monte_carlo, date_timestamp) output_file = os.path.join(output_path, "swaption_price_mc.hdf") file_path = get_nonexistant_path(output_file) #random_number_generator_type = "sobol" random_number_generator_type = "normal" curve_rate = 0.06 kappa_grid = [0.03] initial_curve = get_mock_yield_curve_const(rate=curve_rate) vola_parameters = [(i, curve_rate, j) for i in [0.05, 0.2, 0.4, 0.5] for j in [0.05, 0.1, 0.3, 0.7]] vola_parameters = [(i, curve_rate, j) for i in [0.4] for j in [0.3]] vola_grid_df = pd.DataFrame(vola_parameters, columns=["lambda", "alpha", "beta"]) coupon_grid = [0, +0.0025, -0.0025, +0.005, -0.005, +0.01, -0.01, 0.015, -0.015, 0.02, -0.02, 0.025, -0.025] #vola_grid_df = vola_grid_df.iloc[[10]] number_paths = np.power(2, 15) number_time_steps = np.power(2, 11) swap_ls = [(1, 6), (5, 10), (10, 20), (20, 30), (25, 30)] swap_ls = [(5, 10), (10, 20), (20, 30)] swap_ls = [(5, 10)] #swap_ls = [(1, 11)] for number_paths in [np.power(2,12), np.power(2, 13), np.power(2, 14), np.power(2, 15), np.power(2, 16), np.power(2, 17)]: for swap_exp_mat in swap_ls: print("swap: ", swap_exp_mat) expiry, maturity = swap_exp_mat for kappa in kappa_grid: swap_pricer = SwapPricer(initial_curve, kappa) swaption_pricer = SwaptionPricer(swap_pricer) swap = Swap(expiry, maturity, 0.5) atm_swap_price = swap_pricer.price(swap, 0, 0, 0) strike_grid = [atm_swap_price+coupon for coupon in coupon_grid] for index, vola_grid_row in vola_grid_df.iterrows(): loca_vola = LinearLocalVolatility.from_const(maturity, vola_grid_row["lambda"], vola_grid_row["alpha"], vola_grid_row["beta"]) bond_measure = swap.bond_T0 process_simulator = ProcessSimulatorTerminalMeasure(number_paths, number_time_steps, expiry / number_time_steps, random_number_generator_type, bond_measure, swap_pricer.bond_pricer, nr_processes=6, n_scrambles=64) result_obj = process_simulator.simulate_xy(kappa, loca_vola, parallel_simulation=True) for strike in strike_grid: swaption = Swaption(expiry, strike, swap) swaption_value_paths = monte_carlo_pricer_terminal_measure(result_obj, swaption, swaption_pricer) last_mc_time = result_obj.time_grid[-1] # swaption_value_paths_cv = apply_control_variate(last_mc_time, result_obj.x[:,-1], result_obj.y[:,-1], # swaption_value_paths, swap.bond_TN, swap_pricer.bond_pricer, swap_pricer.initial_curve) swaption_value_paths_cv2 = apply_control_variate_annuity(last_mc_time, result_obj.x[:, -1], result_obj.y[:, -1], swaption_value_paths, swap.annuity, swap_pricer.annuity_pricer, swap_pricer.annuity_pricer.bond_pricer.initial_curve) swaption_value_mean = swaption_value_paths.mean() std, swaption_value_error = result_obj.calculate_std_error(swaption_value_paths, result_obj.n_scrambles) # swaption_value_mean_cv = swaption_value_paths_cv.mean() # std, swaption_value_error_cv = result_obj.calculate_std_error(swaption_value_paths_cv, result_obj.n_scrambles) swaption_value_mean_cv = swaption_value_paths_cv2.mean() std, swaption_value_error_cv = result_obj.calculate_std_error(swaption_value_paths_cv2, result_obj.n_scrambles) bond_pricer = swap_pricer.bond_pricer output_data = {"number_paths": number_paths, "number_time_steps": number_time_steps, "random_number_generator_type": random_number_generator_type, "expiry": expiry, "maturity": maturity, "strike": strike, "atm strike": atm_swap_price, "moneyness": strike-atm_swap_price, "vola_lambda": vola_grid_row["lambda"], "vola_alpha": vola_grid_row["alpha"], "vola_beta": vola_grid_row["beta"], "curve_rate": curve_rate, "kappa": kappa, "swaption value": swaption_value_mean, "swaption value error": swaption_value_error, "swaption value cv": swaption_value_mean_cv, "swaption value error cv": swaption_value_error_cv, "implied_vola": find_implied_black_vola(swaption_value_mean, swaption, swap_pricer, bond_pricer), "implied_vola_max": find_implied_black_vola(swaption_value_mean+swaption_value_error, swaption, swap_pricer, bond_pricer), "implied_vola_min": find_implied_black_vola(swaption_value_mean-swaption_value_error, swaption, swap_pricer, bond_pricer), "implied_vola_cv": find_implied_black_vola(swaption_value_mean_cv, swaption, swap_pricer, bond_pricer), "implied_vola_cv_max": find_implied_black_vola(swaption_value_mean_cv + swaption_value_error_cv, swaption, swap_pricer, bond_pricer), "implied_vola_cv_min": find_implied_black_vola(swaption_value_mean_cv - swaption_value_error_cv, swaption, swap_pricer, bond_pricer)} output_df_new = pd.DataFrame(output_data, index=[0]) try: ouput_df_old = pd.read_hdf(file_path, key="output_data") except: ouput_df_old = pd.DataFrame() output_df_new = pd.concat([ouput_df_old, output_df_new]) output_df_new.to_hdf(file_path, key="output_data", complevel=9)
def adi_swaption_report(): output_path = os.path.join(output_data_raw_finite_difference, date_timestamp) curve_rate = 0.06 kappa_grid = [0.03] theta = 1/2 initial_curve = get_mock_yield_curve_const(rate=curve_rate) finite_difference_parameter = [(100, 150, 10), (400, 800, 60)] finite_difference_parameter = [(150, 200, 80)] #finite_difference_parameter = [(400, 800, 60)] #finite_difference_parameter = [(800, 1000, 100)] finite_difference_parameter = [(50, 100, 10), (100, 150, 20), (150, 200, 40), (200, 300, 60), (300, 400, 80)] finite_difference_parameter = [(400, 600, 100)] #finite_difference_parameter = [(600, 800, 120)] #finite_difference_parameter = [(100, 150, 20), (150, 200, 40), (300, 400, 80), (400, 600, 100)] #finite_difference_parameter = [ (400, 600, 100)] finite_difference_parameter = [(100, 150, 20), (150, 200, 40), (300, 400, 80), (400, 600, 100)] #finite_difference_parameter = [ (400, 600, 100)] finite_difference_parameter = [(300, 400, 80)] #finite_difference_parameter = [(150, 200, 40)] finite_difference_grid_df = pd.DataFrame(finite_difference_parameter, columns=["t_grid_size", "x_grid_size", "y_grid_size"]) output_path = get_nonexistant_path(output_path) vola_parameters = [(i, curve_rate, j) for i in [0.6, 0.8] for j in [0.05, 0.2]] vola_grid_df = pd.DataFrame(vola_parameters, columns=["lambda", "alpha", "beta"]) #coupon_grid = [0, +0.0025, -0.0025, +0.005, -0.005, +0.01, -0.01, 0.015, -0.015, 0.02, -0.02, 0.025, -0.025] #swap_ls = [(1, 6), (5, 10), (10, 20), (20, 30), (25, 30)] #swap_ls = [(1,6), (5, 10), (10,20)] swap_ls = [(20, 21)] coupon_grid = [0, +0.005, -0.005, +0.01, -0.01, 0.015, -0.015] #coupon_grid = [0] #coupon_grid = [0] #swap_ls = [(5, 10)] #finite_difference_grid_df = finite_difference_grid_df[:-1] vola_grid_df = vola_grid_df.iloc[[0, 3]] for swap_exp_mat in swap_ls: expiry, maturity = swap_exp_mat for kappa in kappa_grid: swap_pricer = SwapPricer(initial_curve, kappa) swaption_pricer = SwaptionPricer(swap_pricer) swap = Swap(expiry, maturity, 0.5) atm_swap_price = swap_pricer.price(swap, 0, 0, 0) strike_grid = [atm_swap_price+coupon for coupon in coupon_grid] #strike_grid = [0.01, 0.015, 0.02, 0.025, 0.03] for strike in strike_grid: swaption = Swaption(expiry, strike, swap) for index, vola_grid_row in vola_grid_df.iterrows(): loca_vola = LinearLocalVolatility.from_const(maturity, vola_grid_row["lambda"], vola_grid_row["alpha"], vola_grid_row["beta"]) for index, finite_difference_grid_row in finite_difference_grid_df.iterrows(): x_grid_size = finite_difference_grid_row["x_grid_size"] y_grid_size = finite_difference_grid_row["y_grid_size"] t_grid_size = finite_difference_grid_row["t_grid_size"] t_min = 0 t_max = expiry x_min, x_max = calculate_x_boundaries2(t_max, loca_vola, alpha=3) x_min, x_max = calculate_x_boundaries3(expiry, kappa, loca_vola, alpha=4) y_min, y_max = calculate_u_boundaries(t_max, kappa, loca_vola, alpha=4) mesher = Mesher2d() mesher.create_mesher_2d(t_min, t_max, t_grid_size, x_min, x_max, x_grid_size, y_min, y_max, y_grid_size) adi_runner = AdiRunner(theta, kappa, initial_curve, loca_vola, mesher) swaption_t0 = pd.DataFrame(adi_runner.run_adi(swaption, swaption_pricer)) output_file = os.path.join(output_path, "swaption_price_fd.hdf") file_path = get_nonexistant_path(output_file) swaption_t0_x0_y0 = extract_x0_result(swaption_t0.values, mesher.xgrid, mesher.ugrid) implied_black_vola = find_implied_black_vola(swaption_t0_x0_y0, swaption, swap_pricer, swap_pricer.bond_pricer) meta_data = {"expiry": expiry, "maturity": maturity, "strike": strike, "atm strike": atm_swap_price, "moneyness": strike - atm_swap_price, "x_grid_size": int(x_grid_size), "y_grid_size": int(y_grid_size), "t_grid_size": int(t_grid_size), "vola_lambda": vola_grid_row["lambda"], "vola_alpha": vola_grid_row["alpha"], "vola_beta": vola_grid_row["beta"], "curve_rate": curve_rate, "kappa": kappa, "swaption_value": swaption_t0_x0_y0, "implied_black_vola": implied_black_vola} meta_data = pd.DataFrame(meta_data, index=[0]) swaption_t0.to_hdf(file_path, key="data", complevel=5) meta_data.to_hdf(file_path, key="metadata", complevel=5) print(meta_data) pd.DataFrame(mesher.xmesh).to_hdf(file_path, key='xmesh', complevel=5) pd.DataFrame(mesher.umesh).to_hdf(file_path, key='ymesh', complevel=5) pd.DataFrame(mesher.xgrid).to_hdf(file_path, key='xgrid', complevel=5) pd.DataFrame(mesher.ugrid).to_hdf(file_path, key='ygrid', complevel=5)