The following example demonstrates analyzing German Euro-Bund
futures traded on Eurex. However,
bndfutimprepo apply to bond futures in the
U.S., U.K., Germany, and Japan. The workflow for this analysis is:
Calculate bond conversion factors.
Calculate implied repo rates to find the CTD bond.
Price the bond future using the term implied repo rate.
Use conversion factors to normalize the price of a particular
bond for delivery in a futures contract. When using conversion factors,
the assumption is that a bond for delivery has a 6% coupon. Use
convfactor to calculate conversion factors
for all bond futures from the U.S., Germany, Japan, and U.K.
For example, conversion factors for Euro-Bund futures on Eurex
are listed at
The delivery date for Euro-Bund futures is the 10th day of the month,
as opposed to bond futures in the U.S., where the short position has
the option of choosing when to deliver the bond.
For the 4% bond, compute the conversion factor with:
CF1 = convfactor('10-Sep-2009','04-Jul-2018', .04,.06,3)
CF1 = 0.8659
This syntax for
convfactor works fine for
bonds with standard coupon periods. However, some deliverable bonds
have long or short first coupon periods. Compute the conversion factors
for such bonds using the optional input parameters
Specify all optional input arguments for
CF2 = convfactor('10-Sep-2009','04-Jan-2019', .0375,'Convention',3,'startdate',... datenum('14-Nov-2008'))
CF2 = 0.8426
To determine the availability of the cheapest bond for deliverable
bonds against a futures contract, compute the implied repo rate for
each bond. The bond with the highest repo rate is the cheapest because
it has the lowest initial value, thus yielding a higher return, provided
you deliver it with the stated futures price. Use
bndfutimprepo to calculate repo rates:
% Bond Properties CouponRate = [.0425;.0375;.035]; Maturity = [datenum('04-Jul-2018');datenum('04-Jan-2019');datenum('04-Jul-2019')]; CF = [0.882668;0.842556;0.818193]; Price = [105.00;100.89;98.69]; % Futures Properties FutSettle = '09-Jun-2009'; FutPrice = 118.54; Delivery = '10-Sep-2009'; % Note that the default for BNDFUTIMPREPO is for the bonds to be % semi-annual with a day count basis of 0. Since these are German % bonds, we need to have a Basis of 8 and a Period of 1 ImpRepo = bndfutimprepo(Price, FutPrice, FutSettle, Delivery, CF, ... CouponRate, Maturity,'Basis',8,'Period',1)
ImpRepo = 0.0261 -0.0022 -0.0315
bndfutprice to perform
price calculations for all bond futures from the U.S., Germany, Japan,
and U.K. To price the bond, given a term repo rate:
% Assume a term repo rate of .0091; RepoRate = .0091; [FutPrice,AccrInt] = bndfutprice(RepoRate, Price(1), FutSettle,... Delivery, CF(1), CouponRate(1), Maturity(1),... 'Basis',8,'Period',1)
FutPrice = 118.0126 AccrInt = 0.7918