Main Content

Workflow for Creating and Analyzing a ratecurve and parametercurve

This example shows how to create a ratecurve object and parametercurve object and analyze the curves using the associated functions.

Use ratecurve or irbootstrap to create a ratecurve object.

% Create a ratecurve
CurveSettle = datetime(2019,9,15);
Type = "zero";
ZeroTimes = [calmonths(6) calyears([1 2 3 4 5 7 10 20 30])]';
ZeroRates = [0.0052 0.0055 0.0061 0.0073 0.0094 0.0119 0.0168 0.0222 0.0293 0.0307]';
ZeroDates = CurveSettle + ZeroTimes;
myRC = ratecurve('zero',CurveSettle,ZeroDates,ZeroRates)
myRC = 
  ratecurve with properties:

                 Type: "zero"
          Compounding: -1
                Basis: 0
                Dates: [10×1 datetime]
                Rates: [10×1 double]
               Settle: 15-Sep-2019
         InterpMethod: "linear"
    ShortExtrapMethod: "next"
     LongExtrapMethod: "previous"

Use zerorates, forwardrates, or discountfactors with the ratecurve object.

% zerorates
outZeroRates = zerorates(myRC,CurveSettle+30:30:CurveSettle+720)
outZeroRates = 1×24

    0.0052    0.0052    0.0052    0.0052    0.0052    0.0052    0.0052    0.0053    0.0053    0.0054    0.0054    0.0055    0.0055    0.0056    0.0056    0.0057    0.0057    0.0058    0.0058    0.0059    0.0059    0.0060    0.0060    0.0061

% forwardrates
outForwardRates = forwardrates(myRC,datetime(2019,12,15),datetime(2021,9,15),6,7)
outForwardRates = 
0.0062
% discountfactors
outDiscountFactors = discountfactors(myRC,CurveSettle+30:30:CurveSettle+720)
outDiscountFactors = 1×24

    0.9996    0.9991    0.9987    0.9983    0.9979    0.9974    0.9970    0.9965    0.9961    0.9956    0.9951    0.9946    0.9941    0.9936    0.9931    0.9926    0.9920    0.9915    0.9910    0.9904    0.9898    0.9893    0.9887    0.9881

Use parametercurve, fitNelsonSiegel, or fitSvensson to create a parametercurve object.

% parametercurve
myPC = parametercurve('zero',datetime(2019,9,15),@(t) polyval([-0.0001 0.003 0.02],t),'Parameters',[-0.0001 0.003 0.02])
myPC = 
  parametercurve with properties:

              Type: "zero"
            Settle: 15-Sep-2019
       Compounding: -1
             Basis: 0
    FunctionHandle: @(t)polyval([-0.0001,0.003,0.02],t)
        Parameters: [-1.0000e-04 0.0030 0.0200]

% fitNelsonSiegel
Settle = datetime(2017,9,15);
  Maturity = [datetime(2019,9,15);datetime(2021,9,15); ...
      datetime(2023,9,15);datetime(2026,9,7); ...
      datetime(2035,9,15);datetime(2047,9,15)];
  
  CleanPrice = [100.1;100.1;100.8;96.6;103.3;96.3];
  CouponRate = [0.0400;0.0425;0.0450;0.0400;0.0500;0.0425];
  
  nInst = numel(CouponRate);
Bonds(nInst,1) = fininstrument.FinInstrument;
for ii=1:nInst
    Bonds(ii) = fininstrument("FixedBond","Maturity",Maturity(ii), ...
        "CouponRate",CouponRate(ii));
end

NSModel = fitNelsonSiegel(Settle,Bonds,CleanPrice)
Local minimum possible.

lsqnonlin stopped because the final change in the sum of squares relative to 
its initial value is less than the value of the function tolerance.

<stopping criteria details>
NSModel = 
  parametercurve with properties:

              Type: "zero"
            Settle: 15-Sep-2017
       Compounding: -1
             Basis: 0
    FunctionHandle: @(t)fitF(Params,t)
        Parameters: [3.4799e-08 0.0363 0.0900 16.5823]

% fitSvensson
Settle = datetime(2017,9,15);
  Maturity = [datetime(2019,9,15);datetime(2021,9,15); ...
      datetime(2023,9,15);datetime(2026,9,7); ...
      datetime(2035,9,15);datetime(2047,9,15)];
  
  CleanPrice = [100.1;100.1;100.8;96.6;103.3;96.3];
  CouponRate = [0.0400;0.0425;0.0450;0.0400;0.0500;0.0425];
  
  nInst = numel(CouponRate);
