Esempio n. 1
0
    def test_ed(self):
        """
        Curve construction with EuroDollar futures
        Not checking numerical accuracy
        """

        # US libor market, with default conventions:
        # semi-annual fixed vs. 3M Libor
        m = libor_market('USD(LONDON)')

        # add quotes
        eval_date = Date(20, 9, 2004)

        quotes = [
            ('ED', 1, 96.2875),
            ('ED', 2, 96.7875),
            ('ED', 3, 96.9875),
            ('ED', 4, 96.6875),
            ('ED', 5, 96.4875),
            ('ED', 6, 96.3875),
            ('ED', 7, 96.2875),
            ('ED', 8, 96.0875)]

        m.set_quotes(eval_date, quotes)

        m.bootstrap_term_structure()

        dt = Date(1, 1, 2005)
        df = m.discount(dt)

        print('discount factor for %s (USD Libor): %f' % (dt, df))

        self.assertTrue(df > 0)
Esempio n. 2
0
    def test_ed(self):
        """
        Curve construction with EuroDollar futures
        Not checking numerical accuracy
        """

        # US libor market, with default conventions:
        # semi-annual fixed vs. 3M Libor
        m = libor_market('USD(LONDON)')

        # add quotes
        eval_date = Date(20, 9, 2004)

        quotes = [('ED', 1, 96.2875), ('ED', 2, 96.7875), ('ED', 3, 96.9875),
                  ('ED', 4, 96.6875), ('ED', 5, 96.4875), ('ED', 6, 96.3875),
                  ('ED', 7, 96.2875), ('ED', 8, 96.0875)]

        m.set_quotes(eval_date, quotes)

        m.bootstrap_term_structure()

        dt = Date(1, 1, 2005)
        df = m.discount(dt)

        print('discount factor for %s (USD Libor): %f' % (dt, df))

        self.assertTrue(df > 0)
    def test_libor_market(self):
        """
        Basic test of Libor market
        Not checking numerical accuracy
        """

        # US libor market, with default conventions:
        # semi-annual fixed vs. 3M Libor
        m = libor_market('USD(NY)')

        # add quotes
        eval_date = Date(20, 9, 2004)

        quotes = [('DEP', '1W', SimpleQuote(0.0382)),
                  ('DEP', '1M', SimpleQuote(0.0372)),
                  ('DEP', '3M', SimpleQuote(0.0363)),
                  ('DEP', '6M', SimpleQuote(0.0353)),
                  ('DEP', '9M', SimpleQuote(0.0348)),
                  ('DEP', '1Y', SimpleQuote(0.0345)),
                  ('SWAP', '2Y', SimpleQuote(0.037125)),
                  ('SWAP', '3Y', SimpleQuote(0.0398)),
                  ('SWAP', '5Y', SimpleQuote(0.0443)),
                  ('SWAP', '10Y', SimpleQuote(0.05165)),
                  ('SWAP', '15Y', SimpleQuote(0.055175))]

        m.set_quotes(eval_date, quotes)

        m.bootstrap_term_structure()

        dt = Date(1, 1, 2010)
        df = m.discount(dt)

        print('discount factor for %s (USD Libor): %f' % (dt, df))

        # Euribor market, with default conventions:
        # annual fixed vs. 6M Libor
        m = libor_market('EUR:>1Y')

        m.set_quotes(eval_date, quotes)

        m.bootstrap_term_structure()

        df = m.discount(dt)

        print('discount factor for %s (Euribor): %f' % (dt, df))
        self.assertTrue(df > 0)
Esempio n. 4
0
    def test_libor_market(self):
        """
        Basic test of Libor market
        Not checking numerical accuracy
        """

        # US libor market, with default conventions:
        # semi-annual fixed vs. 3M Libor
        m = libor_market('USD(NY)')

        # add quotes
        eval_date = Date(20, 9, 2004)

        quotes = [('DEP', '1W', 0.0382),
                  ('DEP', '1M', 0.0372),
                  ('DEP', '3M', 0.0363),
                  ('DEP', '6M', 0.0353),
                  ('DEP', '9M', 0.0348),
                  ('DEP', '1Y', 0.0345),
                  ('SWAP', '2Y', 0.037125),
                  ('SWAP', '3Y', 0.0398),
                  ('SWAP', '5Y', 0.0443),
                  ('SWAP', '10Y', 0.05165),
                  ('SWAP', '15Y', 0.055175)]

        m.set_quotes(eval_date, quotes)

        m.bootstrap_term_structure()

        dt = Date(1, 1, 2010)
        df = m.discount(dt)

        print('discount factor for %s (USD Libor): %f' % (dt, df))

        # Euribor market, with default conventions:
        # annual fixed vs. 6M Libor
        m = libor_market('EUR:>1Y')

        m.set_quotes(eval_date, quotes)

        m.bootstrap_term_structure()

        df = m.discount(dt)

        print('discount factor for %s (Euribor): %f' % (dt, df))
        self.assertTrue(df > 0)
