适合迪堡李模型
这个例子展示了如何构建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 = find(ismember(Dataset.Properties.ObsNames,datestr(EOMDates)));Estimationdataset =数据集(MonthlyIndex,:);EstimationData = double(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))];绘制因子负荷情节(TimeToMat X)标题('迪堡李模型的因子负载,时间因子为。0609')包含(的期限(月)) ylim([0 1.1])“Beta1”,“Beta2”,“Beta3”},“位置”,“东”)
模型拟合
一个DieboldLi
对象的开发,以方便从产量数据拟合模型。的DieboldLi
对象继承自IRCurve
对象,因此getZeroRates
,getDiscountFactors
,getParYields
,getForwardRates
,toRateSpec
方法都是实现的。此外,该方法fitYieldsFromBetas
为观察到的市场收益率给出lambda参数,实现了对Beta参数的估计。
的DieboldLi
对象用于拟合1990年至2010年每个月的Diebold Li模型。
预分配beta版本Beta = 0 (size(EstimationData,1),3);遍历并拟合每个月末的收益率曲线为jdx = 1:size(EstimationData,1) tmpCurveModel = DieboldLi.fitBetasFromYields(EOMDates(jdx),lambda_t*12,daysadd(EOMDates(jdx),30*TimeToMat),EstimationData(jdx,:)');Beta(jdx,:) = [tmp曲率模型。Beta1 tmpCurveModel。Beta2 tmpCurveModel.Beta3];结束
在选定的日期迪堡李合身包括在这里
plotsets = datenum({“30 - 1997年5月- - - - - -”,31日- 8月- 1998的,截止2001年6月29日的,2005年- 10月31日的});数字为jdx = 1:长度(plotsets) subplot(2,2,jdx) tmpIdx = find(strcmpi(Estimationdataset.Properties.ObsNames,datestr(plotsets (jdx))));tmpCurveModel = DieboldLi.fitBetasFromYields(PlotSettles(jdx),lambda_t*12,...daysadd (PlotSettles (jdx)、30 * TimeToMat), EstimationData (tmpIdx:) ');散射(daysadd (PlotSettles (jdx)、30 * TimeToMat), EstimationData (tmpIdx,:))在PlottingDates = (plotsets (jdx)+30:30: plotsets (jdx)+30*360)';情节(PlottingDates tmpCurveModel.getParYields (PlottingDates),的r -)标题(“收益率曲线开启”datestr (PlotSettles (jdx)))) datetick结束
预测
Diebold Li模型可用于预测未来收益率曲线。Diebold和Li提出用AR(1)模型拟合每个Beta参数的时间序列。然后,这个拟合模型可以用来预测每个参数的未来值,进而预测未来的收益率曲线。
本例为MATLAB函数回归
用于估计每个Beta的AR(1)模型的参数。
回归拟合的置信区间还用于生成两个额外的收益率曲线预测,作为收益率曲线的额外可能场景。
的MonthsLag
变量可以进行调整,提前做出不同时期的预测。例如,更改的值1
来6
将预测从1个月前的预测改为6个月前的预测。
MonthsLag = 1;[tmpBeta,bint] = return (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] = return (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);预测收益率曲线figure Settle = daysadd(EOMDates(end),30*MonthsLag);diboldli (“ParYield”,解决ForecastBeta lambda_t * 12]);diboldli_forecast_up = diboldli (“ParYield”,解决ForecastBeta_Up lambda_t * 12]);diboldli_forecast_down = diboldli (“ParYield”,解决ForecastBeta_Down lambda_t * 12]);PlottingDates =(结算+30:30:结算+30*360)';情节(PlottingDates DieboldLi_Forecast.getParYields (PlottingDates),“b -”)举行在情节(PlottingDates DieboldLi_Forecast_Up.getParYields (PlottingDates),的r -)情节(PlottingDates DieboldLi_Forecast_Down.getParYields (PlottingDates),的r -)标题(“李迪堡预测收益率曲线”datestr (EOMDates(结束)“for”datestr(解决)])传说({的预测曲线,“额外的场景”},“位置”,“东南”) datetick
参考书目
本例基于以下论文:
[1] Francis X. Diebold,李灿林。《政府债券收益率期限结构预测》计量经济学杂志,第130卷,第2期,2006年2月,第337-364页。