这个例子展示了如何构建美国1990 - 2010年每个月的收益率曲线的Diebold Li模型。这个例子也演示了如何通过对每个参数的时间序列拟合一个自回归模型来预测未来的收益率曲线。
该论文可以在这里找到:
https://www.nber.org/papers/w10048
所使用的数据是每月1990年代到2010年的财政收益率为1 Mo,3莫,6莫,1 YR,2 YR,3 YR,5 YR,7 YR,10 YR,30 YR。
每日数据可以在这里找到:
数据存储在MATLAB®数据文件作为MATLAB数据集
对象。
加载Data_USYieldCurve%提取每个月的最后一天的数据MonthYearMat = repmat((1990:2010) ', 1、12)”;EOMDates = lbusdate (MonthYearMat (:), repmat((1:12), 21岁,1));MonthlyIndex =找到(ismember (Dataset.Properties.ObsNames datestr (EOMDates)));Estimationdataset =数据集(MonthlyIndex:);EstimationData =双(Estimationdataset);
Diebold和Li从Nelson Siegel模型开始
把它改写成这样:
上述模型允许以下列方式解释的因素:Beta1对应于屈服曲线的长期/水平,β2对应于短期/斜率,并且β3对应于中术术语/曲率。 确定了曲率上的载荷在哪个成熟度时达到最大值,并控制了模型的指数衰减率。
Diebold和Li Advocate设置 最大化中期因子,β3的负载,在30个月内。这也将问题从非线性拟合到简单的线性回归转换。
%明确设置时因子lambdalambda_t = .0609;构建因子负荷矩阵与数据相关的期限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 - expda_t * timetomat))./(lambda_t * timetomat) - exp(-lambda_t * timetomat))];%绘制因子负荷情节(Timetomat,x)标题(时间因子为0.0609的Diebold Li模型的因子载荷)包含(的期限(月)) ylim([0 1.1]) legend({'beta1'那'beta2'那'beta3'},“位置”那'东')
一种DieBoldli.
对象的开发是为了方便从产量数据拟合模型。这DieBoldli.
对象继承orcurve.
对象,因此getZeroRates
那getDiscountactors.
那getParYields
那getForwardRates
,toRateSpec
方法都实现了。此外,该方法FityieldSfrombetas.
被实施以估计β参数给出了观察到的市场产量的Lambda参数。
这DieBoldli.
对象用于适用于1990年至2010年的每个月的DieBold Li模型。
%预先释放βBeta =零(尺寸(估计数据,1),3);循环并拟合每个月末的收益率曲线为了JDX = 1:大小(估计数据,1)tmpcurvemodel = dieboldli.fitbetasfromyields(eomdates(eomdates(jdx),lambda_t * 12,stayadd(eomdates(eomdates(JDX),30 * timetomat),估计数据(JDX,:)');beta(jdx,:) = [tmpcurvemodel.beta1 tmpcurvemodel.beta2 tmpcurvemodel.beta3];结尾
迪堡李适合选定的日期包括在这里
PlotSettles = datenum ({'30 -May-1997'那'31 -aug-1998'那'29 -Jun-2001'那2005年- 10月31日的});数字为了JDX = 1:长度(Plotsettles)子图(2,2,JDX)TMPIDX = find(strcmpi(strcmpi(reservationdataset.properties.obsnames,datestr(plotsettles(jdx))));tmpcurvemodel = dieboldli.fitbetasfromyields(plotsettles(jdx),lambda_t * 12,......daysadd (PlotSettles (jdx)、30 * TimeToMat), EstimationData (tmpIdx:) ');散射(daysadd (PlotSettles (jdx)、30 * TimeToMat), EstimationData (tmpIdx,:))在PlottingDates = (PlotSettles (jdx) + 30:30: PlotSettles (jdx) + 30 * 360) ';情节(PlottingDates tmpCurveModel.getParYields (PlottingDates),'r-')标题('收益曲线'datestr(plotsettles(jdx))])dateTick结尾
Diebold Li模型可以用来预测未来的收益率曲线。Diebold和Li提出对每个Beta参数的时间序列拟合一个AR(1)模型。这个拟合模型可以用来预测每个参数的未来值,并引申出未来的收益率曲线。
本例为MATLAB函数回归
用于估计每个Beta的AR(1)模型的参数。
回归拟合的置信区间也用于产生两种额外的产量曲线预测,其用作屈服曲线的额外情况。
这劳动
可以调整变量以使不同的期间提前预测。例如,改变价值1
到6.
会将预测从提前1个月改为6个月预测。
MonthsLag = 1;[tmpBeta,bint] =回归(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β(结束,1)]*少女(:1);ForecastBeta_Up(1, - 1) =[1β(结束,1)]*少女(:,2);[tmpBeta,bint] = reress (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β(,2)]*少女(:1);ForecastBeta_Up(1、2)=[1β(,2)]*少女(:,2);[tmpBeta,bint] = return (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);预测收益率曲线图Settr = StaysAdd(eomdates(ENDATE(END),30 * WORENLAG);dieboldli_forecast = dieboldli('Paryield',解决ForecastBeta lambda_t * 12]);DieboldLi_Forecast_Up = DieboldLi ('Paryield',解决,[预测β5_UPLABDA_T* 12]);dieboldli_forecast_down = dieboldli('Paryield',定居[预测β1downlambda_t * 12]);Plottingdates =(沉淀+ 30:30:stand + 30 * 360)';绘图(plottingdates,dieboldli_forecast.getparyields(plottingdates),“b -”)举行在情节(PlottingDates DieboldLi_Forecast_Up.getParYields (PlottingDates),'r-')情节(PlottingDates DieboldLi_Forecast_Down.getParYields (PlottingDates),'r-')标题('Diebold Li预测产量曲线上'datestr (EOMDates(结束)' 为了 'datestr(soll)])传奇({'预测曲线'那“额外的场景”},“位置”那“东南”) datetick
此示例基于以下文件:
[1]弗朗西斯X.Iobold,Canlin Li,预测政府债券收益率期限的术语结构,CompuoreTrics杂志,130卷,2006年2月2日,第337-364页