我的数据集如下所示:
Date<-rep(seq(as.Date("2000/1/1"), as.Date("2001/1/1"), by = "quarter"),2)
Name<-c(rep("a",5),rep("b",5))
Return<-rnorm(10,0,0.1)
dt<-data.table(Date,Name,Return)
并且样本采用以下形式:
Date Name Return
1: 2000-01-01 a 0.049675002
2: 2000-04-01 a -0.017131607
3: 2000-07-01 a 0.157891524
4: 2000-10-01 a 0.112921428
5: 2001-01-01 a 0.190409895
6: 2000-01-01 b 0.001505096
7: 2000-04-01 b -0.135364485
8: 2000-07-01 b 0.050353871
9: 2000-10-01 b 0.145750019
10: 2001-01-01 b 0.025039778
问题是数据表中的返回不是我想要的。我想要使用的数据应该是价格而不是回报。问题假设数据中第一个时期之前的价格是100,并且通过应用函数: P t = P t-1 *(1+ R < / strong> t)(t和t-1是此等式中的下标)我可以生成一个新的价格列。所以我希望我能得到以下内容:
Date Name Return Price
1 01/01/2000 a 0.049675002 104.9675002
2 01/04/2000 a -0.017131607 103.1692383
3 01/07/2000 a 0.157891524 119.4587865
4 01/10/2000 a 0.112921428 132.9482432
5 01/01/2001 a 0.190409895 158.2629043
6 01/01/2000 b 0.001505096 100.1505096
7 01/04/2000 b -0.135364485 86.59368745
8 01/07/2000 b 0.050353871 90.95401482
9 01/10/2000 b 0.145750019 104.2105642
10 01/01/2001 b 0.025039778 106.8199736
具体而言,困难是:
我需要在具有不同名称的组中应用它,真实数据有大约160个不同的名称。在每个名称下,我需要假设起始价格为P0 = 100(我们在价格系列中不需要这100个。
每个名称下的数据长度实际上是不同的,其中一些有100个观察值,而其他可能只有85个,每个名称下的数据长度都没有模式。
如何在编写公式时使用上一期间的价格来计算当前价格?我没有找到回顾之前观察的方式,因为Price [-1]不起作用。
非常感谢您的时间和提前帮助!!!
答案 0 :(得分:5)
这是一种方式:
DT[,Price:=100*cumprod(1+Return),by=Name]
# Date Name Return Price
# 1: 2000-01-01 a 0.049675002 104.96750
# 2: 2000-04-01 a -0.017131607 103.16924
# 3: 2000-07-01 a 0.157891524 119.45879
# 4: 2000-10-01 a 0.112921428 132.94824
# 5: 2001-01-01 a 0.190409895 158.26290
# 6: 2000-01-01 b 0.001505096 100.15051
# 7: 2000-04-01 b -0.135364485 86.59369
# 8: 2000-07-01 b 0.050353871 90.95401
# 9: 2000-10-01 b 0.145750019 104.21056
# 10: 2001-01-01 b 0.025039778 106.81997