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

1import unittest 

2import math 

3from dateutil import relativedelta 

4from datetime import datetime, timedelta 

5 

6import rivapy 

7from rivapy.marketdata import DiscountCurve, SurvivalCurve 

8from rivapy import enums 

9from rivapy.tools import SimpleSchedule 

10from rivapy import _pyvacon_available 

11 

12if _pyvacon_available: 

13 from rivapy.marketdata import DatedCurve 

14 

15 

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) 

37 

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) 

42 

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) 

45 

46 cds_pricing_data = rivapy.pricing.CDSPricingData(spec=spec, val_date=refdate, discount_curve=dc, survival_curve=sc, recovery_curve=recovery) 

47 

48 pr = rivapy.pricing.price(cds_pricing_data) 

49 self.assertAlmostEqual(0.0, 0.0, 3) 

50 

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]) 

59 

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]) 

68 

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]) 

77 

78if __name__ == '__main__': 

79 unittest.main() 

80