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
fininstrument | finmodel | finpricer