import unittest import datetime import sys sys.path.append('..') from analytics.index import g from analytics import Index, Swaption class TestPutCallParity(unittest.TestCase): index = Index.from_name("ig", 27, "5yr", trade_date = datetime.date(2016, 10, 25)) index.spread = 74 exercise_date = datetime.date(2017, 3, 15) strike = 82.5 def test_parity(self): payer = Swaption(self.index, self.exercise_date, self.strike) receiver = Swaption(self.index, self.exercise_date, self.strike, "receiver") payer.sigma = 0.416 receiver.sigma = 0.416 df = self.index._yc.discount_factor(payer.exercise_date_settle) self.assertAlmostEqual(payer.pv - receiver.pv, df * (payer.forward_pv - g(self.index, self.strike, self.exercise_date, payer._forward_yc))) def test_parity_pvblack(self): payer = Swaption(self.index, self.exercise_date, self.strike) receiver = Swaption(self.index, self.exercise_date, self.strike, "receiver") payer.sigma = 0.416 receiver.sigma = 0.416 df = self.index._yc.discount_factor(payer.exercise_date_settle) self.assertAlmostEqual(payer.pv_black - receiver.pv_black, df * (payer.forward_pv - g(self.index, self.strike, self.exercise_date, payer._forward_yc))) def test_calibration(self): payer = Swaption(self.index, self.exercise_date, self.strike) payer.sigma = 0.2 pv = 30 * 1e-4 payer.pv = pv self.assertAlmostEqual(payer.pv, payer.pv) self.assertAlmostEqual(payer.sigma, 0.3756828) def test_hy(self): index = Index.from_name("hy", 27, "5yr", trade_date = datetime.date(2016, 11, 8)) index.price = 103.875 exercise_date = datetime.date(2017, 3, 15) strike = 102.5 payer = Swaption(index, exercise_date, strike, strike_is_price = True) payer.pv = 1.948 * 1e-2 self.assertAlmostEqual(payer.sigma, 0.4144886488) if __name__=="__main__": unittest.main()