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)
Ejemplo n.º 2
0
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)