aboutsummaryrefslogtreecommitdiffstats
path: root/python/analytics/option.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/analytics/option.py')
-rw-r--r--python/analytics/option.py21
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):