简单指数平滑
指数平滑最早是来自一种简单的预测方法:
用历史数据的线性组合预测下一时间点的值,
线性组合系数随距离变远而按负指数(几何级数)衰减:
x̂ h(1)≈wxh+w2xh−1+⋯=∑j=1∞wjxh+1−j
其中0<w<1,
w越小,
距离远的历史观测对预测的贡献越小。
因为是加权平均,
所以所有加权的和应该等于零,
注意到
∑j=1∞wj=w1−w
所以第j个权重应为
wjw1−w=(1−w)wj−1, j=1,2,…
于是
x̂ h(1)=(1−w)(xh+wxh−1+w2xh−2+…)=(1−w)∑j=0∞wjxh−j
这种预测方法叫做指数平滑方法(exponential smoothing method),
在早期应用中权重w是凭经验选取的。
经研究,
ARIMA(0,1,1)的x̂ h(1)的公式恰好具有如上形式。
对如下的ARIMA(0,1,1)模型:
(1−B)Xt=(1−θB)εt
两边除以1−θB,由于
11−θz=∑j=0∞θjzj
所以模型可以化为
(1−B)∑j=0∞θjXt−j=εt∑j=0∞θjXt−j−∑j=0∞θjXt−j−1=εtXt+∑j=1∞θjXt−j−∑j=1∞θj−1Xt−j=εtXt−(1−θ)∑j=1∞θj−1Xt−j=εtXt−(1−θ)∑j=0∞θjXt−1−j=εt
以t=h+1代入得
Xh+1=(1−θ)∑j=0∞θjXh−j+εh+1
于是
x̂ h(1)=E(Xh+1|ℱh)=(1−θ)∑j=0∞θjXh−j
这就是w=θ的指数平滑预测公式。
因为指数平滑预测与ARIMA(0,1,1)预测的等价性,
可以用ARIMA建模方法估计权重w。
注意arima()
函数估计的MA系数是1+θ1z+⋯+θqzq形式的系数。
也可以用ARIMA模型的充分性检验来判断指数平滑预测是否有意义。
例8.1 考虑CBOE的波动率指数(VIX)2004-01-02到2011-11-21的日收盘价的对数序列,
用指数平滑方法作一步预测。
共1988个观测。
读入数据,从中计算日收盘价对数值序列:
da <- read_table("d-vix0411.txt", col_types=cols(.default = col_double()))
xts.vix <- xts(da[,-(1:3)], make_date(da$year, da$mon, da$day))
str(xts.vix)
## An 'xts' object on 2004-01-02/2011-11-21 containing:
## Data: num [1:1988, 1:4] 18 18.4 17.7 16.7 15.4 ...
## - attr(*, "dimnames")=List of 2
## ..$ : NULL
## ..$ : chr [1:4] "Open" "High" "Low" "Close"
## Indexed by objects of class: [Date] TZ: UTC
## xts Attributes:
## NULL
vix <- log(xts.vix[,"Close"])
delta.vix <- diff(vix)[-1]
作日对数收盘价的时间序列图:
plot(vix, type="l", main="VIX Daily Log Close",
major.ticks="years", minor.ticks=NULL,
grid.ticks.on="auto")
图8.1: VIX日对数收盘价
明显不平稳且没有固定趋势。
作日对数收益率的时间序列图:
plot(delta.vix, type="l", main="VIX Daily Log Return",
major.ticks="years", minor.ticks=NULL,
grid.ticks.on="auto")
图8.2: VIX日对数收益率
日对数收益率的ACF:
forecast::Acf(c(coredata(delta.vix)), main="")
图8.3: VIX日对数收益率的ACF
虽然在滞后10的位置ACF也超界,
但是在低阶就只有滞后1明显超界,
所以对数收盘价用ARIMA(0,1,1)还是合理的。
ARIMA建模:
resm <- arima(c(coredata(vix)), order=c(0,1,1)); resm
##
## Call:
## arima(x = c(coredata(vix)), order = c(0, 1, 1))
##
## Coefficients:
## ma1
## -0.1500
## s.e. 0.0244
##
## sigma^2 estimated as 0.004561: log likelihood = 2535.71, aic = -5067.42
建立的模型为
Xt=Xt−1+εt−0.1500εt−1
其中σ̂ 2=0.004561。
θ=0.1500。
检验残差是否白噪声:
Box.test(resm$residuals, lag=10, fitdf=1)
##
## Box-Pierce test
##
## data: resm$residuals
## X-squared = 47, df = 9, p-value = 3.925e-07
白噪声检验很显著,
说明模型有所不足。
从差分序列的ρ̂ 10很大可以预见这个问题。
另行试验ARIMA(0,1,10):
resm2 <- arima(c(coredata(vix)), order=c(0,1,10)); resm2
##
## Call:
## arima(x = c(coredata(vix)), order = c(0, 1, 10))
##
## Coefficients:
## ma1 ma2 ma3 ma4 ma5 ma6 ma7 ma8
## -0.1493 -0.0716 -0.0484 -0.0258 -0.0303 -0.0401 -0.0131 -0.0181
## s.e. 0.0223 0.0226 0.0228 0.0225 0.0226 0.0236 0.0231 0.0219
## ma9 ma10
## 0.0092 0.0966
## s.e. 0.0245 0.0230
##
## sigma^2 estimated as 0.004453: log likelihood = 2559.57, aic = -5097.13
Box.test(resm2$residuals, lag=20, fitdf=10)
##
## Box-Pierce test
##
## data: resm2$residuals
## X-squared = 9.5782, df = 10, p-value = 0.4782
这个模型的白噪声检验通过,而且AIC也更好。
注意我们用了8年的数据,
教材(Tsay 2013)用的数据是2008-05-01到2010-04-19为两年数据。
两年数据可能ARIMA(0,1,1)就足够。
○○○○○
其它指数平滑方法
简单指数平滑,
相当于只用一个变化的水平值ℓt拟合数据yt,
ℓt=αyt+(1−α)ℓt−1,
预测为
ŷ t+h|t=ℓt.
可以增加一个线性的趋势增长项bt,变成:
ℓt=bt=ŷ t+h|t=αyt+(1−α)(ℓt−1+bt−1),β(ℓt−ℓt−1)+(1−β)bt−1,ℓt+hbt.
可以增加季节项st,变成:
ℓt=bt=st=ŷ t+h|t=α(yt−st−m)+(1−α)(ℓt−1+bt−1),β(ℓt−ℓt−1)+(1−β)bt−1,γ(yt−ℓt−1−bt−1)+(1−γ)st−m,ℓt+hbt+st−m+h+m.
其中m是季节频率,如月度数据为12,
季度数据为4。
t−m+h+m是t,t−1,…,t−m+1中与t−m+h同月(季度)的值。
各项可以是相乘的。
stats包的HoltWinters()
函数提供这样的指数平滑方法,
forecast包的ets()
函数提供了自动选择合适的指数平滑方法并进行预报的功能。
参考文献
韭菜热线原创版权所有,发布者:风生水起,转载请注明出处:https://www.9crx.com/74098.html