HullWhite1F

Создайте Hull-Белую однофакторную модель

Описание

Однофакторная модель Халла-Белого задается с помощью параметров нуля, альфа и сигмы.

В частности, модель HullWhite1F определяется с помощью следующих уравнений:

dr=[θ(t)a(t)r]dt+σ(t)dW

где:

dr - изменение краткосрочной процентной ставки на небольшом интервале.

r - краткосрочная процентная ставка.

Θ(t) является функцией времени, определяющей среднее направление, в котором r движется, выбранное таким образом, чтобы движения в r соответствовали сегодняшнему кривому нулевому купонному выражению.

α - средняя скорость реверсии.

dt - это небольшое изменение во времени.

σ - ежегодное стандартное отклонение короткой скорости.

W - броуновское движение.

Создание

Описание

пример

HW1F = HullWhite1F(ZeroCurve,Alpha,Sigma) создает HullWhite1F (HW1F) объект, используя необходимые аргументы, чтобы задать Свойства.

Свойства

расширить все

Нулевая кривая, заданная как выход из IRDataCurve или RateSpec который получен из intenvset. Это нулевая кривая, используемая для развития пути будущих процентных ставок.

Типы данных: object | struct

Средняя реверсия, заданная как скаляр или указатель на функцию, которая занимает время как вход и возвращает скаляру среднее значение реверсии.

Типы данных: double

Волатильность, заданная как скаляр или указатель на функцию, которая занимает время как вход и возвращает скаляру среднюю волатильность.

Типы данных: double

Функции объекта

simTermStructsСимулируйте терминологические структуры для однофакторной модели Халла-Уайта

Примеры

свернуть все

Создайте Hull-White однофакторную модель с помощью IRDataCurve.

Settle = datenum('15-Dec-2007');
CurveTimes = [1:5 7 10 20]';
ZeroRates = [.01 .018 .024 .029 .033 .034 .035 .034]';
CurveDates = daysadd(Settle,360*CurveTimes,1);
 
irdc = IRDataCurve('Zero',Settle,CurveDates,ZeroRates);
    
alpha = .1;
sigma = .01;
 
HW1F = HullWhite1F(irdc,alpha,sigma)
HW1F = 
  HullWhite1F with properties:

    ZeroCurve: [1x1 IRDataCurve]
        Alpha: @(t,V)inAlpha
        Sigma: @(t,V)inSigma

Используйте simTermStructs метод с HullWhite1F модель для симуляции терминальных структур.

SimPaths = simTermStructs(HW1F, 10,'nTrials',100);

Создайте Hull-White однофакторную модель с помощью RateSpec.

Settle = datenum('15-Dec-2007');
CurveTimes = [1:5 7 10 20]';
ZeroRates = [.01 .018 .024 .029 .033 .034 .035 .034]';
CurveDates = daysadd(Settle,360*CurveTimes,1);
 
RateSpec = intenvset('Rates',ZeroRates,'EndDates',CurveDates,'StartDate',Settle);

alpha = .1;
sigma = .01;
 
HW1F = HullWhite1F(RateSpec,alpha,sigma)
HW1F = 
  HullWhite1F with properties:

    ZeroCurve: [1x1 IRDataCurve]
        Alpha: @(t,V)inAlpha
        Sigma: @(t,V)inSigma

Используйте simTermStructs метод с HullWhite1F модель для симуляции терминальных структур.

SimPaths = simTermStructs(HW1F, 10,'nTrials',100);

Задайте данные нулевой кривой.

Settle = datenum('4-Apr-2016');
ZeroTimes = [3/12 6/12 1 5 7 10 20 30]';
ZeroRates = [0.033 0.034 0.035 0.040 0.042 0.044 0.048 0.0475]';
ZeroDates = datemnth(Settle,ZeroTimes*12);
RateSpec = intenvset('StartDates', Settle,'EndDates', ZeroDates, 'Rates', ZeroRates)
RateSpec = struct with fields:
           FinObj: 'RateSpec'
      Compounding: 2
             Disc: [8x1 double]
            Rates: [8x1 double]
         EndTimes: [8x1 double]
       StartTimes: [8x1 double]
         EndDates: [8x1 double]
       StartDates: 736424
    ValuationDate: 736424
            Basis: 0
     EndMonthRule: 1

Определите параметры связи.

Maturity = datemnth(Settle,12*5);
CouponRate = 0;

Задайте параметры Hull-White.

alpha = .1;
sigma = .01;
HW1F = HullWhite1F(RateSpec,alpha,sigma)
HW1F = 
  HullWhite1F with properties:

    ZeroCurve: [1x1 IRDataCurve]
        Alpha: @(t,V)inAlpha
        Sigma: @(t,V)inSigma

Определите параметры симуляции.

nTrials = 100;
nPeriods = 12*5;
deltaTime = 1/12;
SimZeroCurvePaths = simTermStructs(HW1F, nPeriods,'nTrials',nTrials,'deltaTime',deltaTime);
SimDates = datemnth(Settle,1:nPeriods);

Предварительно выделите и инициализируйте для симуляции.

SimBondPrice = zeros(nPeriods+1,nTrials);
SimBondPrice(1,:,:) = bondbyzero(RateSpec,CouponRate,Settle,Maturity);
SimBondPrice(end,:,:) = 100;

