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