ratecurve и parametercurveИспользуйте ratecurve или irbootstrap создать ratecurve объект.
% 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"Используйте zerorates, forwardrates, или discountfactors с ratecurve объект.
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Используйте parametercurve, fitNelsonSiegel, или fitSvensson создать parametercurve объект.
% 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]Используйте zerorates, discountfactors, forwardrates с myPC
parametercurve объект.
% 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.0229RateSpec к ratecurve ОбъектМожно создать RateSpec использование intenvset или toRateSpec от IRDataCurve объект. Затем вы можете тайный этот ранее созданный RateSpec к ratecurve объект.
% 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
В этом случае, RateSpec и ratecurve идентичны. Это не может всегда иметь место потому что yearfrac использованные для расчета времена в ratecurve в то время как date2time используется в вычислении RateSpec. Для получения дополнительной информации смотрите Различие Между yearfrac и date2time (Financial Toolbox).
fininstrument | finmodel | finpricer