import unittest import datetime import numpy as np from pyisda.cdsone import upfront_charge from pyisda.flat_hazard import pv_vec from analytics import Index, ForwardIndex from analytics.index import g import pickle class TestPickle(unittest.TestCase): index = Index.from_name("ig", 26, "5yr", trade_date = datetime.date(2016, 7, 1)) index.notional = 50e6 index.spread = 75 def test_pickle(self): a = pickle.loads(pickle.dumps(self.index)) self.assertTrue(hash(a) == hash(self.index)) class TestStrike(unittest.TestCase): index = Index.from_name("ig", 26, "5yr", trade_date = datetime.date(2016, 7, 1)) index.notional = 50e6 index.spread = 75 exercise_date = datetime.date(2016, 8, 19) def test_pv(self): self.assertAlmostEqual(self.index.clean_pv, g(self.index, self.index.spread, self.index.trade_date) * self.index.notional) def test_strike(self): """strike price equals clean_pv using expected forward yield curve""" strike = g(self.index, self.index.spread, self.exercise_date) * self.index.notional old_yc = self.index._yc self.index.trade_date = self.exercise_date self.index._yc = old_yc.expected_forward_curve(self.exercise_date) self.index._update() self.assertAlmostEqual(self.index.clean_pv, strike) def test_strike_vec(self): self.index.trade_date = datetime.date(2016, 8, 19) r = pv_vec(np.array([70, 75])*1e-4, self.index._yc, self.index.trade_date, self.index._value_date, self.index.start_date, self.index.end_date, self.index.recovery, self.index.fixed_rate * 1e-4) self.index.notional = 1 self.index.spread = 70 self.assertAlmostEqual(self.index.clean_pv, r[0]) self.index.spread = 75 self.assertAlmostEqual(self.index.clean_pv, r[1]) def test_price_setting(self): self.index.price = self.index.price self.assertAlmostEqual(self.index.spread, 75) class TestForwardIndex(unittest.TestCase): index = Index.from_name("ig", 26, "5yr", trade_date = datetime.date(2016, 7, 1)) index.notional = 50e6 index.spread = 75 exercise_date = datetime.date(2016, 8, 19) fi = ForwardIndex(index, exercise_date) def test_forward_pv(self): """default adjusted forward spread and forward annuity match""" self.assertAlmostEqual(self.fi.forward_pv, self.fi.forward_annuity * (self.fi.index.fixed_rate - self.forward_spread) * 1e-4) def test_forward_pv(self): """default adjusted forward price for trade_date equals clean pv""" fi = ForwardIndex(self.index, self.index.trade_date) self.assertAlmostEqual(fi.forward_pv, self.index.clean_pv / self.index.notional) if __name__=="__main__": unittest.main()