Bonds(nInst,1) = fininstrument.FinInstrument;
for ii=1:nInst
    Bonds(ii) = fininstrument("FixedBond","Maturity",Maturity(ii), ...
        "CouponRate",CouponRate(ii));
end

SvenModel = fitSvensson(Settle,Bonds,CleanPrice)
Local minimum possible.

lsqnonlin stopped because the final change in the sum of squares relative to 
its initial value is less than the value of the function tolerance.

<stopping criteria details>
SvenModel = 
  parametercurve with properties:

              Type: "zero"
            Settle: 15-Sep-2017
       Compounding: -1
             Basis: 0
    FunctionHandle: @(t)fitF(Params,t)
        Parameters: [3.2984e-08 0.0197 0.0624 0.1391 1.3563 11.7741]

Use zerorates, discountfactors, forwardrates with the myPC parametercurve object.

% zerorates
CurveSettle = datetime('15-Sep-2019');
outZeroRates = zerorates(myPC,CurveSettle+30:30:CurveSettle+720)
outZeroRates = 1×24

    0.0202    0.0205    0.0207    0.0210    0.0212    0.0215    0.0217    0.0219    0.0222    0.0224    0.0226    0.0229    0.0231    0.0233    0.0235    0.0238    0.0240    0.0242    0.0244    0.0246    0.0249    0.0251    0.0253    0.0255

% discountfactors
CurveSettle = datetime('15-Sep-2019');
outDiscountFactors = discountfactors(myPC,CurveSettle+30:30:CurveSettle+720)
outDiscountFactors = 1×24

    0.9983    0.9966    0.9949    0.9931    0.9913    0.9895    0.9876    0.9857    0.9838    0.9818    0.9798    0.9778    0.9757    0.9736    0.9715    0.9693    0.9671    0.9649    0.9627    0.9604    0.9581    0.9558    0.9534    0.9510

% forwardrates
outForwardRates = forwardrates(myPC,datetime(2019,9,15),datetime(2020,9,15),6,7)
outForwardRates = 
0.0229

Convert RateSpec to a ratecurve Object

This example shows how to convert a RateSpec to a ratecurve object.

You can create a RateSpec by using intenvset or toRateSpec from an IRDataCurve object. Then, you can convert this previously created RateSpec to a ratecurve object.

% Create a RateSpec
Settle = datetime('01-Oct-2019');
ZeroTimes = [calmonths(6) calyears([1 2 3 4 5 7 10 20 30])]';
ZeroRates = [0.0052 0.0055 0.0061 0.0073 0.0094 0.0119 0.0168 0.0222 0.0293 0.0307]';
ZeroDates = Settle + ZeroTimes;
Basis = 1;
RateSpec = intenvset('StartDates', Settle, 'EndDates', ZeroDates, ...
    'Rates', ZeroRates, 'Basis', Basis)
RateSpec = struct with fields:
           FinObj: 'RateSpec'
      Compounding: 2
             Disc: [10×1 double]
            Rates: [10×1 double]
         EndTimes: [10×1 double]
       StartTimes: [10×1 double]
         EndDates: [10×1 double]
       StartDates: 737699
    ValuationDate: 737699
            Basis: 1
     EndMonthRule: 1

Convert the RateSpec to a ratecurve.

% Convert the RateSpec to a ratecurve
myRC = ratecurve("zero",RateSpec.ValuationDate,RateSpec.EndDates,RateSpec.Rates, ...
"Compounding",RateSpec.Compounding,"Basis",RateSpec.Basis)
myRC = 
  ratecurve with properties:

                 Type: "zero"
          Compounding: 2
                Basis: 1
                Dates: [10×1 datetime]
                Rates: [10×1 double]
               Settle: 01-Oct-2019
         InterpMethod: "linear"
    ShortExtrapMethod: "next"
     LongExtrapMethod: "previous"

Check the discount factors of RateSpec and ratecurve.

% Check the discount factors
OldDF = intenvget(intenvset(RateSpec,'EndDates',datetime('01-Oct-2024')),'Disc')
OldDF = 
0.9424
NewDF = discountfactors(myRC,datetime('01-Oct-2024'))
NewDF = 
0.9424

In this case, the RateSpec and ratecurve are identical. This may not always be the case because yearfrac is used to compute times in ratecurve while date2time is used in computing a RateSpec. For more information, see Difference Between yearfrac and date2time.

See Also

| |

Topics