diff options
Diffstat (limited to 'python')
| -rw-r--r-- | python/analytics/option.py | 65 |
1 files changed, 60 insertions, 5 deletions
diff --git a/python/analytics/option.py b/python/analytics/option.py index 27ee9059..d0395b6e 100644 --- a/python/analytics/option.py +++ b/python/analytics/option.py @@ -84,7 +84,7 @@ class Swaption(ForwardIndex): break b *= eta self._strike = brentq(handle, a, b, - args = (self.index, self.exercise_date, self._forward_yc)) + args=(self.index, self.exercise_date, self._forward_yc)) else: self._G = g(self.index, K, self.exercise_date, self._forward_yc) self._strike = K @@ -185,10 +185,13 @@ class Swaption(ForwardIndex): def delta(self): old_index_pv = self.index.pv old_pv = self.pv - self.index.spread += 0.1 + self.index.spread += 1 + self._update() notional_ratio = self.index.notional/self.notional - delta = (self.pv - old_pv)/(self.index.pv - old_index_pv) * notional_ratio - self.index.spread -= 0.1 + self._dv01 = (self.pv - old_pv) + delta = self._dv01/(self.index.pv - old_index_pv) * notional_ratio + self.index.spread -= 1 + self._update() return delta @property @@ -200,7 +203,15 @@ class Swaption(ForwardIndex): @property def gamma(self): - pass + self.index.spread += 5 + self._update() + old_delta = self.delta + self.index.spread -= 10 + self._update() + gamma = abs(self.delta- old_delta) + self.index.spread += 5 + self._update() + return gamma @property def theta(self): @@ -222,8 +233,10 @@ class Swaption(ForwardIndex): def DV01(self): old_pv = self.pv self.index.spread += 1 + self._update() dv01 = self.pv - old_pv self.index.spread -= 1 + self._update() return dv01 @property @@ -242,3 +255,45 @@ class Swaption(ForwardIndex): b *= eta return brentq(aux, a, b) + + def __repr__(self): + s = ["{:<20}{}".format(self.index.name, self.option_type), + "", + "{:<20}\t{:>15}".format("Trade Date", ('{:%m/%d/%y}'. + format(self.index.trade_date))), + "{:<20}\t{:>15.2f}\t\t{:<20}\t{:>10,.2f}".format("Ref Sprd (bp)", + self.index.spread, + "Coupon (bp)", + self.index.fixed_rate), + "{:<20}\t{:>15.3f}\t\t{:<20}\t{:>10}".format("Ref Price", + self.index.price, + "Maturity Date", + ('{:%m/%d/%y}'. + format(self.index.end_date))), + "", + "Swaption Calculator", + "", + "{:<20}\t{:>15.3f}\t\t{:<20}\t{:>10,.2f}".format("Notional", + self.notional, + "Premium", + self.pv), + "{:<20}\t{:>15.2f}\t\t{:<20}\t{:>10}".format("Strike", + self.strike, + "Maturity Date", + ('{:%m/%d/%y}'. + format(self.exercise_date))), + "{:<20}\t{:>15.4f}\t\t{:<20}\t{:>10.3f}".format("Spread Vol", + self.sigma, + "Spread DV01", + self.DV01), + "{:<20}\t{:>15.3f}\t\t{:<20}\t{:>10.5f}".format("Delta", + self.delta, + "Gamma", + self.gamma), + "{:<20}\t{:>15.3f}\t\t{:<20}\t{:>10.3f}".format("Vega", + self.vega, + "Theta", + self.theta), + "" + ] + return "\n".join(s) |
