Этот пример показывает, как создать модель Диболда-Ли кривой выражения США для каждого месяца с 1990 по 2010 год. Этот пример также демонстрирует, как предсказать будущие кривые выражения, подгоняя авторегрессивную модель к временным рядам каждого параметра.
С бумагой можно ознакомиться здесь:
https://www.nber.org/papers/w10048
Используемыми данными являются ежемесячные выражений казначейства с 1990 по 2010 год для теноров 1 Мо, 3 Мо, 6 Мо, 1 год, 2 года, 3 года, 5 лет, 7 лет, 10 лет, 20 лет, 30 лет.
С ежедневными данными можно ознакомиться здесь:
Данные хранятся в файле данных 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 начинают с модели Нельсона Зигеля
и переписать его следующим образом:
Вышеуказанная модель позволяет интерпретировать факторы следующим образом: 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')
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
Модель Диболда-Ли может использоваться, чтобы предсказать будущие кривые выражения. Диболд и Ли предлагают подгонку модели 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
Этот пример основан на следующей статье:
[1] Francis X. Diebold, Canlin Li, Прогнозирование срочной структуры выражений государственных облигаций, Журнал эконометрики, Том 130, Выпуск 2, Февраль 2006, Страницы 337-364