HullWhite1F

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

Описание

Белая как оболочка одна факторная модель задана с помощью кривой нулевой ширины, альфы и параметров сигмы.

А именно, модель 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Симулируйте структуры термина для Белой как оболочка одной факторной модели

Примеры

свернуть все

Создайте Белую как оболочка одну факторную модель с помощью 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);

Создайте Белую как оболочка одну факторную модель с помощью 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;

Задайте Белые как оболочка параметры.

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')

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

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);

Задайте Белые как оболочка параметры.

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')

Больше о

развернуть все

Ссылки

[1] Brigo, D. и Ф. Меркурио. Модели процентной ставки - теория и практика. Финансы Спрингера, 2006.

[2] Оболочка, J. Опции, фьючерсы и другие производные. Prentice Hall, 2011.

Введенный в R2013a