def generate_cva_merton(Exposures, Z_M, rhos_merton, Q_default, name_saved_file=''): PD = Q_default(time_exposure) DiscountFactorXdefault = PD * discount_factor(time_exposure) @jit def calc_cva_merton(rho): result = zeros(Z_M.shape[0]) for k in range(0, len(Exposures)): for t in range_exposure: result[k] = result[k] + DiscountFactorXdefault[t] * \ sum(Exposures[k][t] * Merton(Z_M[k][t], rho, PD[t], tolerance=0.001)) return result # it is faster with jit (but just a little bit) # def calc_cva_merton0(rho, Z_M=Z_M): # weightsMerton = [[Merton(Z_M[k][t], rho, PD[t], tolerance=0.001) # for t in range_exposure] for k in range_portfolio] # resultsDWR = array([[sum(Z_M[k][t] * weightsMerton[k][t]) for t in range_exposure] for k in range_portfolio]) # return [sum(resultsDWR[k, :] * DiscountFactorXdefault) for k in range_portfolio] @jit def curve_cva(rhos): L = empty((len(rhos), Z_M.shape[0])) for r in range(0, len(rhos)): L[r, :] = calc_cva_merton(rhos[r]) return L cva = curve_cva(rhos_merton) if name_saved_file != '': save_array(name_saved_file, cva) return array(cva)
def generate_cva_indep(Exposures, Q_default, name_saved_file='', n_jobs=4): PD = Q_default(time_exposure) DiscountFactorXdefault = PD * discount_factor(time_exposure) ################### ### Compute cva ################### resultsDWR = mean(Exposures, axis=2) cva = Parallel(n_jobs=n_jobs, backend="threading")( delayed(sum)(resultsDWR[k, :] * DiscountFactorXdefault) for k in range(0, len(Exposures))) # cva = [sum(resultsDWR[k, :] * DiscountFactorXdefault) for k in range(0, len(Exposures))] if name_saved_file != '': save_array(name_saved_file, cva) return array(cva)
def generate_cva_twofactors_hull(Exposures, Z_M1, Z_M2, bs1, bs2, Q_default, name_saved_file='', max_iter=100000, tol=1e-3, n_jobs=4): # cva = [Parallel(n_jobs=n_jobs, backend="threading")(delayed(generate_cva_generalized_hull) # (Exposures, b1 * Z_M1 + b2 * Z_M2, Q_default, max_iter=max_iter, # tol=tol, threading=False) # for b2 in bs2) # for b1 in bs1] cva = Parallel(n_jobs=n_jobs, backend="threading")(delayed(_partial_cva_twofactors_hull) (Exposures, Z_M1, Z_M2, b1, bs2, Q_default, name_saved_file='', max_iter=100000, tol=1e-3) for b1 in bs1) # cva = [[generate_cva_generalized_hull(Exposures, b1 * Z_M1 + b2 * Z_M2,Q_default, max_iter=max_iter, tol=tol) # for b2 in bs2] for b1 in bs1] if name_saved_file != '': save_array(name_saved_file, cva) return array(cva)
def generate_cvas(model): ############################ ### Independent ############################ if model == 1: generate_cva_indep(Exposures=exposures['exposures'], Q_default=Q_default, name_saved_file='cva_indep') generate_cva_twofactors_hull(Exposures=exposures['exposures'], Z_M1=market_factor['Z_S'], bs1=bS, Z_M2=market_factor['Z_V'], bs2=bV, Q_default=Q_default, name_saved_file='cva_hull', max_iter=100000, tol=1e-3) if model == 2: cva_indep_shift_S_pos = generate_cva_indep(Exposures=exposures['exposures_shift_S_pos'], Q_default=Q_default) cva_indep_shift_S_neg = generate_cva_indep(Exposures=exposures['exposures_shift_S_neg'], Q_default=Q_default) delta_S_cva_indep = (cva_indep_shift_S_pos - cva_indep_shift_S_neg) / (2 * shift_S) save_array('delta_S_cva_indep', delta_S_cva_indep) if model == 3: cva_indep_shift_intensity_pos = generate_cva_indep(Exposures=exposures['exposures'], Q_default=Q_default_shift_pos) cva_indep_shift_intensity_neg = generate_cva_indep(Exposures=exposures['exposures'], Q_default=Q_default_shift_neg) delta_intensity_cva_indep = (cva_indep_shift_intensity_pos - cva_indep_shift_intensity_neg) / ( 2 * shift_intensity) save_array('delta_intensity_cva_indep', delta_intensity_cva_indep) # delta_S if model == 4: cva_hull_shift_S_pos = generate_cva_twofactors_hull(Exposures=exposures['exposures_shift_S_pos'], Z_M1=market_factor['Z_S_shift_S_pos'], bs1=bS, Z_M2=market_factor['Z_V_shift_S_pos'], bs2=bV, Q_default=Q_default, max_iter=100000, tol=1e-3) cva_hull_shift_S_neg = generate_cva_twofactors_hull(Exposures=exposures['exposures_shift_S_neg'], Z_M1=market_factor['Z_S_shift_S_neg'], bs1=bS, Z_M2=market_factor['Z_V_shift_S_neg'], bs2=bV, Q_default=Q_default, max_iter=100000, tol=1e-3) delta_S_cva_hull = (cva_hull_shift_S_pos - cva_hull_shift_S_neg) / (2 * shift_S) save_array('delta_S_cva_hull', delta_S_cva_hull) # delta_intensity if model == 5: cva_hull_shift_intensity_pos = generate_cva_twofactors_hull(Exposures=exposures['exposures'], Z_M1=market_factor['Z_S'], bs1=bS, Z_M2=market_factor['Z_V'], bs2=bV, Q_default=Q_default_shift_pos, max_iter=100000, tol=1e-3) cva_hull_shift_intensity_neg = generate_cva_twofactors_hull(Exposures=exposures['exposures'], Z_M1=market_factor['Z_S'], bs1=bS, Z_M2=market_factor['Z_V'], bs2=bV, Q_default=Q_default_shift_neg, max_iter=100000, tol=1e-3) delta_intensity_cva_hull = (cva_hull_shift_intensity_pos - cva_hull_shift_intensity_neg) / (2 * shift_intensity) save_array('delta_intensity_cva_hull', delta_intensity_cva_hull)
def generate_cva_hull(Exposures, Z_M, bs_hull, Q_default, name_saved_file='', max_iter=100000, tol=1e-3): cva = [generate_cva_generalized_hull(Exposures, b * Z_M, Q_default, max_iter=max_iter, tol=tol, threading=True) for b in bs_hull] if name_saved_file != '': save_array(name_saved_file, cva) return array(cva)
def launch_simulation(S_ini=S0, delta_ini=delta0, shift_str=''): ################### ### Initialize ################### model = load_model() book, time_exposure, timeline, contract_names = portfolio() index_exposure = [list(timeline).index(t) for t in time_exposure] range_exposure = range(0, len(time_exposure)) range_book = range(0, len(contract_names)) range_timeline = range(0, len(timeline)) ################### ### Simulation ################### # market sensitivities simulated_paths = simulate_path(timeline, S_ini=S_ini, delta_ini=delta_ini, reset_seed=True) S = simulated_paths[0] convenience_yield = simulated_paths[1] ################### ### Portfolio ################### contracts_alltimes = array([[ instrument(timeline[t], S[t, :], convenience_yield[t, :]) for t in range_timeline ] for instrument in book]) contract_ini = array( [instrument(0, S_ini, delta_ini) for instrument in book]) contracts = contracts_alltimes[:, index_exposure, :] ################### ### Exposure ################### exposure_alltimes = exposure_function(contracts_alltimes) exposures = exposure_alltimes[:, index_exposure, :] ################### ### Market Factor for hull() ################### Z_S = S / S_ini Z_V = array( [contracts_alltimes[k] / abs(contract_ini[k]) for k in range_book]) Z_E = array( [exposure_alltimes[k] / abs(contract_ini[k]) for k in range_book]) save_array('spot_prices' + shift_str, S) save_array('convenience_yields' + shift_str, convenience_yield) save_array('contracts' + shift_str, contracts) save_array('exposures' + shift_str, exposures) # save_array('contracts_alltimes'+shift_str, contracts_alltimes) # save_array('exposures_alltimes'+shift_str, exposure_alltimes) save_array('Z_S' + shift_str, Z_S) save_array('Z_V' + shift_str, Z_V) save_array('Z_E' + shift_str, Z_E) save_array('timeline', timeline) save_array('time_exposure', time_exposure) save_array('contract_names', contract_names)