The Python Quants

DX Analytics Library

Framework Classes and Functions

In [1]:
from dx import *
In [2]:
np.set_printoptions(precision=3)

Helper Functions

The helper functions:

  • get_year_deltas: get a list of year deltas (decimal fractions) relative to first value in time_list
  • sn_random_numbers: get an array of standard normally distributed pseudo-random numbers

get_year_deltas

In [3]:
time_list = [dt.datetime(2015, 1, 1),
             dt.datetime(2015, 4, 1),
             dt.datetime(2015, 6, 15),
             dt.datetime(2015, 10, 21)]
In [4]:
get_year_deltas(time_list)
Out[4]:
array([ 0.   ,  0.247,  0.452,  0.803])

sn_random_numbers

In [5]:
ran = sn_random_numbers((2, 3, 4), antithetic=True,
                        moment_matching=True, fixed_seed=False)
In [6]:
ran
Out[6]:
array([[[ 0.679, -0.417, -0.679,  0.417],
        [ 1.682, -1.486, -1.682,  1.486],
        [-2.011, -0.378,  2.011,  0.378]],

       [[ 0.565, -0.261, -0.565,  0.261],
        [-0.604,  0.183,  0.604, -0.183],
        [-0.983,  0.623,  0.983, -0.623]]])
In [7]:
ran = sn_random_numbers((1, 3, 4), antithetic=True,
                        moment_matching=True, fixed_seed=False)
In [8]:
ran
Out[8]:
array([[ 0.559, -1.131, -0.559,  1.131],
       [-0.226, -0.431,  0.226,  0.431],
       [-1.674, -1.169,  1.674,  1.169]])

Discounting Classes

The discounting classes:

  • constant_short_rate: fixed short rate
  • deterministic_yield: deterministic yiels/term structure

constant_short_rate

In [9]:
r = constant_short_rate('r', 0.05)
In [10]:
r.name
Out[10]:
'r'
In [11]:
r.short_rate
Out[11]:
0.05
In [12]:
r.get_forward_rates(time_list)
Out[12]:
array([[datetime.datetime(2015, 1, 1, 0, 0), 0.050000000000000003],
       [datetime.datetime(2015, 4, 1, 0, 0), 0.050000000000000003],
       [datetime.datetime(2015, 6, 15, 0, 0), 0.050000000000000003],
       [datetime.datetime(2015, 10, 21, 0, 0), 0.050000000000000003]], dtype=object)
In [13]:
r.get_discount_factors(time_list)
Out[13]:
array([[datetime.datetime(2015, 1, 1, 0, 0), 0.96065783317497233],
       [datetime.datetime(2015, 4, 1, 0, 0), 0.97765078845923026],
       [datetime.datetime(2015, 6, 15, 0, 0), 0.98774692076069892],
       [datetime.datetime(2015, 10, 21, 0, 0), 1.0]], dtype=object)
In [14]:
r.get_discount_factors(np.array([0., 1., 1.5, 2.]),
                       dtobjects=False)
Out[14]:
array([[ 0.   ,  0.905],
       [ 1.   ,  0.928],
       [ 1.5  ,  0.951],
       [ 2.   ,  1.   ]])

deterministic_short_rate

In [15]:
yields = [(dt.datetime(2015, 1, 1), 0.02),
          (dt.datetime(2015, 3, 1), 0.03),
          (dt.datetime(2015, 10, 15), 0.035),
          (dt.datetime(2015, 12, 31), 0.04)]
          
In [16]:
y = deterministic_short_rate('y', yields)
In [17]:
y.name
Out[17]:
'y'
In [18]:
y.yield_list
Out[18]:
array([[datetime.datetime(2015, 1, 1, 0, 0), 0.02],
       [datetime.datetime(2015, 3, 1, 0, 0), 0.03],
       [datetime.datetime(2015, 10, 15, 0, 0), 0.035],
       [datetime.datetime(2015, 12, 31, 0, 0), 0.04]], dtype=object)
In [19]:
y.get_interpolated_yields(time_list)
Out[19]:
array([[datetime.datetime(2015, 1, 1, 0, 0), 0.019999999999999993,
        0.084060859779161196],
       [datetime.datetime(2015, 4, 1, 0, 0), 0.032830489345203447,
        0.02532998361805569],
       [datetime.datetime(2015, 6, 15, 0, 0), 0.035133049718591186,
        0.00077696423037970641],
       [datetime.datetime(2015, 10, 21, 0, 0), 0.035150125709846089,
        0.010083939037494674]], dtype=object)
In [20]:
y.get_forward_rates(time_list)
Out[20]:
array([[datetime.datetime(2015, 1, 1, 0, 0), 0.019999999999999993],
       [datetime.datetime(2015, 4, 1, 0, 0), 0.039076238730477456],
       [datetime.datetime(2015, 6, 15, 0, 0), 0.035484280124105302],
       [datetime.datetime(2015, 10, 21, 0, 0), 0.04324490417008154]], dtype=object)
In [21]:
y.get_discount_factors(time_list)
Out[21]:
array([[datetime.datetime(2015, 1, 1, 0, 0), 0.97166103139227611],
       [datetime.datetime(2015, 4, 1, 0, 0), 0.97876383482361962],
       [datetime.datetime(2015, 6, 15, 0, 0), 0.98629027682763593],
       [datetime.datetime(2015, 10, 21, 0, 0), 1.0]], dtype=object)

Market Environment

A market_environment object stores:

  • curves: e.g. discount objects
  • constants: e.g. maturity date of option
In [22]:
me = market_environment('me', dt.datetime(2014, 1, 1))
In [23]:
me.add_curve('discount_curve_1', r)
In [24]:
me.add_curve('discount_curve_2', y)
In [25]:
me.add_constant('initial_value', 100.)
In [26]:
me.add_constant('volatility', 0.25)
In [27]:
me.constants
Out[27]:
{'initial_value': 100.0, 'volatility': 0.25}
In [28]:
me.curves
Out[28]:
{'discount_curve_1': <dx.dx_frame.constant_short_rate at 0x109ae3450>,
 'discount_curve_2': <dx.dx_frame.deterministic_short_rate at 0x109ae33d0>}
In [29]:
me.get_constant('volatility')
Out[29]:
0.25
In [30]:
me.get_curve('discount_curve_1').get_discount_factors(time_list)
Out[30]:
array([[datetime.datetime(2015, 1, 1, 0, 0), 0.96065783317497233],
       [datetime.datetime(2015, 4, 1, 0, 0), 0.97765078845923026],
       [datetime.datetime(2015, 6, 15, 0, 0), 0.98774692076069892],
       [datetime.datetime(2015, 10, 21, 0, 0), 1.0]], dtype=object)
In [31]:
me.get_curve('discount_curve_2').get_discount_factors(time_list)
Out[31]:
array([[datetime.datetime(2015, 1, 1, 0, 0), 0.97166103139227611],
       [datetime.datetime(2015, 4, 1, 0, 0), 0.97876383482361962],
       [datetime.datetime(2015, 6, 15, 0, 0), 0.98629027682763593],
       [datetime.datetime(2015, 10, 21, 0, 0), 1.0]], dtype=object)