在R数据表中滚动多元回归

时间:2016-04-21 14:20:00

标签: r data.table regression

假设我有一个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

我该如何写(尽可能高效)。

由于

2 个答案:

答案 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"]]]