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