Esempio n. 5
0
    def test_forward_spreaded_ts(self):
        m = libor_market("USD(NY)")
        eval_date = Date(20, 9, 2004)

        quotes = [
            ("DEP", "1W", SimpleQuote(0.0382)),
            ("DEP", "1M", SimpleQuote(0.0372)),
            ("DEP", "3M", SimpleQuote(0.0363)),
            ("DEP", "6M", SimpleQuote(0.0353)),
            ("DEP", "9M", SimpleQuote(0.0348)),
            ("DEP", "1Y", SimpleQuote(0.0345)),
        ]

        m.set_quotes(eval_date, quotes)
        ts = m.bootstrap_term_structure()

        discount_ts = m._discount_term_structure
        forecast_ts = m._forecast_term_structure
        discount_spd = 0.05
        forecast_spd = 0.08

        fwd_spd_dts = ForwardSpreadedTermStructure(discount_ts, SimpleQuote(discount_spd))
        fwd_spd_fts = ForwardSpreadedTermStructure(forecast_ts, SimpleQuote(forecast_spd))

        df_rate = round(
            float(discount_ts.forward_rate(Date(1, 1, 2005), Date(30, 1, 2005), Actual360(), Simple).rate), 2
        )
        dz_rate = round(float(discount_ts.zero_rate(Date(1, 1, 2005), Actual360(), Simple).rate), 2)

        fdf_rate = round(
            float(fwd_spd_dts.forward_rate(Date(1, 1, 2005), Date(30, 1, 2005), Actual360(), Simple).rate), 2
        )
        fdz_rate = round(float(fwd_spd_dts.zero_rate(Date(1, 1, 2005), Actual360(), Simple).rate), 2)

        ff_rate = round(
            float(forecast_ts.forward_rate(Date(1, 1, 2005), Date(30, 1, 2005), Actual360(), Simple).rate), 2
        )
        fz_rate = round(float(forecast_ts.zero_rate(Date(1, 1, 2005), Actual360(), Simple).rate), 2)

        ffc_rate = round(
            float(fwd_spd_fts.forward_rate(Date(1, 1, 2005), Date(30, 1, 2005), Actual360(), Simple).rate), 2
        )
        ffz_rate = round(float(fwd_spd_fts.zero_rate(Date(1, 1, 2005), Actual360(), Simple).rate), 2)

        df_diff = fdf_rate - df_rate
        dz_diff = fdz_rate - dz_rate
        ff_diff = ffc_rate - ff_rate
        fz_diff = ffz_rate - fz_rate

        self.assertAlmostEqual(df_diff, discount_spd)
        self.assertAlmostEqual(dz_diff, discount_spd)
        self.assertAlmostEqual(ff_diff, forecast_spd)
        self.assertAlmostEqual(fz_diff, forecast_spd)
Esempio n. 6
0
    def test_forward_spreaded_ts(self):
        m = libor_market('USD(NY)')
        eval_date = Date(20, 9, 2004)

        quotes = [('DEP', '1W', SimpleQuote(0.0382)),
                    ('DEP', '1M', SimpleQuote(0.0372)),
                    ('DEP', '3M', SimpleQuote(0.0363)),
                    ('DEP', '6M', SimpleQuote(0.0353)),
                    ('DEP', '9M', SimpleQuote(0.0348)),
                    ('DEP', '1Y', SimpleQuote(0.0345))]

        m.set_quotes(eval_date, quotes)
        ts = m.bootstrap_term_structure()

        discount_ts = m._discount_term_structure
        forecast_ts = m._forecast_term_structure
        discount_spd = 0.05
        forecast_spd = 0.08

        fwd_spd_dts = ForwardSpreadedTermStructure(discount_ts, SimpleQuote(discount_spd))
        fwd_spd_fts = ForwardSpreadedTermStructure(forecast_ts, SimpleQuote(forecast_spd))

        df_rate = round(float(discount_ts.forward_rate(Date(1, 1, 2005), Date(30, 1, 2005), Actual360(), Simple).rate), 2)
        dz_rate = round(float(discount_ts.zero_rate(Date(1, 1, 2005), Actual360(), Simple).rate), 2)

        fdf_rate = round(float(fwd_spd_dts.forward_rate(Date(1 ,1 , 2005), Date(30 ,1 ,2005), Actual360(), Simple).rate), 2)
        fdz_rate = round(float(fwd_spd_dts.zero_rate(Date(1, 1, 2005), Actual360(), Simple).rate), 2)

        ff_rate = round(float(forecast_ts.forward_rate(Date(1, 1, 2005), Date(30, 1, 2005), Actual360(), Simple).rate), 2)
        fz_rate = round(float(forecast_ts.zero_rate(Date(1, 1, 2005), Actual360(), Simple).rate), 2)

        ffc_rate= round(float(fwd_spd_fts.forward_rate(Date(1, 1, 2005), Date(30, 1, 2005), Actual360(), Simple).rate), 2)
        ffz_rate= round(float(fwd_spd_fts.zero_rate(Date(1, 1, 2005), Actual360() ,Simple).rate), 2)

        df_diff= fdf_rate - df_rate
        dz_diff= fdz_rate - dz_rate
        ff_diff = ffc_rate - ff_rate
        fz_diff = ffz_rate - fz_rate

        self.assertAlmostEqual(df_diff, discount_spd)
        self.assertAlmostEqual(dz_diff, discount_spd)
        self.assertAlmostEqual(ff_diff, forecast_spd)
        self.assertAlmostEqual(fz_diff, forecast_spd)
