DX Analytics Library

Portfolio Valuation with Parallelization

In [1]:
import sys
sys.path.append('data/dx')
from dx_valuation import *
import time

Assets

In [2]:
# constant short rate
r = constant_short_rate('r', 0.06)
In [3]:
# market environment
me_gbm = market_environment('gbm', dt.datetime(2015, 1, 1))
In [4]:
# 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')
In [5]:
# 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))
In [6]:
# add valuation environment to market environments
me_gbm.add_environment(val_env)
In [7]:
underlyings = {'gbm' : me_gbm}

American Put Option

Modelling

In [8]:
# simulation model for underlying
gbm = geometric_brownian_motion('gbm_obj', me_gbm)
In [9]:
# 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)
In [10]:
# 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)')

Valuation

In [11]:
%time am_put.present_value()
CPU times: user 2.18 s, sys: 87 ms, total: 2.26 s
Wall time: 2.26 s

Out[11]:
4.404642

Large Portfolio

In [12]:
# 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)')

Sequential

In [13]:
# portfolio with sequential valuation
port_sequ = derivatives_portfolio('portfolio', positions, val_env,
                                  underlyings, correlations=None, parallel=False)
In [14]:
t0 = time.time()
res = port_sequ.get_values()
ts = time.time() - t0
print "Time in sec %.2f" % ts
Time in sec 197.33

Parallel

In [15]:
# portfolio with parallel valuation
port_para = derivatives_portfolio('portfolio', positions, val_env,
                                  underlyings, correlations=None, parallel=True)
In [16]:
t0 = time.time()
res = port_para.get_values()
tp = time.time() - t0
print "Time in sec %.2f" % tp
Time in sec 61.73

In [17]:
ts / tp
Out[17]:
3.196584566341355
In [18]:
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')
Out[18]:
<matplotlib.text.Text at 0x5641410>