Multi Asset Valuation Models
from dx import *
import time
t0 = time.time()
There are the following multiple risk factor valuation classes available:
valuation_mcs_european_multi
valuation_mcs_american_multi
r = constant_short_rate('r', 0.06)
me1 = market_environment('me1', dt.datetime(2015, 1, 1))
me2 = market_environment('me2', dt.datetime(2015, 1, 1))
me1.add_constant('initial_value', 36.)
me1.add_constant('volatility', 0.1) # low vol
me1.add_constant('currency', 'EUR')
me1.add_constant('model', 'gbm')
me2.add_environment(me1)
me2.add_constant('initial_value', 36.)
me2.add_constant('volatility', 0.5) # high vol
underlyings = {'gbm1' : me1, 'gbm2' : me2}
correlations = [['gbm1', 'gbm2', 0.5]]
val_env = market_environment('val_env', dt.datetime(2015, 1, 1))
val_env.add_constant('starting_date', val_env.pricing_date)
val_env.add_constant('final_date', dt.datetime(2015, 12, 31))
val_env.add_constant('frequency', 'M')
val_env.add_constant('paths', 10000)
val_env.add_curve('discount_curve', r)
val_env.add_constant('maturity', dt.datetime(2015, 12, 31))
val_env.add_constant('currency', 'EUR')
# European maximum call option
payoff_func = "np.maximum(np.maximum(maturity_value['gbm1'], maturity_value['gbm2']) - 38, 0)"
vc = valuation_mcs_european_multi(
name='European maximum call',
val_env=val_env,
assets=underlyings,
correlations=correlations,
payoff_func=payoff_func)
vc.assets
vc.underlying_objects
vc.correlations
vc.correlation_matrix
vc.val_env.get_list('cholesky_matrix')
vc.generate_payoff()
vc.present_value()
vc.update('gbm1', initial_value=50.)
vc.present_value()
vc.update('gbm2', volatility=0.5)
vc.present_value()
vc.update('gbm1', initial_value=36., volatility=0.1)
vc.update('gbm2', initial_value=36., volatility=0.5)
vc.delta('gbm2', interval=0.5)
vc.vega('gbm1')
%%time
s_list = np.arange(28., 46.1, 2.)
pv = []; de = []; ve = []
for s in s_list:
vc.update('gbm1', initial_value=s)
pv.append(vc.present_value())
de.append(vc.delta('gbm1', .5))
ve.append(vc.vega('gbm1', 0.2))
vc.update('gbm1', initial_value=36.)
%matplotlib inline
from dx_plot import *
plot_option_stats(s_list, pv, de, ve)
%%time
s_list = np.arange(28., 46.1, 2.)
pv = []; de = []; ve = []
for s in s_list:
vc.update('gbm2', initial_value=s)
pv.append(vc.present_value())
de.append(vc.delta('gbm2', .5))
ve.append(vc.vega('gbm2', 0.2))
plot_option_stats(s_list, pv, de, ve)
correlations = [['gbm1', 'gbm2', -0.9]]
# European maximum call option
payoff_func = "np.maximum(np.maximum(maturity_value['gbm1'], maturity_value['gbm2']) - 38, 0)"
vc = valuation_mcs_european_multi(
name='European maximum call',
val_env=val_env,
assets=underlyings,
correlations=correlations,
payoff_func=payoff_func)
%%time
s_list = np.arange(28., 46.1, 2.)
pv = []; de = []; ve = []
for s in s_list:
vc.update('gbm1', initial_value=s)
pv.append(vc.present_value())
de.append(vc.delta('gbm1', .5))
ve.append(vc.vega('gbm1', 0.2))
vc.update('gbm1', initial_value=36.)
plot_option_stats(s_list, pv, de, ve)
%%time
s_list = np.arange(28., 46.1, 2.)
pv = []; de = []; ve = []
for s in s_list:
vc.update('gbm2', initial_value=s)
pv.append(vc.present_value())
de.append(vc.delta('gbm2', .5))
ve.append(vc.vega('gbm2', 0.2))
plot_option_stats(s_list, pv, de, ve)
correlations = [['gbm1', 'gbm2', 0.5]]
# European maximum call option
payoff_func = "np.maximum(np.maximum(maturity_value['gbm1'], maturity_value['gbm2']) - 38, 0)"
vc = valuation_mcs_european_multi(
name='European maximum call',
val_env=val_env,
assets=underlyings,
correlations=correlations,
payoff_func=payoff_func)
asset_1 = np.arange(28., 46.1, 2.)
asset_2 = asset_1
a_1, a_2 = np.meshgrid(asset_1, asset_2)
value = np.zeros_like(a_1)
%%time
for i in range(np.shape(value)[0]):
for j in range(np.shape(value)[1]):
vc.update('gbm1', initial_value=a_1[i, j])
vc.update('gbm2', initial_value=a_2[i, j])
value[i, j] = vc.present_value()
plot_greeks_3d([a_1, a_2, value], ['asset 1', 'asset 2', 'present value'])
delta_1 = np.zeros_like(a_1)
delta_2 = np.zeros_like(a_1)
%%time
for i in range(np.shape(delta_1)[0]):
for j in range(np.shape(delta_1)[1]):
vc.update('gbm1', initial_value=a_1[i, j])
vc.update('gbm2', initial_value=a_2[i, j])
delta_1[i, j] = vc.delta('gbm1')
delta_2[i, j] = vc.delta('gbm2')
plot_greeks_3d([a_1, a_2, delta_1], ['asset 1', 'asset 2', 'delta asset 1'])
plot_greeks_3d([a_1, a_2, delta_2], ['asset 1', 'asset 2', 'delta asset 2'])
vega_1 = np.zeros_like(a_1)
vega_2 = np.zeros_like(a_1)
for i in range(np.shape(vega_1)[0]):
for j in range(np.shape(vega_1)[1]):
vc.update('gbm1', initial_value=a_1[i, j])
vc.update('gbm2', initial_value=a_2[i, j])
vega_1[i, j] = vc.vega('gbm1')
vega_2[i, j] = vc.vega('gbm2')
plot_greeks_3d([a_1, a_2, vega_1], ['asset 1', 'asset 2', 'vega asset 1'])
plot_greeks_3d([a_1, a_2, vega_2], ['asset 1', 'asset 2', 'vega asset 2'])
# restore initial values
vc.update('gbm1', initial_value=36., volatility=0.1)
vc.update('gbm2', initial_value=36., volatility=0.5)
# American put payoff
payoff_am = "np.maximum(34 - np.minimum(instrument_values['gbm1'], instrument_values['gbm2']), 0)"
# American put option on minimum of two assets
vca = valuation_mcs_american_multi(
name='American minimum put',
val_env=val_env,
assets=underlyings,
correlations=correlations,
payoff_func=payoff_am)
vca.present_value()
asset_1 = np.arange(28., 44.1, 4.)
asset_2 = asset_1
a_1, a_2 = np.meshgrid(asset_1, asset_2)
value = np.zeros_like(a_1)
%%time
for i in range(np.shape(value)[0]):
for j in range(np.shape(value)[1]):
vca.update('gbm1', initial_value=a_1[i, j])
vca.update('gbm2', initial_value=a_2[i, j])
value[i, j] = vca.present_value()
plot_greeks_3d([a_1, a_2, value], ['asset 1', 'asset 2', 'present value'])
delta_1 = np.zeros_like(a_1)
delta_2 = np.zeros_like(a_1)
%%time
for i in range(np.shape(delta_1)[0]):
for j in range(np.shape(delta_1)[1]):
vca.update('gbm1', initial_value=a_1[i, j])
vca.update('gbm2', initial_value=a_2[i, j])
delta_1[i, j] = vca.delta('gbm1')
delta_2[i, j] = vca.delta('gbm2')
plot_greeks_3d([a_1, a_2, delta_1], ['asset 1', 'asset 2', 'delta asset 1'])
plot_greeks_3d([a_1, a_2, delta_2], ['asset 1', 'asset 2', 'delta asset 2'])
vega_1 = np.zeros_like(a_1)
vega_2 = np.zeros_like(a_1)
%%time
for i in range(np.shape(vega_1)[0]):
for j in range(np.shape(vega_1)[1]):
vca.update('gbm1', initial_value=a_1[i, j])
vca.update('gbm2', initial_value=a_2[i, j])
vega_1[i, j] = vca.vega('gbm1')
vega_2[i, j] = vca.vega('gbm2')
plot_greeks_3d([a_1, a_2, vega_1], ['asset 1', 'asset 2', 'vega asset 1'])
plot_greeks_3d([a_1, a_2, vega_2], ['asset 1', 'asset 2', 'vega asset 2'])
me3 = market_environment('me3', dt.datetime(2015, 1, 1))
me4 = market_environment('me4', dt.datetime(2015, 1, 1))
me3.add_environment(me1)
me4.add_environment(me1)
# for jump-diffusion
me3.add_constant('lambda', 0.5)
me3.add_constant('mu', -0.6)
me3.add_constant('delta', 0.1)
me3.add_constant('model', 'jd')
# for stoch vol jump model
me4.add_constant('kappa', 2.0)
me4.add_constant('theta', 0.3)
me4.add_constant('vol_vol', 0.2)
me4.add_constant('rho', -0.75)
me4.add_constant('lambda', 0.0)
me4.add_constant('mu', 0.0)
me4.add_constant('delta', 0.0)
me4.add_constant('model', 'svjd')
val_env.add_constant('paths', 10000)
underlyings = {'gbm1' : me1, 'gbm2' : me2, 'jd' : me3, 'sv' : me4}
correlations = [['gbm1', 'gbm2', 0.5], ['gbm2', 'jd', -0.5], ['gbm1', 'sv', 0.7]]
# European maximum call payoff
payoff_1 = "np.maximum(np.maximum(np.maximum(maturity_value['gbm1'], maturity_value['gbm2']),"
payoff_2 = " np.maximum(maturity_value['jd'], maturity_value['sv'])) - 40, 0)"
payoff = payoff_1 + payoff_2
payoff
vc = valuation_mcs_european_multi(
name='European maximum call',
val_env=val_env,
assets=underlyings,
correlations=correlations,
payoff_func=payoff)
vc.assets
vc.underlying_objects
vc.present_value()
vc.instrument_values
vc.correlation_matrix
vc.val_env.get_list('cholesky_matrix')
vc.delta('jd', interval=0.1)
vc.delta('sv')
vc.vega('jd')
vc.vega('sv')
delta_1 = np.zeros_like(a_1)
delta_2 = np.zeros_like(a_1)
%%time
for i in range(np.shape(delta_1)[0]):
for j in range(np.shape(delta_1)[1]):
vc.update('jd', initial_value=a_1[i, j])
vc.update('sv', initial_value=a_2[i, j])
delta_1[i, j] = vc.delta('jd')
delta_2[i, j] = vc.delta('sv')
plot_greeks_3d([a_1, a_2, delta_1], ['jump diffusion', 'stochastic vol', 'delta jd'])
plot_greeks_3d([a_1, a_2, delta_2], ['jump diffusion', 'stochastic vol', 'delta sv'])
vega_1 = np.zeros_like(a_1)
vega_2 = np.zeros_like(a_1)
%%time
for i in range(np.shape(vega_1)[0]):
for j in range(np.shape(vega_1)[1]):
vc.update('jd', initial_value=a_1[i, j])
vc.update('sv', initial_value=a_2[i, j])
vega_1[i, j] = vc.vega('jd')
vega_2[i, j] = vc.vega('sv')
plot_greeks_3d([a_1, a_2, vega_1], ['jump diffusion', 'stochastic vol', 'vega jd'])
plot_greeks_3d([a_1, a_2, vega_2], ['jump diffusion', 'stochastic vol', 'vega sv'])
# payoff of American maximum call option
payoff_am_1 = "np.maximum(np.maximum(np.maximum(instrument_values['gbm1'], instrument_values['gbm2']),"
payoff_am_2 = "np.maximum(instrument_values['jd'], instrument_values['sv'])) - 40, 0)"
payoff_am = payoff_am_1 + payoff_am_2
vca = valuation_mcs_american_multi(
name='American maximum call',
val_env=val_env,
assets=underlyings,
correlations=correlations,
payoff_func=payoff_am)
vc.present_value()
%time vca.present_value()
%time vca.delta('jd')
%time vca.delta('sv')
%time vca.vega('jd')
%time vca.vega('sv')
print "Duration for whole notebook %.2f in min" % ((time.time() - t0) / 60)