Coverage for tests/test_instruments.py: 67%
51 statements
« prev ^ index » next coverage.py v7.8.2, created at 2025-06-05 14:27 +0000
« prev ^ index » next coverage.py v7.8.2, created at 2025-06-05 14:27 +0000
1import unittest
2import math
3from dateutil import relativedelta
4from datetime import datetime, timedelta
6import rivapy
7from rivapy.marketdata import DiscountCurve, SurvivalCurve
8from rivapy import enums
9from rivapy.tools import SimpleSchedule
10from rivapy import _pyvacon_available
12if _pyvacon_available:
13 from rivapy.marketdata import DatedCurve
16class CDSTest(unittest.TestCase):
17 """Test simple CDS pricing using ISDA model.
18 """
19 def test_pricing(self):
20 """Test simple CDS pricing using ISDA model.
21 """
22 if not _pyvacon_available:
23 self.assertAlmostEqual(1, 1)
24 return
25 refdate = datetime(2020,1,1)
26 #yield curve
27 days_to_maturity = [1, 180, 360, 720, 3*360, 4*360, 5*360, 10*360]
28 rates = [-0.0065, 0.0003, 0.0059, 0.0086, 0.0101, 0.012, 0.016, 0.02]
29 dates = [refdate + timedelta(days=d) for d in days_to_maturity]
30 dsc_fac = [math.exp(-rates[i]*days_to_maturity[i]/360) for i in range(len(days_to_maturity))]
31 dc = DiscountCurve('CDS_interest_rate', refdate,
32 dates,
33 dsc_fac,
34 enums.InterpolationType.LINEAR)
35 hazard_rates = [0, 0.001, 0.0015, 0.002, 0.0025, 0.003, 0.0035, 0.005]
36 sc = SurvivalCurve('Survival', refdate, dates, hazard_rates)
38 recoveries = [0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6]
39 recovery = DatedCurve('Recovery', refdate, dates, recoveries,
40 enums.DayCounterType.Act365Fixed.name,
41 enums.InterpolationType.LINEAR.name)
43 payment_dates = [refdate + relativedelta.relativedelta(years=i) for i in range(10)]
44 spec = rivapy.instruments.CDSSpecification(premium = 0.0012, protection_start=refdate, premium_pay_dates = payment_dates, notional = 1000000.0)
46 cds_pricing_data = rivapy.pricing.CDSPricingData(spec=spec, val_date=refdate, discount_curve=dc, survival_curve=sc, recovery_curve=recovery)
48 pr = rivapy.pricing.price(cds_pricing_data)
49 self.assertAlmostEqual(0.0, 0.0, 3)
51class SimpleScheduleTest(unittest.TestCase):
52 def test_simple_start_end(self):
53 """Simple test: Generate schedule without restrictions to hours or weekdays and check if start is included and end is excluded
54 """
55 simple_schedule = SimpleSchedule(datetime(2023,1,1), datetime(2023,1,1,4,0,0), freq='1H')
56 d = simple_schedule.get_schedule()
57 self.assertEqual(len(d), 4)
58 self.assertEqual(datetime(2023,1,1), d[0])
60 def test_simple_hours(self):
61 """Simple test: Generate schedule with restrictions to hours and check correctness.
62 """
63 simple_schedule = SimpleSchedule(datetime(2023,1,1), datetime(2023,1,1,4,0,0), freq='1H', hours=[2,3])
64 d = simple_schedule.get_schedule()
65 self.assertEqual(len(d), 2)
66 self.assertEqual(datetime(2023,1,1,2,0,0), d[0])
67 self.assertEqual(datetime(2023,1,1,3,0,0), d[1])
69 def test_simple_weekdays(self):
70 """Simple test: Generate schedule with restrictions to hours and weekdays and check correctness.
71 """
72 simple_schedule = SimpleSchedule(datetime(2023,1,1), datetime(2023,1,2,4,0,0), freq='1H', hours=[2,3], weekdays=[0])
73 d = simple_schedule.get_schedule()
74 self.assertEqual(len(d), 2)
75 self.assertEqual(datetime(2023,1,2,2,0,0), d[0])
76 self.assertEqual(datetime(2023,1,2,3,0,0), d[1])
78if __name__ == '__main__':
79 unittest.main()