class CastZeroRateCurveUnitTests(TestCase): def setUp(self): self.cast_type = ZeroRateCurve self.grid = ['0D', '3M', '12M'] self.points = [0.02, 0.01, 0.015] self.grid = ['0D', '1M', '2M', '3M', '4M', '5M', '6M', '1Y'] self.points = [ 0.02, 0.018, 0.0186, 0.018, 0.0167, 0.0155, 0.015, 0.015 ] self.precision = 10 self.cash_precision = 2 self.today = BusinessDate() self.today_eom = self.today == self.today.end_of_month() self.periods = ('0D', '1D', '2B', '8D', '2W', '14B', '1M', '1M1D', '3M', '6M', '6M2W1D', '9M', '12M') def pp(d, a, b): print((d, abs(a(d) - b(d)) < self.precision, a(d), b(d))) self.pp = pp def curve(p='0D'): grid = [self.today + p + _ for _ in self.grid] return self.cast_type(grid, self.points) self.curve = curve def test_interpolation(self): curve = self.curve() for t in (DiscountFactorCurve, ZeroRateCurve, ShortRateCurve): cast = t(curve) curve.cast(t) recast = self.cast_type(cast) self.assertEqual(self.cast_type._interpolation, curve.interpolation) self.assertEqual(t._interpolation, cast.interpolation) self.assertEqual(self.cast_type._interpolation, recast.interpolation) def test_discount_cast(self): for p in self.periods: curve = self.curve(p) cast = self.cast_type(DiscountFactorCurve(curve)) for d in curve.domain[1:]: self.assertAlmostEqual(cast(d), curve(d), self.precision) def test_zero_cast(self): for p in self.periods: curve = self.curve(p) cast = self.cast_type(ZeroRateCurve(curve)) for d in curve.domain[1:]: self.assertAlmostEqual(cast(d), curve(d), self.precision) def test_short_cast(self): for p in self.periods: curve = self.curve(p) cast = self.cast_type(ShortRateCurve(curve)) for d in curve.domain[1:]: self.assertAlmostEqual(cast(d), curve(d), self.precision) def test_cash1m_cast(self): for p in self.periods: curve = self.curve(p) cast = self.cast_type(CashRateCurve(curve, forward_tenor='1M')) for d in curve.domain[1:]: self.assertAlmostEqual(cast(d), curve(d), self.cash_precision) def test_cash3m_cast(self): for p in self.periods: curve = self.curve(p) cast = self.cast_type(CashRateCurve(curve, forward_tenor='3M')) for d in curve.domain[1:]: self.assertAlmostEqual(cast(d), curve(d), self.cash_precision)
class CastIntensityCurveUnitTests(TestCase): def setUp(self): self.cast_type = FlatIntensityCurve self.grid = ['0D', '3M', '12M'] self.points = [0.02, 0.01, 0.015] self.grid = ['0D', '1M', '2M', '3M', '4M', '5M', '6M', '1Y'] self.points = [ 0.02, 0.018, 0.0186, 0.018, 0.0167, 0.0155, 0.015, 0.015 ] self.precision = 10 self.marginal_precision = 2 self.today = BusinessDate() self.today_eom = self.today == self.today.end_of_month() self.periods = ('0D', '1D', '2B', '8D', '2W', '14B', '1M', '1M1D', '3M', '6M', '6M2W1D', '9M', '12M') def pp(d, a, b): print((d, abs(a(d) - b(d)) < self.precision, a(d), b(d))) self.pp = pp def curve(p='0D'): grid = [self.today + p + _ for _ in self.grid] return self.cast_type(grid, self.points) self.curve = curve def test_interpolation(self): curve = self.curve() for t in (SurvivalProbabilityCurve, FlatIntensityCurve, HazardRateCurve): cast = curve.cast(t) recast = cast.cast(self.cast_type) self.assertEqual(self.cast_type._interpolation, curve.interpolation) self.assertEqual(t._interpolation, cast.interpolation) self.assertEqual(self.cast_type._interpolation, recast.interpolation) def test_survival_cast(self): for p in self.periods: curve = self.curve(p) cast = curve.cast(SurvivalProbabilityCurve).cast(self.cast_type) for d in curve.domain[1:]: self.assertAlmostEqual(cast(d), curve(d), self.precision) def test_intensity_cast(self): for p in self.periods: curve = self.curve(p) cast = curve.cast(FlatIntensityCurve).cast(self.cast_type) for d in curve.domain[1:]: self.assertAlmostEqual(cast(d), curve(d), self.precision) def test_hazard_cast(self): for p in self.periods: curve = self.curve(p) cast = curve.cast(HazardRateCurve).cast(self.cast_type) for d in curve.domain[1:]: self.assertAlmostEqual(cast(d), curve(d), self.precision) def test_default_cast(self): for p in self.periods: curve = self.curve(p) cast = curve.cast(DefaultProbabilityCurve).cast(self.cast_type) for d in curve.domain[1:]: self.assertAlmostEqual(cast(d), curve(d), self.precision) def test_marginal_survival_cast(self): for p in self.periods: curve = self.curve(p) cast = curve.cast(MarginalSurvivalProbabilityCurve).cast( self.cast_type) for d in curve.domain[1:]: self.assertAlmostEqual(cast(d), curve(d), self.marginal_precision) def test_marginal_default_cast(self): for p in self.periods: curve = self.curve(p) cast = curve.cast(MarginalDefaultProbabilityCurve).cast( self.cast_type) for d in curve.domain[1:]: self.assertAlmostEqual(cast(d), curve(d), self.marginal_precision)