【问题标题】:Rolling multi regression in R data tableR数据表中的滚动多元回归
【发布时间】:2016-04-21 14:19:59
【问题描述】:

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

我想对 Return 的前 N ​​个观察值进行滚动多元回归,以预测某个窗口 K 上的下一个 Return。例如在过去的 K = 120 天内,对最后的 N = 14 次观察进行回归以预测下一次观察。一旦我有了这个回归,我想使用 predict 函数根据回归得到每一行的预测。在伪代码中它会是这样的:

 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

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

谢谢

【问题讨论】:

  • 听起来你想做一个自动回归。为什么不将其设置为 ARIMA 模型?
  • 我不熟悉 ARIMA - 特别是结果如何与滚动多元回归进行比较,但我会调查这个以及你的答案和评论和/或标记为正确一旦我开心,谢谢!
  • 当然。自动回归是一种滚动回归,按日期滚动。这就是 ARIMA 的“AR”部分。 “MA”代表移动平均线。 I 用于集成,只是自回归移动平均回归的概括。如果您愿意,可以使用arima 或auto.arima 函数在没有移动平均多项式的情况下进行自回归。 en.wikipedia.org/wiki/Autoregressive_integrated_moving_average

标签: r data.table regression


【解决方案1】:

如果我理解正确,您想要一个季度自回归。

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/

【讨论】:

【解决方案2】:

无论如何,你必须在列中有滞后,所以如果我理解正确,你可以做这样的事情,比如滞后 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"]]]

【讨论】:

  • 这正是我想要的......不同之处在于:(1)我想改变 lag_max,所以我不想写 lm(return ~ lag1+lag2+lag3 ) 但也许我可以使用 eval(expr()) 来克服这个问题,但是 (2) 我只想对前一些行窗口进行回归..
猜你喜欢
  • 2021-01-20
  • 1970-01-01
  • 2019-09-25
  • 2021-09-14
  • 2019-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多