Esempio n. 7
0
    def test_market_internals(self):
        # FIXME: this should be a test case in its own right, closer to
        # YieldTermStructure.

        m = libor_market('USD(NY)')
        eval_date = Date(20, 9, 2004)

        quotes = [('DEP', '1W', 0.0382),
                  ('DEP', '1M', 0.0372),
                  ('DEP', '3M', 0.0363),
                  ('DEP', '6M', 0.0353),
                  ('DEP', '9M', 0.0348),
                  ('DEP', '1Y', 0.0345)]

        m.set_quotes(eval_date, quotes)
        ts = m.bootstrap_term_structure()

        # Compute zero and forward rates.
        zero_rate = ts.zero_rate(Date(1, 1, 2005), Actual360(), Simple)
        forward_rate = ts.forward_rate(Date(1, 1, 2005), Date(30, 1, 2005),
                                       Actual360(), Simple)

        # We don't test for numerical accuracy.
        self.assertGreater(zero_rate.rate, 0)
        self.assertGreater(forward_rate.rate, 0)

        # Check that the linked term structures are consistent with the
        # original term structure.
        discount_ts = m._discount_term_structure
        forecast_ts = m._forecast_term_structure
        self.assertIsNotNone(discount_ts)
        self.assertIsNotNone(forecast_ts)

        for linked_ts in [discount_ts, forecast_ts]:
            rate = linked_ts.zero_rate(
                Date(1, 1, 2005), Actual360(), Simple)
            self.assertEqual(rate.rate, zero_rate.rate)

            rate = linked_ts.forward_rate(
                Date(1, 1, 2005), Date(30, 1, 2005), Actual360(), Simple)
            self.assertEqual(rate.rate, forward_rate.rate)
Esempio n. 8
0
    def test_market_internals(self):
        # FIXME: this should be a test case in its own right, closer to
        # YieldTermStructure.

        m = libor_market('USD(NY)')
        eval_date = Date(20, 9, 2004)

        quotes = [('DEP', '1W', SimpleQuote(0.0382)),
                  ('DEP', '1M', SimpleQuote(0.0372)),
                  ('DEP', '3M', SimpleQuote(0.0363)),
                  ('DEP', '6M', SimpleQuote(0.0353)),
                  ('DEP', '9M', SimpleQuote(0.0348)),
                  ('DEP', '1Y', SimpleQuote(0.0345))]

        m.set_quotes(eval_date, quotes)
        ts = m.bootstrap_term_structure()

        # Compute zero and forward rates.
        zero_rate = ts.zero_rate(Date(1, 1, 2005), Actual360(), Simple)
        forward_rate = ts.forward_rate(Date(1, 1, 2005), Date(30, 1, 2005),
                                       Actual360(), Simple)

        # We don't test for numerical accuracy.
        self.assertGreater(zero_rate.rate, 0)
        self.assertGreater(forward_rate.rate, 0)

        # Check that the linked term structures are consistent with the
        # original term structure.
        discount_ts = m._discount_term_structure
        forecast_ts = m._forecast_term_structure
        self.assertIsNotNone(discount_ts)
        self.assertIsNotNone(forecast_ts)

        for linked_ts in [discount_ts, forecast_ts]:
            rate = linked_ts.zero_rate(
                Date(1, 1, 2005), Actual360(), Simple)
            self.assertEqual(rate.rate, zero_rate.rate)

            rate = linked_ts.forward_rate(
                Date(1, 1, 2005), Date(30, 1, 2005), Actual360(), Simple)
            self.assertEqual(rate.rate, forward_rate.rate)
