diff options
Diffstat (limited to 'python/analytics/option.py')
| -rw-r--r-- | python/analytics/option.py | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/python/analytics/option.py b/python/analytics/option.py index d0395b6e..c55975b2 100644 --- a/python/analytics/option.py +++ b/python/analytics/option.py @@ -2,6 +2,7 @@ from __future__ import division import array import datetime +import hashlib import math import numpy as np import pandas as pd @@ -11,6 +12,8 @@ from .utils import GHquad from .index import g, ForwardIndex from yieldcurve import roll_yc from pandas.tseries.offsets import BDay +from pickle import dumps + from pyisda.curve import SpreadCurve from pyisda.flat_hazard import pv_vec from scipy.optimize import brentq @@ -40,7 +43,7 @@ def ATMstrike(index, exercise_date): class Swaption(ForwardIndex): """Swaption class""" def __init__(self, index, exercise_date, strike, - option_type="payer", strike_is_price = False): + option_type="payer", strike_is_price=False): ForwardIndex.__init__(self, index, exercise_date, strike_is_price) self._exercise_date = exercise_date self._forward_yc = roll_yc(index._yc, exercise_date) @@ -50,6 +53,8 @@ class Swaption(ForwardIndex): self.option_type = option_type.lower() self._Z, self._w = GHquad(50) self.notional = 1 + self.sigma = None + self._cache = {} @property def exercise_date(self): @@ -88,6 +93,7 @@ class Swaption(ForwardIndex): else: self._G = g(self.index, K, self.exercise_date, self._forward_yc) self._strike = K + #self._G = g(self.index, K, self.exercise_date) @property def intrinsic_value(self): @@ -95,7 +101,16 @@ class Swaption(ForwardIndex): return max(V, 0) if self.option_type == "payer" else max(-V, 0) @property + def _state(self): + return hashlib.md5(dumps( + {k: v for k, v in self.__dict__.items() if k not in + ['_cache', '_Z', '_w']})).digest() + + @property def pv(self): + k = self._state + if k in self._cache: + return self._cache[k] T = self.T tilt = np.exp(-self.sigma**2/2 * T + self.sigma * self._Z * math.sqrt(T)) args = (self.forward_pv, self.exercise_date, self.exercise_date_settle, @@ -126,7 +141,9 @@ class Swaption(ForwardIndex): self.exercise_date_settle, self.index.start_date, self.index.end_date, self.index.recovery, self.index.fixed_rate * 1e-4) val = (r - self._G) * 1/math.sqrt(2*math.pi) * np.exp(-Z**2/2) - return self.notional * simps(val, Z) * self.df + pv = self.notional * simps(val, Z) * self.df + self._cache[k] = pv + return pv @pv.setter def pv(self, val): |
