这个例子展示了如何构建美国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数据集
对象。
负载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对应于收益率曲线的长期/水平,Beta2对应于短期/斜率,Beta3对应于中期/曲率。 确定了曲率上的载荷在哪个成熟度时达到最大值,并控制了模型的指数衰减率。
迪博尔德和李彦宏倡导环境 在30个月时最大化中期因子Beta3的负荷。这也将问题从非线性拟合转化为简单的线性回归。
%显式设置时间因子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-exp(-lambda_t*TimeToMat))。/(lambda_t*TimeToMat)-exp(-lambda_t*TimeToMat));%绘制因子负荷绘图(计时器,X)标题(时间因子为0.0609的Diebold Li模型的因子载荷)包含(的期限(月)) ylim([0 1.1]) legend({“Beta1”,“β2”,“Beta3”},“位置”,“东方”)
A迪博尔德利
对象的开发是为了方便从产量数据拟合模型。这个迪博尔德利
对象继承圆曲线
对象,因此getZeroRates
,获取折扣因素
,getParYields
,getForwardRates
,toRateSpec
方法都实现了。此外,该方法fitYieldsFromBetas
在给定lambda参数的情况下,对观测到的市场收益率进行贝塔参数估计。
这个迪博尔德利
对象用于拟合从1990年到2010年每个月的Diebold Li模型。
%预先分配贝塔β=零(大小(估计数据,1),3);循环并拟合每个月末的收益率曲线对于jdx=1:size(EstimationData,1)tmpCurveModel=DieboldLi.fitbetas from收益率(eomdate(jdx),lambda_t*12,daysad(eomdate(jdx),30*TimeToMat),EstimationData(jdx,:);Beta(jdx,:)=[tmpCurveModel.Beta1 tmpCurveModel.Beta2 tmpCurveModel.Beta3];结束
迪堡李适合选定的日期包括在这里
PlotSettles = datenum ({‘1997年5月30日’,‘1998年8月31日’,‘2001年6月29日’,2005年- 10月31日的});数字对于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:) ');散射(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);预测收益率曲线数字结算=日结算(EOMDates(end),30*个月滞后;DieboldLi_预测=DieboldLi(“帕尔利德”,解决ForecastBeta lambda_t * 12]);DieboldLi_Forecast_Up = DieboldLi (“帕尔利德”,结算,[ForecastBeta_Up lambda_t*12]);DieboldLi_Forecast_Down=DieboldLi(“帕尔利德”,结算,【预报员贝塔·唐·兰姆达·t*12】;绘图日期=(结算+30:30:结算+30*360);绘图(绘图日期,DieboldLi_Forecast.getParYields(绘图日期),“b -”)举行在情节(PlottingDates DieboldLi_Forecast_Up.getParYields (PlottingDates),“r-”)情节(PlottingDates DieboldLi_Forecast_Down.getParYields (PlottingDates),“r-”)标题(“Diebold Li预测的收益率曲线”datestr (EOMDates(结束)“为了”日期(结算)])图例({“预测曲线”,“额外的场景”},“位置”,“东南”) datetick
此示例基于以下文件:
弗朗西斯·x·迪博尔德,李灿林《预测政府债券收益率的期限结构》计量经济学杂志,第130卷,第2期,2006年2月,第337-364页。