diff options
| -rw-r--r-- | python/analytics/option.py | 28 | ||||
| -rw-r--r-- | python/test_hyoption.py | 16 | ||||
| -rw-r--r-- | python/test_igoption.py | 15 | ||||
| -rw-r--r-- | python/tests/test_swaption.py | 43 |
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() |
