Portfolio Valuation with Parallelization
import sys
sys.path.append('data/dx')
from dx_valuation import *
import time
# constant short rate
r = constant_short_rate('r', 0.06)
# market environment
me_gbm = market_environment('gbm', dt.datetime(2015, 1, 1))
# geometric Brownian motion
me_gbm.add_constant('initial_value', 36.)
me_gbm.add_constant('volatility', 0.2)
me_gbm.add_constant('currency', 'EUR')
me_gbm.add_constant('model', 'gbm')
# valuation environment
val_env = market_environment('val_env', dt.datetime(2015, 1, 1))
val_env.add_constant('paths', 100000)
# 100,000 paths
val_env.add_constant('frequency', 'W')
# weekly frequency
val_env.add_curve('discount_curve', r)
val_env.add_constant('starting_date', dt.datetime(2015, 1, 1))
val_env.add_constant('final_date', dt.datetime(2015, 12, 31))
# add valuation environment to market environments
me_gbm.add_environment(val_env)
underlyings = {'gbm' : me_gbm}
# simulation model for underlying
gbm = geometric_brownian_motion('gbm_obj', me_gbm)
# market environment for American put option
me_put = market_environment('put', dt.datetime(2015, 1, 1))
me_put.add_constant('maturity', dt.datetime(2015, 12, 31))
me_put.add_constant('strike', 40.)
me_put.add_constant('currency', 'EUR')
me_put.add_environment(val_env)
# valuation model/object for American put option
am_put = valuation_mcs_american_single('am_put', mar_env=me_put, underlying=gbm,
payoff_func='np.maximum(strike - instrument_values, 0)')
%time am_put.present_value()
# define 100 options positions
positions = {}
for i in range(100):
positions[i] = derivatives_position('am_put_pos', 2, ['gbm'], me_put,
'American single', 'np.maximum(40 - instrument_values, 0)')
# portfolio with sequential valuation
port_sequ = derivatives_portfolio('portfolio', positions, val_env,
underlyings, correlations=None, parallel=False)
t0 = time.time()
res = port_sequ.get_values()
ts = time.time() - t0
print "Time in sec %.2f" % ts
# portfolio with parallel valuation
port_para = derivatives_portfolio('portfolio', positions, val_env,
underlyings, correlations=None, parallel=True)
t0 = time.time()
res = port_para.get_values()
tp = time.time() - t0
print "Time in sec %.2f" % tp
ts / tp
import matplotlib.pyplot as plt
%matplotlib inline
wi = 0.4
plt.bar((1.5 - wi/2, 2.5 - wi/2), (ts/ts, tp/ts), width=wi)
plt.xticks((1.5, 2.5), ('sequential', 'parallel'))
plt.grid(True), plt.ylim(0, 1.1), plt.xlim(0.75, 3.25)
plt.ylabel('relative performance (lower = better)')
plt.title('DX Analytics Portfolio Valuation')