Interest Rate Swaps
Swap Pricing Assumptions
Financial Instruments Toolbox™ contains the function liborfloat2fixed
, which computes a fixed-rate
par yield that equates the floating-rate side of a swap to the fixed-rate
side. The solver sets the present value of the fixed side to the present
value of the floating side without having to line up and compare fixed
and floating periods.
Assumptions on Floating-Rate Input
Rates are quarterly, for example, that of Eurodollar futures.
Effective date is the first third Wednesday after the settlement date.
All delivery dates are spaced 3 months apart.
All periods start on the third Wednesday of delivery months.
All periods end on the same dates of delivery months, 3 months after the start dates.
Accrual basis of floating rates is actual/360.
Applicable forward rates are estimated by interpolation in months when forward-rate data is not available.
Assumptions on Fixed-Rate Output
Design allows you to create a bond of any coupon, basis, or frequency, based on the floating-rate input.
The start date is a valuation date, that is, a date when an agreement to enter into a contract by the settlement date is made.
Settlement can be on or after the start date. If it is after, a forward fixed-rate contract results.
Effective date is assumed to be the first third Wednesday after settlement, the same date as that of the floating rate.
The end date of the bond is a designated number of years away, on the same day and month as the effective date.
Coupon payments occur on anniversary dates. The frequency is determined by the period of the bond.
Fixed rates are not interpolated. A fixed-rate bond of the same present value as that of the floating-rate payments is created.
Swap Pricing
This example shows how to compute the fixed rate applicable to a series of 2-, 5-, and 10-year swaps based on Eurodollar market data.
According to the Chicago Mercantile Exchange (https://www.cmegroup.com), Eurodollar data on Friday, October 11, 2002, was as shown in the following table.
Eurodollar Data on Friday, October 11, 2002
Month | Year | Settle |
---|---|---|
10 | 2002 | 98.21 |
11 | 2002 | 98.26 |
12 | 2002 | 98.3 |
1 | 2003 | 98.3 |
2 | 2003 | 98.31 |
3 | 2003 | 98.275 |
6 | 2003 | 98.12 |
9 | 2003 | 97.87 |
12 | 2003 | 97.575 |
3 | 2004 | 97.26 |
6 | 2004 | 96.98 |
9 | 2004 | 96.745 |
12 | 2004 | 96.515 |
3 | 2005 | 96.33 |
6 | 2005 | 96.135 |
9 | 2005 | 95.955 |
12 | 2005 | 95.78 |
3 | 2006 | 95.63 |
6 | 2006 | 95.465 |
9 | 2006 | 95.315 |
12 | 2006 | 95.16 |
3 | 2007 | 95.025 |
6 | 2007 | 94.88 |
9 | 2007 | 94.74 |
12 | 2007 | 94.595 |
3 | 2008 | 94.48 |
6 | 2008 | 94.375 |
9 | 2008 | 94.28 |
12 | 2008 | 94.185 |
3 | 2009 | 94.1 |
6 | 2009 | 94.005 |
9 | 2009 | 93.925 |
12 | 2009 | 93.865 |
3 | 2010 | 93.82 |
6 | 2010 | 93.755 |
9 | 2010 | 93.7 |
12 | 2010 | 93.645 |
3 | 2011 | 93.61 |
6 | 2011 | 93.56 |
9 | 2011 | 93.515 |
12 | 2011 | 93.47 |
3 | 2012 | 93.445 |
6 | 2012 | 93.41 |
9 | 2012 | 93.39 |
Using this data, you can compute 1-, 2-, 3-, 4-, 5-, 7-, and 10-year swap rates with the toolbox function liborfloat2fixed
. The function requires you to input only Eurodollar data, the settlement date, and tenor of the swap. MATLAB software then performs the required computations. The function requires you to input only Eurodollar data, the settlement date, and tenor of the swap. MATLAB® software then performs the required computations.
To illustrate how this function works, first load the data contained in the supplied Excel® worksheet EDdata.xls
.
[EDRawData, textdata] = xlsread('EDdata.xls');
Extract the month from the first column and the year from the second column. The rate used as proxy is the arithmetic average of rates on opening and closing.
Month = EDRawData(:,1); Year = EDRawData(:,2); IMMData = (EDRawData(:,4)+EDRawData(:,6))/2; EDFutData = [Month, Year, IMMData]
EDFutData = 44×3
103 ×
0.0100 2.0020 0.0982
0.0110 2.0020 0.0983
0.0120 2.0020 0.0983
0.0010 2.0030 0.0983
0.0020 2.0030 0.0983
0.0030 2.0030 0.0983
0.0060 2.0030 0.0982
0.0090 2.0030 0.0979
0.0120 2.0030 0.0976
0.0030 2.0040 0.0973
0.0060 2.0040 0.0970
0.0090 2.0040 0.0968
0.0120 2.0040 0.0966
0.0030 2.0050 0.0964
0.0060 2.0050 0.0962
⋮
Next, input the current date.
Settle = datetime(2002,10,11);
To compute for the 2-year swap rate, set the tenor to 2
.
Tenor = 2;
Compute the swap rate with liborfloat2fixed
.
[FixedSpec, ForwardDates, ForwardRates] = ... liborfloat2fixed(EDFutData, Settle, Tenor)
FixedSpec = struct with fields:
Coupon: 0.0223
Settle: '16-Oct-2002'
Maturity: '16-Oct-2004'
Period: 4
Basis: 1
ForwardDates = 8×1
731505
731596
731687
731778
731869
731967
732058
732149
ForwardRates = 8×1
0.0178
0.0168
0.0171
0.0189
0.0216
0.0250
0.0280
0.0306
MATLAB® returns a par-swap rate of 2.23% using the default setting (quarterly compounding and 30/360 accrual), and forward dates and rates data (quarterly compounded).
In the FixedSpec
output, note that the swap rate actually goes forward from the third Wednesday of October 2002 (October 16, 2002), 5 days after the original Settle
input (October 11, 2002). This, however, is still the best proxy for the swap rate on Settle
, as the assumption merely starts the swap's effective period and does not affect its valuation method or its length.
The correction suggested by Hull and White improves the result by turning on convexity adjustment as part of the input to liborfloat2fixed. (See Hull, J., Options, Futures, and Other Derivatives, 4th Edition, Prentice-Hall, 2000.) For a long swap, for example, five years or more, this correction could prove to be large.
The adjustment requires additional parameters:
StartDate
, which you make the same asSettle
(the default) by providing an empty matrix[]
as input.ConvexAdj
to tellliborfloat2fixed
to perform the adjustment.RateParam
, which provides the parametersa
andS
as input to the Hull-White short rate process.Optional parameters
InArrears
andSigma
, for which you can use empty matrices[]
to accept the MATLAB® defaults.FixedCompound
, with which you can facilitate comparison with values cited in Table H15 of Federal Reserve Statistical Release by turning the default quarterly compounding into semiannual compounding, with the (default) basis of 30/360.
StartDate = []; Interpolation = []; ConvexAdj = 1; RateParam = [0.03; 0.017]; FixedCompound = 2; [FixedSpec, ForwardDaates, ForwardRates] = ... liborfloat2fixed(EDFutData, Settle, Tenor, StartDate, ... Interpolation, ConvexAdj, RateParam, [], [], FixedCompound)
FixedSpec = struct with fields:
Coupon: 0.0221
Settle: '16-Oct-2002'
Maturity: '16-Oct-2004'
Period: 2
Basis: 1
ForwardDaates = 8×1
731505
731596
731687
731778
731869
731967
732058
732149
ForwardRates = 8×1
0.0178
0.0167
0.0170
0.0188
0.0214
0.0246
0.0275
0.0300
This returns 2.21% as the 2-year swap rate, quite close to the reported swap rate for that date.
Analogously, the following table summarizes the solutions for 1-, 3-, 5-, 7-, and 10-year swap rates (convexity-adjusted and unadjusted).
Calculated and Market Average Data of Swap Rates on Friday, October 11, 2002
Swap Length (Years) | Unadjusted | Adjusted | Table H15 | Adjusted Error (Basis Points) |
---|---|---|---|---|
1 | 1.80% | 1.79% | 1.80% | -1 |
2 | 2.24% | 2.21% | 2.22% | -1 |
3 | 2.70% | 2.66% | 2.66% | 0 |
4 | 3.12% | 3.03% | 3.04% | -1 |
5 | 3.50% | 3.37% | 3.36% | +1 |
7 | 4.16% | 3.92% | 3.89% | +3 |
10 | 4.87% | 4.42% | 4.39% | +3 |
You can use these results further, such as for hedging a portfolio. The liborduration
function provides a duration-hedging capability. You can isolate assets (or liabilities) from interest-rate risk exposure with a swap arrangement.
Suppose that you own a bond with these characteristics:
$100 million face value
7% coupon paid semiannually
5% yield to maturity
Settlement on October 11, 2002
Maturity on January 15, 2010
Interest accruing on an actual/365 basis
Use of the bnddury
function shows a modified duration of 5.6806 years.
To immunize this asset, you can enter into a pay-fixed swap, specifically a swap in the amount of notional principal (Ns) such that Ns*SwapDuration + $100M*5.6806 = 0 (or Ns = -100*5.6806/SwapDuration).
Suppose again, you choose to use a 5-, 7-, or 10-year swap (3.37%, 3.92%, and 4.42% from the previous table) as your hedging tool.
SwapFixRate = [0.0337; 0.0392; 0.0442];
Tenor = [5; 7; 10];
Settle = '11-Oct-2002';
PayFixDuration = liborduration(SwapFixRate, Tenor, Settle)
PayFixDuration = 3×1
-3.6835
-4.7307
-6.0661
This gives a duration of -3.6835, -4.7307, and -6.0661 years for 5-, 7-, and 10-year swaps. The corresponding notional amount is computed by
Ns = -100*5.6806./PayFixDuration
Ns = 3×1
154.2163
120.0786
93.6443
The notional amount entered in pay-fixed side of the swap instantaneously immunizes the portfolio.
See Also
liborfloat2fixed
| liborduration
| liborprice