本例显示了如何构建1990年至2010年每个月美国收益率曲线的Diebold-Li模型。该示例还演示了如何通过将自回归模型拟合到每个参数的时间序列来预测未来收益率曲线。
该文件可在此处找到:
https://www.nber.org/papers/w10048
使用的数据是1990年至2010年1个月、3个月、6个月、1个月、2个月、3个月、5个月、7个月、10个月、20个月、30个月期限的月度国债收益率。
每日数据可在此找到:
数据作为MATLAB文件存储在MATLAB®数据文件中数据集
对象
负载数据曲线%提取每个月最后一天的数据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从Nelson Siegel模型开始
并将其改写为以下内容:
通过上述模型,可以将这些因素解释为:Beta1对应于收益率曲线的长期/水平,Beta2对应于短期/斜率,Beta3对应于中期/曲率。 确定曲率上的载荷最大化的成熟度,并控制模型的指数衰减率。
迪堡和李主张设置 使中期因子Beta3在30个月时的负荷最大化。这也将问题从非线性拟合转化为简单的线性回归。
%显式设置时间因子lambda_t=.0609;%构造因子载荷矩阵%与数据相关的期限TimeToMat=[3691224366084120240360];X=[one(size(TimeToMat))(1-exp(-lambda_t*TimeToMat))。/(lambda_t*TimeToMat)...((1 - exp(-lambda_t*TimeToMat))./(lambda_t*TimeToMat) - exp(-lambda_t*TimeToMat))];%绘制因子负荷图情节(TimeToMat X)标题(“Diebold-Li模型的因子载荷,时间因子为.0609”)xlabel(‘到期日(月)’)ylim([0 1.1])图例({“Beta1”,“Beta2”,“Beta3”},“位置”,“东”)
一个DieboldLi
对象的开发有助于从产量数据拟合模型DieboldLi
对象继承自IRCurve
对象,所以getZeroRates
,getDiscountFactors
,GetParyiels
,getForwardRates
和toRateSpec
方法都已实现fitYieldsFromBetas
的实现,以估计给定的lambda参数的Beta参数的观察市场收益率。
的DieboldLi
对象用于拟合1990年至2010年每个月的Diebold Li模型。
%预分配betaβ= 0(大小(EstimationData, 1), 3);%循环并拟合每个月末的收益率曲线为jdx = 1:size(EstimationData,1) tmpCurveModel = dieboldfi . fitbetasfromyields (EOMDates(jdx),lambda_t*12,daysadd(EOMDates(jdx),30*TimeToMat),EstimationData(jdx,:)'); / /β(jdx:) = [tmpCurveModel。Beta1 tmpCurveModel。Beta2 tmpCurveModel.Beta3];结束
Diebold Li适合选定日期,包括在此处
PlotSettles=datenum({“30 - 1997年5月- - - - - -”,31日- 8月- 1998的,截止2001年6月29日的,‘2005年10月31日’}); 图形为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,:))保持在…上PlottingDates=(PlottingSettles(jdx)+30:30:PlottingSettles(jdx)+30*360);(PlottingDates,tmpCurveModel.getParYields(PlottingDates),的r -)头衔([“收益率曲线”datestr (PlotSettles (jdx)))) datetick结束
Diebold-Li模型可用于预测未来收益率曲线。Diebold和Li建议将AR(1)模型拟合到每个贝塔参数的时间序列中。然后,该拟合模型可用于预测每个参数的未来值,进而预测未来收益率曲线。
对于本例,使用MATLAB函数回归
用于估计每个β的AR(1)模型的参数。
回归拟合的置信区间也用于生成两个额外的收益率曲线预测,作为收益率曲线的额外可能情景。
的MonthsLag
变量可以进行调整,以作出不同时期的提前预测。例如,更改值from1
来6
将预测从1个月前改为6个月前。
月间隔=1;[tmpBeta,bint]=回归(β(月间隔+1:end,1),[1(月间隔+1:end,1))β(月间隔+1:end,1)];预测贝塔(1,1)=[1贝塔(结束,1)]*tmpBeta;预测贝塔(1,1)=[1贝塔(结束,1)]*bint(:,1);预测贝塔(1,1)=[1贝塔(结束,1)]*bint(:,2);[tmpBeta,bint]=回归(β(月间隔+1:end,2),[1(月间隔+1:end,2))β(月间隔+1:end,2)];预测贝塔(1,2)=[1贝塔(结束,2)]*tmpBeta;预测贝塔(1,2)=[1贝塔(结束,2)]*bint(:,1);预测贝塔(1,2)=[1贝塔(结束,2)]*bint(:,2);[tmpBeta,bint]=回归(β(月间隔+1:end,3),[1(月间隔+1:end,3))β(月间隔+1:end,3)];预测贝塔(1,3)=[1贝塔(结束,3)]*tmpBeta;预测贝塔(1,3)=[1贝塔(结束,3)]*bint(:,1);预测贝塔(1,3)=[1贝塔(结束,3)]*bint(:,2);%预测收益率曲线figure set = daysadd(EOMDates(end),30*MonthsLag);DieboldLi_Forecast = DieboldLi (“ParYield”,结算,[ForecastBeta lambda_t*12]);迪博尔德利(DieboldLi_Forecast_Up=DieboldLi(“ParYield”,解决ForecastBeta_Up lambda_t * 12]);DieboldLi_Forecast_Down = DieboldLi (“ParYield”,解决ForecastBeta_Down lambda_t * 12]);PlottingDates =(解决+ 30:30:解决+ 30 * 360)';情节(PlottingDates DieboldLi_Forecast.getParYields (PlottingDates),“b-”)持有在…上绘图(绘图日期,DieboldLi\u Forecast\u Up.getParYields(绘图日期),的r -)绘图(绘图日期,DieboldLi\u预测值\u下降。getParYields(绘图日期),的r -)头衔([李国宝预测未来收益率曲线日期(EOMDates(end))“对”datestr(解决)])传说({的预测曲线,“其他场景”},“位置”,‘东南’)datetick
本示例基于以下论文:
[1] 弗朗西斯·迪博尔德,李灿林。“预测政府债券收益率的期限结构。”计量经济学杂志,第130卷,第2期,2006年2月,337-364页。
convfactor
|bndfutprice
|bndfutimprepo
|tfutbyprice
|tfutbyyield
|tfutimprepo
|tfutpricebyrepo
|tfutyieldbyrepo
|bnddurp
|巴恩杜里