Рабочий процесс для создания и анализа 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.0229

Преобразуйте RateSpec к 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).

Смотрите также

| |

Похожие темы