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