aboutsummaryrefslogtreecommitdiffstats
path: root/python/tests/test_tranche_basket.py
blob: 63fe234743b0ee322dcf84c3698cbfa89be5af54 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import unittest
import datetime
from serenitas.analytics import DualCorrTranche, TrancheBasket
import numpy as np
import pickle


class TestPickle(unittest.TestCase):
    bozeman = DualCorrTranche.from_tradeid(1037)

    def test_pickle(self):
        a = pickle.loads(pickle.dumps(self.bozeman))
        self.assertTrue(hash(a) == hash(self.bozeman))

    def test_pv(self):
        self.assertAlmostEqual(self.bozeman.upfront, 0.0)


class TestTopDown(unittest.TestCase):
    eu30 = TrancheBasket("EU", 30, "5yr", value_date=datetime.date(2019, 8, 15))
    market_quotes = eu30._accrued + eu30.tranche_quotes.quotes

    def test_invariant(self):
        hy35 = TrancheBasket("HY", 35, "5yr", value_date=datetime.date(2020, 10, 5))
        hy35.tweak()
        hy35.build_skew()
        self.assertAlmostEqual(
            hy35.index_pv(clean=True).bond_price,
            (hy35.tranche_pvs().bond_price * np.diff(hy35.K)).sum(),
        )

    def test_bottomup(self):
        self.eu30.build_skew()
        upfronts = 1 - self.eu30.tranche_pvs().bond_price
        self.assertTrue(np.allclose(upfronts[:-1], self.market_quotes[:-1]))

    def test_topdown(self):
        self.eu30.build_skew("topdown")
        upfronts = 1 - self.eu30.tranche_pvs(complement=True).bond_price
        self.assertTrue(np.allclose(upfronts[1:], self.market_quotes[1:]))