下面是一个看起来像以下格式的数据表(它是一个data.table对象):
date stock_id logret
1: 2011-01-01 1 0.001
2: 2011-01-02 1 0.003
3: 2011-01-03 1 0.005
4: 2011-01-04 1 0.007
5: 2011-01-05 1 0.009
6: 2011-01-06 1 0.011
7: 2011-01-01 2 0.013
8: 2011-01-02 2 0.015
9: 2011-01-03 2 0.017
10: 2011-01-04 2 0.019
11: 2011-01-05 2 0.021
12: 2011-01-06 2 0.023
13: 2011-01-01 3 0.025
14: 2011-01-02 3 0.027
15: 2011-01-03 3 0.029
16: 2011-01-04 3 0.031
17: 2011-01-05 3 0.033
18: 2011-01-06 3 0.035
可以创建如下:
DT = data.table(
date=rep(as.Date('2011-01-01')+0:5,3) ,
stock_id=c(1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3),
logret=seq(0.001, by=0.002, len=18));
setkeyv(DT,c('stock_id','date'))
当然,实际的表格要大得多,包含许多其他股票 ID 和日期。目的是将此数据表重新整形,以便我可以对所有股票 ID 的对数收益率与其前一天(在周末的情况下为前一个交易日)的对应对数收益率进行回归分析。
最终结果应如下所示:
date stock_id logret lagret
1: 2011-01-01 1 0.001 NA
2: 2011-01-02 1 0.003 0.001
3: 2011-01-03 1 0.005 0.003
....
16: 2011-01-04 3 0.031 0.029
17: 2011-01-05 3 0.033 0.031
18: 2011-01-06 3 0.035 0.033
我发现这种数据结构真的很难建立,而不混淆我的股票ID。
2011-04-01
和2011-04-04
之间的时间差不是1天。 - Rolandsetkey(stockid,date)
。然后使用:=
和roll
在date-1
上添加滞后列。 然后按股票进行回归分析。 - Matt DowleDT[DT,lagret:=log_return,roll=TRUE]
,它会使用接近纪元的日期填充lagret变量。我已经排除了一些显而易见的问题(例如,日期实际上是日期而不是字符串,键设置正确)。 - user1480926DT[,lagret:=DT[list(id,date-1),logret,roll=TRUE][[3L]]]
。您正在使用哪个版本的data.table
?最好提供一个完整可重现的示例 - 可以将其粘贴到 R 会话中。 - Matt Dowle