The Python Quants

DX Analytics Library

Portfolio with Parallel Simulation and Valuation

In [1]:
from dx import *

Asset

In [2]:
# constant short rate
r = constant_short_rate('r', 0.02)
In [3]:
# market environments
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', 25000)
val_env.add_constant('frequency', 'M')
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}

Derivative

In [8]:
gbm = geometric_brownian_motion('gbm_obj', me_gbm)
In [9]:
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]:
am_put = valuation_mcs_american_single('am_put', mar_env=me_put, underlying=gbm,
                       payoff_func='np.maximum(strike - instrument_values, 0)')

Large Portfolio

In [11]:
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 [12]:
port_sequ = derivatives_portfolio('portfolio', positions, val_env,
                                  underlyings, correlations=None, parallel=False)
In [13]:
%time res = port_sequ.get_values()
CPU times: user 8.69 s, sys: 296 ms, total: 8.99 s
Wall time: 9.01 s

Parallel

In [14]:
port_para = derivatives_portfolio('portfolio', positions, val_env,
                                  underlyings, correlations=None, parallel=True)
In [15]:
%time res = port_para.get_values()
  # parallel valuation with 4 cores
CPU times: user 108 ms, sys: 528 ms, total: 636 ms
Wall time: 2.95 s