Esempio n. 9
0
    def test_swap_from_market(self):
        """
        Test that a swap with fixed coupon = fair rate has an NPV=0
        Create from market
        """

        eval_date = Date(2, January, 2014)
        settings = Settings()
        settings.evaluation_date = eval_date

        calendar = TARGET()
        settlement_date = calendar.advance(eval_date, 2, Days)
        # must be a business day
        settlement_date = calendar.adjust(settlement_date)

        length = 5
        fixed_rate = .05
        floating_spread = 0.0

        m = libor_market('USD(NY)')

        quotes = [('DEP', '1W', SimpleQuote(0.0382)),
                  ('DEP', '1M', SimpleQuote(0.0372)),
                  ('DEP', '3M', SimpleQuote(0.0363)),
                  ('DEP', '6M', SimpleQuote(0.0353)),
                  ('DEP', '9M', SimpleQuote(0.0348)),
                  ('DEP', '1Y', SimpleQuote(0.0345)),
                  ('SWAP', '2Y', SimpleQuote(0.037125)),
                  ('SWAP', '3Y', SimpleQuote(0.0398)),
                  ('SWAP', '5Y', SimpleQuote(0.0443)),
                  ('SWAP', '10Y', SimpleQuote(0.05165)),
                  ('SWAP', '15Y', SimpleQuote(0.055175))]

        m.set_quotes(eval_date, quotes)

        m.bootstrap_term_structure()

        dt = Date(2, January, 2015)
        df = m.discount(dt)
        print('discount factor for %s (USD Libor): %f' % (dt, df))

        swap = m.create_fixed_float_swap(settlement_date, length, fixed_rate,
                                         floating_spread)

        fixed_l = swap.fixed_leg

        float_l = swap.floating_leg

        f = swap.fair_rate
        print('fair rate: %f' % f)
        p = swap.net_present_value
        print('NPV: %f' % p)

        fixed_npv = swap.fixed_leg_npv
        float_npv = swap.floating_leg_npv

        # verify calculation by discounting both legs
        tot = 0.0
        for frc in fixed_l:
            df = m.discount(frc.date)
            tot += frc.amount * df
        print('fixed npv: %f discounted cf: %f' % (fixed_npv, tot))
        self.assertAlmostEqual(fixed_npv, -tot)

        tot = 0.0
        for ic in float_l:
            df = m.discount(ic.date)
            tot += ic.amount * df
        print('float npv: %f discounted cf: %f' % (float_npv, tot))
        self.assertAlmostEqual(float_npv, tot)
Esempio n. 10
0
    def test_swap_from_market(self):
        """
        Test that a swap with fixed coupon = fair rate has an NPV=0
        Create from market
        """

        eval_date = Date(2, January, 2014)
        settings = Settings()
        settings.evaluation_date = eval_date

        calendar = TARGET()
        settlement_date = calendar.advance(eval_date, 2, Days)
        # must be a business day
        settlement_date = calendar.adjust(settlement_date)

        length = 5
        fixed_rate = .05
        floating_spread = 0.0

        m = libor_market('USD(NY)')

        quotes = [('DEP', '1W', SimpleQuote(0.0382)),
                  ('DEP', '1M', SimpleQuote(0.0372)),
                  ('DEP', '3M', SimpleQuote(0.0363)),
                  ('DEP', '6M', SimpleQuote(0.0353)),
                  ('DEP', '9M', SimpleQuote(0.0348)),
                  ('DEP', '1Y', SimpleQuote(0.0345)),
                  ('SWAP', '2Y', SimpleQuote(0.037125)),
                  ('SWAP', '3Y', SimpleQuote(0.0398)),
                  ('SWAP', '5Y', SimpleQuote(0.0443)),
                  ('SWAP', '10Y', SimpleQuote(0.05165)),
                  ('SWAP', '15Y', SimpleQuote(0.055175))]

        m.set_quotes(eval_date, quotes)

        m.bootstrap_term_structure()

        dt = Date(2, January, 2015)
        df = m.discount(dt)
        print('discount factor for %s (USD Libor): %f' % (dt, df))

        swap = m.create_fixed_float_swap(settlement_date, length, fixed_rate,
                                         floating_spread)

        fixed_l = swap.fixed_leg

        float_l = swap.floating_leg

        f = swap.fair_rate
        print('fair rate: %f' % f)
        p = swap.net_present_value
        print('NPV: %f' % p)

        fixed_npv = swap.fixed_leg_npv
        float_npv = swap.floating_leg_npv

        # verify calculation by discounting both legs
        tot = 0.0
        for frc in fixed_l:
            df = m.discount(frc.date)
            tot += frc.amount * df
        print('fixed npv: %f discounted cf: %f' % (fixed_npv, tot))
        self.assertAlmostEqual(fixed_npv, -tot)

        tot = 0.0
        for ic in float_l:
            df = m.discount(ic.date)
            tot += ic.amount * df
        print('float npv: %f discounted cf: %f' % (float_npv, tot))
        self.assertAlmostEqual(float_npv, tot)