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

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

Бумага может быть найдена здесь:

https://www.sas.upenn.edu/~fdiebold/papers/paper49/Diebold-Li.pdf

Загрузите данные

Используемыми данными является ежемесячная доходность казначейских облигаций США от 1 990 до 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);

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

Диболд и Ли запускают с модели Нельсона Зигеля

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

Соответствуйте модели

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

Объект DieboldLi используется, чтобы соответствовать Модели Диболда-Ли в течение каждого месяца от 1 990 до 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

Подгонки Диболда Ли в выбранные даты включены здесь

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

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

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

Для этого примера функция MATLAB regress используется, чтобы оценить параметры для модели AR (1) для каждой Беты.

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

Переменная 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

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

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

[1] Фрэнсис Кс. Диболд, Кэнлин Ли, Предсказывая термин структура урожаев государственной облигации, Журнал Эконометрики, Объем 130, Выпуск 2, февраль 2006, Страницы 337-364