假设我有一个R data.table DT ,它有一个退货清单:
Date Return
2016-01-01 -0.01
2016-01-02 0.022
2016-01-03 0.1111
2016-01-04 -0.006
...
我想对返回的前N个观测值进行滚动多元回归,预测下一次返回某个窗口K.例如。在最后的K = 120天中,对最后的N = 14次观测进行回归以预测下一次观察。一旦我进行了这种回归,我想使用预测函数根据回归得到每行的预测。在伪代码中,它将类似于:
DT[, Prediction := predict(lm(Return[prev K - N -1] ~ Return[N observations prev for each observation]), Return[N observations previous for this observation])]
要明确我想做一个多元回归,所以如果N是3,那就是:
lm(Return ~ Return[-1] + Return[-2] + Return[-3]) ## where the negatives are the prev rows
我该如何写(尽可能高效)。
由于
答案 0 :(得分:4)
如果我理解正确,你想要一个季度自动回归。
time-series with data.table这里有一个相关的帖子。
您可以在data.table中设置滚动日期(请参阅上面的链接以获取更多上下文):
#Example for quarterly data
quarterly[, rollDate:=leftBound]
storeData[, rollDate:=date]
setkey(quarterly,"rollDate")
setkey(storeData,"rollDate")
由于您只提供了几行示例数据,因此我将该系列扩展到了2019年并编制了随机返回值。
首先进行数据设置:
require(forecast)
require(xts)
DT <- read.table(con<- file ( "clipboard"))
dput(DT) # the dput was too long to display here
DT[,1] <- as.POSIXct(strptime(DT[,1], "%m/%d/%Y"))
DT[,2] <- as.double(DT[,2])
dat <- xts(DT$V2,DT$V1, order.by = DT$V1)
x.ts <- to.quarterly(dat) # 120 days
dat.Open dat.High dat.Low dat.Close
2016 Q1 1292 1292 1 698
2016 Q2 138 1290 3 239
2016 Q3 451 1285 5 780
2016 Q4 355 1243 27 1193
2017 Q1 878 1279 4 687
2017 Q2 794 1283 12 411
2017 Q3 858 1256 9 1222
2017 Q4 219 1282 15 117
2018 Q1 554 1286 32 432
2018 Q2 630 1272 30 46
2018 Q3 310 1288 18 979
2019 Q1 143 1291 10 184
2019 Q2 250 1289 8 441
2019 Q3 110 1220 23 571
然后你可以做一个滚动的ARIMA模型,有或没有像这样重新估计:
fit <- auto.arima(x.ts)
order <- arimaorder(fit)
fcmat <- matrix(0, nrow=nrow(x), ncol=1)
n <- nrow(x)
for(i in 1:n)
{
x <- window(x.ts, end=2017.99 + (i-1)/4)
refit <- Arima(x, order=order[1:3], seasonal=order[4:6])
fcmat[i,] <- forecast(refit, h=h)$mean
}
这是一个很好的相关资源,有几个不同的方法可以构建这个例子:http://robjhyndman.com/hyndsight/rolling-forecasts/
答案 1 :(得分:0)
无论如何你必须在列中有滞后,所以如果我理解你,你可以做这样的事情,比如迟到3:
setkey(DT,date)
lag_max<-3
for(i in 1:lag_max){
set(DT,NULL,paste0("lag",i),shift(DT[["return"]],1L,type="lag"))
}
DT[, prediction := lm(return~lag1+lag2+lag3)[["fitted.values"]]]