Вычислите значения связи для каждой даты симуляции и пути, обратите внимание, что можно векторизировать по пробной размерности.

for periodidx=1:nPeriods-1
    simRateSpec = intenvset('StartDate',SimDates(periodidx),'EndDates',...
        datemnth(SimDates(periodidx),ZeroTimes*12),'Rates',squeeze(SimZeroCurvePaths(periodidx+1,:,:)));
    SimBondPrice(periodidx+1,:) = bondbyzero(simRateSpec,CouponRate,SimDates(periodidx),Maturity);
end

plot([Settle SimDates],SimBondPrice)
datetick
ylabel('Bond Price')
xlabel('Simulation Dates')
title('Simulated Bond Price')

Figure contains an axes. The axes with title Simulated Bond Price contains 100 objects of type line.

Задайте данные нулевой кривой.

Settle = datenum('4-Apr-2016');
ZeroTimes = [3/12 6/12 1 5 7 10 20 30]';
ZeroRates = [-0.01 -0.009 -0.0075 -0.003 -0.002 -0.001 0.002 0.0075]';
ZeroDates = datemnth(Settle,ZeroTimes*12);
RateSpec = intenvset('StartDates', Settle,'EndDates', ZeroDates, 'Rates', ZeroRates)
RateSpec = struct with fields:
           FinObj: 'RateSpec'
      Compounding: 2
             Disc: [8x1 double]
            Rates: [8x1 double]
         EndTimes: [8x1 double]
       StartTimes: [8x1 double]
         EndDates: [8x1 double]
       StartDates: 736424
    ValuationDate: 736424
            Basis: 0
     EndMonthRule: 1

Определите параметры облигаций для пяти облигаций в портфеле.

Maturity = datemnth(Settle,12*5);  % All bonds have the same maturity
CouponRate = [0.035;0.04;0.02;0.015;0.042];  % Different coupon rates for the bonds
nBonds = length(CouponRate);

Задайте параметры Hull-White.

alpha = .1;
sigma = .01;
HW1F = HullWhite1F(RateSpec,alpha,sigma)
HW1F = 
  HullWhite1F with properties:

    ZeroCurve: [1x1 IRDataCurve]
        Alpha: @(t,V)inAlpha
        Sigma: @(t,V)inSigma

Определите параметры симуляции.

nTrials = 1000;
nPeriods = 12*5;
deltaTime = 1/12;
SimZeroCurvePaths = simTermStructs(HW1F, nPeriods,'nTrials',nTrials,'deltaTime',deltaTime);
SimDates = datemnth(Settle,1:nPeriods);

Предварительно выделите и инициализируйте для симуляции.

SimBondPrice = zeros(nPeriods+1,nBonds,nTrials);
SimBondPrice(1,:,:) = repmat(bondbyzero(RateSpec,CouponRate,Settle,Maturity)',[1 1 nTrials]);
SimBondPrice(end,:,:) = 100;

[BondCF,BondCFDates,~,CFlowFlags] = cfamounts(CouponRate,Settle,Maturity);
BondCF(CFlowFlags == 4) = BondCF(CFlowFlags == 4) - 100;
SimBondCF = zeros(nPeriods+1,nBonds,nTrials);

Вычислите значения облигаций для каждой даты и пути симуляции. Обратите внимание, что вы можете векторизировать по пробной размерности.

for periodidx=1:nPeriods
    if periodidx < nPeriods
        simRateSpec = intenvset('StartDate',SimDates(periodidx),'EndDates',...
            datemnth(SimDates(periodidx),ZeroTimes*12),'Rates',squeeze(SimZeroCurvePaths(periodidx+1,:,:)));
        SimBondPrice(periodidx+1,:,:) = bondbyzero(simRateSpec,CouponRate,SimDates(periodidx),Maturity);
    end
    
    simidx = SimDates(periodidx) == BondCFDates;
    SimCF = zeros(1,nBonds);
    SimCF(any(simidx,2)) = BondCF(simidx);
    ReinvestRate = 1 + SimZeroCurvePaths(periodidx+1,1,:);
    SimBondCF(periodidx+1,:,:) = bsxfun(@times,bsxfun(@plus,SimBondCF(periodidx,:,:),SimCF),ReinvestRate);
end

Вычислите общую последовательность возвратов.

TotalCF = SimBondPrice + SimBondCF;

Предположим, что портфель облигаций одинаково взвешен, и постройте график моделируемых возвратов портфеля облигаций.

TotalCF = squeeze(sum(TotalCF,2));

TotRetSeries = bsxfun(@rdivide,TotalCF(2:end,:),TotalCF(1,:)) - 1;
plot(SimDates,TotRetSeries)
datetick
ylabel('Bond Portfolio Returns')
xlabel('Simulation Dates')
title('Simulated Bond Portfolio Returns')

Figure contains an axes. The axes with title Simulated Bond Portfolio Returns contains 1000 objects of type line.

Подробнее о

расширить все

Ссылки

[1] Бриго, Д. и Ф. Меркурио. Модели процентных ставок - теория и практика. Springer Finance, 2006.

[2] Hull, J. Options, Futures и другие производные. Prentice Hall, 2011.

Введенный в R2013a