Подбор кривой модели Диболда-Ли

Этот пример показывает, как создать модель Диболда-Ли кривой выражения США для каждого месяца с 1990 по 2010 год. Этот пример также демонстрирует, как предсказать будущие кривые выражения, подгоняя авторегрессивную модель к временным рядам каждого параметра.

С бумагой можно ознакомиться здесь:

https://www.nber.org/papers/w10048

Загрузка данных

Используемыми данными являются ежемесячные выражений казначейства с 1990 по 2010 год для теноров 1 Мо, 3 Мо, 6 Мо, 1 год, 2 года, 3 года, 5 лет, 7 лет, 10 лет, 20 лет, 30 лет.

С ежедневными данными можно ознакомиться здесь:

https://www.treasury.gov/resource-center/data-chart-center/interest-rates/Pages/TextView.aspx?data=yieldAll

Данные хранятся в файле данных MATLAB ® как MATLAB dataset объект.

load Data_USYieldCurve

% Extract data for the last day of each month
MonthYearMat = repmat((1990:2010)',1,12)';
EOMDates = lbusdate(MonthYearMat(:),repmat((1:12)',21,1));
MonthlyIndex = find(ismember(Dataset.Properties.ObsNames,datestr(EOMDates)));
Estimationdataset = Dataset(MonthlyIndex,:);
EstimationData = double(Estimationdataset);

Модель Диболда-Ли

Diebold и Li начинают с модели Нельсона Зигеля

y=β0+(β1+β2)τm(1-e-mτ)-β2e-mτ

и переписать его следующим образом:

yt(τ)=β1t+β2t(1-e-λtτλtτ)+β3t(1-e-λtτλtτ-e-λtτ)

Вышеуказанная модель позволяет интерпретировать факторы следующим образом: Beta1 соответствует долгосрочной перспективе/уровню кривой выражения, Beta2 соответствует краткосрочной перспективе/наклону, а Beta3 соответствует среднесрочной перспективе/кривизне. λ определяет зрелость, при которой загрузка на кривизну максимизируется, и управляет экспоненциальной скоростью распада модели.

Диболд и Ли выступают за настройку λ максимизация загрузки по среднесрочному фактору, Beta3, через 30 месяцев. Это также преобразует задачу из нелинейного подбора кривой в простую линейную регрессию.

% Explicitly set the time factor lambda
lambda_t = .0609;

% Construct a matrix of the factor loadings
% Tenors associated with data
TimeToMat = [3 6 9 12 24 36 60 84 120 240 360]';
X = [ones(size(TimeToMat)) (1 - exp(-lambda_t*TimeToMat))./(lambda_t*TimeToMat) ...
    ((1 - exp(-lambda_t*TimeToMat))./(lambda_t*TimeToMat) - exp(-lambda_t*TimeToMat))];

% Plot the factor loadings
plot(TimeToMat,X)
title('Factor Loadings for Diebold Li Model with time factor of .0609')
xlabel('Maturity (months)')
ylim([0 1.1])
legend({'Beta1','Beta2','Beta3'},'location','east')

Figure contains an axes. The axes with title Factor Loadings for Diebold Li Model with time factor of .0609 contains 3 objects of type line. These objects represent Beta1, Beta2, Beta3.

Подбор модели

A DieboldLi объект разработан, чтобы облегчить подбор кривой модели по данным о выражении. The DieboldLi объект наследует от IRCurve объект, поэтому getZeroRates, getDiscountFactors, getParYields, getForwardRates, и toRateSpec все методы реализованы. Кроме того, метод fitYieldsFromBetas реализуется для оценки параметров, заданных параметром lambda для наблюдаемых выражений на рынке.

The DieboldLi объект используется для подгонки модели Диболда-Ли для каждого месяца с 1990 по 2010 год.

% Preallocate the Betas
Beta = zeros(size(EstimationData,1),3);

% Loop through and fit each end of month yield curve
for jdx = 1:size(EstimationData,1)
    tmpCurveModel = DieboldLi.fitBetasFromYields(EOMDates(jdx),lambda_t*12,daysadd(EOMDates(jdx),30*TimeToMat),EstimationData(jdx,:)');
    Beta(jdx,:) = [tmpCurveModel.Beta1 tmpCurveModel.Beta2 tmpCurveModel.Beta3];
end

Подгонка Diebold Li в выбранные даты включена здесь

PlotSettles = datenum({'30-May-1997','31-Aug-1998','29-Jun-2001','31-Oct-2005'});
figure
for jdx = 1:length(PlotSettles)
    subplot(2,2,jdx)
    tmpIdx = find(strcmpi(Estimationdataset.Properties.ObsNames,datestr(PlotSettles(jdx))));
    tmpCurveModel = DieboldLi.fitBetasFromYields(PlotSettles(jdx),lambda_t*12,...
        daysadd(PlotSettles(jdx),30*TimeToMat),EstimationData(tmpIdx,:)');
    scatter(daysadd(PlotSettles(jdx),30*TimeToMat),EstimationData(tmpIdx,:))
    hold on
    PlottingDates = (PlotSettles(jdx)+30:30:PlotSettles(jdx)+30*360)';
    plot(PlottingDates,tmpCurveModel.getParYields(PlottingDates),'r-')
    title(['Yield Curve on ' datestr(PlotSettles(jdx))])
    datetick
end

Figure contains 4 axes. Axes 1 with title Yield Curve on 30-May-1997 contains 2 objects of type scatter, line. Axes 2 with title Yield Curve on 31-Aug-1998 contains 2 objects of type scatter, line. Axes 3 with title Yield Curve on 29-Jun-2001 contains 2 objects of type scatter, line. Axes 4 with title Yield Curve on 31-Oct-2005 contains 2 objects of type scatter, line.

Прогнозирование

Модель Диболда-Ли может использоваться, чтобы предсказать будущие кривые выражения. Диболд и Ли предлагают подгонку модели AR (1) к временным рядам каждого параметра Беты. Эта подобранная модель может затем использоваться, чтобы предсказать будущие значения каждого параметра и, кроме того, будущие кривые выражения.

В данном примере функция MATLAB regress используется для оценки параметров для модели AR (1) для каждой беты.

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

The MonthsLag переменная может быть скорректирована, чтобы сделать различные прогнозы периода впереди. Для примера измените значение на 1 на 6 изменит прогноз с 1 месяца вперед на 6 месяцев вперед.

MonthsLag = 1;

[tmpBeta,bint] = regress(Beta(MonthsLag+1:end,1),[ones(size(Beta(MonthsLag+1:end,1))) Beta(1:end-MonthsLag,1)]);
ForecastBeta(1,1) = [1 Beta(end,1)]*tmpBeta;
ForecastBeta_Down(1,1) = [1 Beta(end,1)]*bint(:,1);
ForecastBeta_Up(1,1) = [1 Beta(end,1)]*bint(:,2);
[tmpBeta,bint]  = regress(Beta(MonthsLag+1:end,2),[ones(size(Beta(MonthsLag+1:end,2))) Beta(1:end-MonthsLag,2)]);
ForecastBeta(1,2) = [1 Beta(end,2)]*tmpBeta;
ForecastBeta_Down(1,2) = [1 Beta(end,2)]*bint(:,1);
ForecastBeta_Up(1,2) = [1 Beta(end,2)]*bint(:,2);
[tmpBeta,bint]  = regress(Beta(MonthsLag+1:end,3),[ones(size(Beta(MonthsLag+1:end,3))) Beta(1:end-MonthsLag,3)]);
ForecastBeta(1,3) = [1 Beta(end,3)]*tmpBeta;
ForecastBeta_Down(1,3) = [1 Beta(end,3)]*bint(:,1);
ForecastBeta_Up(1,3) = [1 Beta(end,3)]*bint(:,2);

% Forecasted yield curve
figure
Settle = daysadd(EOMDates(end),30*MonthsLag);
DieboldLi_Forecast = DieboldLi('ParYield',Settle,[ForecastBeta lambda_t*12]);
DieboldLi_Forecast_Up = DieboldLi('ParYield',Settle,[ForecastBeta_Up lambda_t*12]);
DieboldLi_Forecast_Down = DieboldLi('ParYield',Settle,[ForecastBeta_Down lambda_t*12]);
PlottingDates = (Settle+30:30:Settle+30*360)';
plot(PlottingDates,DieboldLi_Forecast.getParYields(PlottingDates),'b-')
hold on
plot(PlottingDates,DieboldLi_Forecast_Up.getParYields(PlottingDates),'r-')
plot(PlottingDates,DieboldLi_Forecast_Down.getParYields(PlottingDates),'r-')
title(['Diebold Li Forecasted Yield Curves on ' datestr(EOMDates(end)) ' for '  datestr(Settle)])
legend({'Forecasted Curve','Additional Scenarios'},'location','southeast')
datetick

Figure contains an axes. The axes with title Diebold Li Forecasted Yield Curves on 31-Dec-2010 for 30-Jan-2011 contains 3 objects of type line. These objects represent Forecasted Curve, Additional Scenarios.

Библиография

Этот пример основан на следующей статье:

[1] Francis X. Diebold, Canlin Li, Прогнозирование срочной структуры выражений государственных облигаций, Журнал эконометрики, Том 130, Выпуск 2, Февраль 2006, Страницы 337-364