aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--python/analytics/option.py28
-rw-r--r--python/test_hyoption.py16
-rw-r--r--python/test_igoption.py15
-rw-r--r--python/tests/test_swaption.py43
4 files changed, 95 insertions, 7 deletions
diff --git a/python/analytics/option.py b/python/analytics/option.py
index e8f975fa..9a544162 100644
--- a/python/analytics/option.py
+++ b/python/analytics/option.py
@@ -277,16 +277,28 @@ class Swaption(ForwardIndex):
def breakeven(self):
pv = self.pv / self.notional
if self._strike_is_price:
- return self._G + pv
+ if self.option_type == "payer":
+ return 100-(self._G + pv)*100
+ else:
+ return 100-(self._G - pv)*100
else:
- aux = lambda S: g(self.index, S, self.exercise_date) - self._G - pv
eta = 1.1
a = self._strike
- b = a * eta
+ if self.option_type == "payer":
+ aux = lambda S: g(self.index, S, self.exercise_date) - (self._G + pv)
+ b = a * eta
+ else:
+ aux = lambda S: g(self.index, S, self.exercise_date) - (self._G - pv)
+ b = a / eta
while True:
- if aux(b) > 0:
- break
- b *= eta
+ if self.option_type == "payer":
+ if aux(b) > 0:
+ break
+ b *= eta
+ else:
+ if aux(b) < 0:
+ break
+ b /= eta
return brentq(aux, a, b)
@@ -328,6 +340,10 @@ class Swaption(ForwardIndex):
self.vega,
"Theta",
self.theta),
+ "{:<20}\t{:>15.3f}\t\t{:<20}\t{:>10.0f}".format("Breakeven",
+ self.breakeven,
+ "Days to Exercise",
+ self.T*365),
""
]
return "\n".join(s)
diff --git a/python/test_hyoption.py b/python/test_hyoption.py
new file mode 100644
index 00000000..b6d01ab0
--- /dev/null
+++ b/python/test_hyoption.py
@@ -0,0 +1,16 @@
+from analytics import Index, Swaption
+import datetime
+index = Index.from_name("hy", 27, "5yr",
+ trade_date = datetime.date(2016, 11, 16))
+index.price = 103.75
+exercise_date = datetime.date(2017, 3, 15)
+strike = 102.5
+payer = Swaption(index, exercise_date, strike, strike_is_price = True)
+payer.sigma = .4
+payer.notional= 1e7
+#payer.pv = 1.948 * 1e-2
+
+receiver = Swaption(index, exercise_date, strike, "receiver", strike_is_price = True)
+receiver.sigma = .4
+receiver.notional= 1e7
+
diff --git a/python/test_igoption.py b/python/test_igoption.py
new file mode 100644
index 00000000..23d04d51
--- /dev/null
+++ b/python/test_igoption.py
@@ -0,0 +1,15 @@
+from analytics import Index, Swaption
+import datetime
+index = Index.from_name("ig", 27, "5yr",
+ trade_date = datetime.date(2016, 11, 18))
+index.spread = 76.5
+exercise_date = datetime.date(2017, 3, 15)
+strike = 80
+payer = Swaption(index, exercise_date, strike, strike_is_price = False)
+payer.sigma = .4
+payer.notional = 10000000
+#payer.pv = 1.948 * 1e-2
+
+receiver = Swaption(index, exercise_date, strike, "receiver", strike_is_price = False)
+receiver.sigma = .4
+receiver.notional= 1e7 \ No newline at end of file
diff --git a/python/tests/test_swaption.py b/python/tests/test_swaption.py
index 935a964b..1fd71d27 100644
--- a/python/tests/test_swaption.py
+++ b/python/tests/test_swaption.py
@@ -43,7 +43,7 @@ class TestPutCallParity(unittest.TestCase):
def test_hy(self):
index = Index.from_name("hy", 27, "5yr",
- trade_date = datetime.date(2016, 11, 8))
+ trade_date=datetime.date(2016, 11, 8))
index.price = 103.875
exercise_date = datetime.date(2017, 3, 15)
strike = 102.5
@@ -51,5 +51,46 @@ class TestPutCallParity(unittest.TestCase):
payer.pv = 1.948 * 1e-2
self.assertAlmostEqual(payer.sigma, 0.4144886488)
+class TestBreakeven(unittest.TestCase):
+
+ exercise_date = datetime.date(2017, 3, 15)
+ hyindex = Index.from_name("hy", 27, "5yr",
+ trade_date=datetime.date(2016, 11, 16))
+ hyindex.price = 103.75
+ hystrike = 102.5
+
+ igindex = Index.from_name("ig", 27, "5yr",
+ trade_date=datetime.date(2016, 11, 18))
+ igindex.spread = 76.5
+ igstrike = 80
+
+ def test_hypayer(self):
+ payer = Swaption(self.hyindex, self.exercise_date,
+ self.hystrike, strike_is_price=True)
+ payer.sigma = .4
+ payer.notional = 1e7
+ self.assertAlmostEqual(payer.breakeven, 100.66971148766)
+
+ def test_hyreceiver(self):
+ receiver = Swaption(self.hyindex, self.exercise_date,
+ self.hystrike, "receiver", strike_is_price=True)
+ receiver.sigma = .4
+ receiver.notional = 1e7
+ self.assertAlmostEqual(receiver.breakeven, 103.9609977905)
+
+ def test_igpayer(self):
+ payer = Swaption(self.igindex, self.exercise_date,
+ self.igstrike, strike_is_price=False)
+ payer.sigma = .4
+ payer.notional = 1e7
+ self.assertAlmostEqual(payer.breakeven, 88.39037813)
+
+ def test_igreceiver(self):
+ receiver = Swaption(self.igindex, self.exercise_date,
+ self.igstrike, "receiver", strike_is_price=False)
+ receiver.sigma = .4
+ receiver.notional = 1e7
+ self.assertAlmostEqual(receiver.breakeven, 73.698281555)
+
if __name__=="__main__":
unittest.main()