Workflow for Creating and Analyzing a ratecurve
and
parametercurve
Use ratecurve
or irbootstrap
to create a
ratecurve
object.
% Create a ratecurve Settle = 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 = Settle + ZeroTimes; myRC = ratecurve('zero',Settle,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.
CurveSettle = datetime(2019,9,15); % zerorates outZeroRates = zerorates(myRC,CurveSettle+30:30:CurveSettle+720) % forwardrates outForwardRates = forwardrates(myRC,datetime(2019,12,15),datetime(2021,9,15),6,7) % discountfactors outDiscountFactors = discountfactors(myRC,CurveSettle+30:30:CurveSettle+720)
outZeroRates = Columns 1 through 14 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 Columns 15 through 24 0.0056 0.0057 0.0057 0.0058 0.0058 0.0059 0.0059 0.0060 0.0060 0.0061 outForwardRates = 0.0062 outDiscountFactors = Columns 1 through 14 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 Columns 15 through 24 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)
NSModel = parametercurve with properties: Type: "zero" Settle: 15-Sep-2017 Compounding: -1 Basis: 0 FunctionHandle: @(t)fitF(Params,t) Parameters: [1.2473e-05 0.0362 0.0903 16.4263]
% 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)
SvenModel = parametercurve with properties: Type: "zero" Settle: 15-Sep-2017 Compounding: -1 Basis: 0 FunctionHandle: @(t)fitF(Params,t) Parameters: [2.2821 -41.8873 41.4090 -5.9589 0.3255 3.2356]
Use zerorates
,
discountfactors
, forwardrates
with the myPC
parametercurve
object.
% zerorates CurveSettle = datetime('15-Sep-2019'); outZeroRates = zerorates(myPC,CurveSettle+30:30:CurveSettle+720) % discountfactors CurveSettle = datetime('15-Sep-2019'); outDiscountFactors = discountfactors(myPC,CurveSettle+30:30:CurveSettle+720) % forwardrates outForwardRates = forwardrates(myPC,datetime(2019,9,15),datetime(2020,9,15),6,7)
outZeroRates = Columns 1 through 14 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 Columns 15 through 24 0.0235 0.0238 0.0240 0.0242 0.0244 0.0246 0.0249 0.0251 0.0253 0.0255 outDiscountFactors = Columns 1 through 14 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 Columns 15 through 24 0.9715 0.9693 0.9671 0.9649 0.9627 0.9604 0.9581 0.9558 0.9534 0.9510 outForwardRates = 0.0229
Convert RateSpec
to a ratecurve
Object
You can create a RateSpec
using intenvset
or toRateSpec
from an
IRDataCurve
object. Then,
you can covert this previously created RateSpec
to a ratecurve
object.
% Assume there is 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 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 OldDF = intenvget(intenvset(RateSpec,'EndDates',datetime('01-Oct-2024')),'Disc') NewDF = discountfactors(myRC,datetime('01-Oct-2024'))
OldDF = 0.9424 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