Main Content

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 Example

This example shows the use of the functions in computing 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.

Note

This example illustrates swap calculations in MATLAB® software. Timing of the data set used was not rigorously examined and was assumed to be the proxy for the swap rate reported on October 11, 2002.

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.

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 =

   1.0e+03 *

    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
    0.0090    2.0050    0.0960
    0.0120    2.0050    0.0958
    0.0030    2.0060    0.0957
    0.0060    2.0060    0.0955
    0.0090    2.0060    0.0954
    0.0120    2.0060    0.0952
    0.0030    2.0070    0.0951
    0.0060    2.0070    0.0949
    0.0090    2.0070    0.0948
    0.0120    2.0070    0.0946
    0.0030    2.0080    0.0945
    0.0060    2.0080    0.0944
    0.0090    2.0080    0.0943
    0.0120    2.0080    0.0942
    0.0030    2.0090    0.0941
    0.0060    2.0090    0.0940
    0.0090    2.0090    0.0939
    0.0120    2.0090    0.0939
    0.0030    2.0100    0.0938
    0.0060    2.0100    0.0937
    0.0090    2.0100    0.0937
    0.0120    2.0100    0.0936
    0.0030    2.0110    0.0936
    0.0060    2.0110    0.0935
    0.0090    2.0110    0.0935
    0.0120    2.0110    0.0935
    0.0030    2.0120    0.0934
    0.0060    2.0120    0.0934
    0.0090    2.0120    0.0934

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;

Finally, compute the swap rate with liborfloat2fixed.

[FixedSpec, ForwardDates, ForwardRates] = ... 
liborfloat2fixed(EDFutData, Settle, Tenor)

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

FixedSpec = 

       Coupon: 0.0223
       Settle: '16-Oct-2002'
     Maturity: '16-Oct-2004'
       Period: 4
        Basis: 1

ForwardDates =

      731505
      731596
      731687
      731778
      731869
      731967
      732058
      732149

ForwardRates =

    0.0178
    0.0168
    0.0171
    0.0189
    0.0216
    0.0250
    0.0280
    0.0306

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 as Settle (the default) by providing an empty matrix [] as input.

  • ConvexAdj to tell liborfloat2fixed to perform the adjustment.

  • RateParam, which provides the parameters a and S as input to the Hull-White short rate process.

  • Optional parameters InArrears and Sigma, 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)
    

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

Portfolio Hedging

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 from Financial Toolbox™ software 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.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 =

  154.2163
  120.0786
   93.6443

The notional amount entered in pay-fixed side of the swap instantaneously immunizes the portfolio.

See Also

| |

Related Examples

More About