在R中记录多个证券的多个时间段

时间:2015-12-29 15:40:07

标签: r quantmod stock

我的数据集包含了2000年至2014年间5413家公司的每日收盘价。我想根据日期作为日志(今日价格/昨日价格)计算股票的每日日志收益。我按如下方式说明了数据集:

Date       A G L    ABA    ABB ABBEY 
2000-1-3    NA      NA      NA  NA
2000-1-4    79.5    325     NA  961  
2000-1-5    79.5    322.5   NA  945
2000-1-6    79.5    327.5   NA  952
2000-1-7    NA      327.5   NA  941  
2000-1-10   79.5    327.5   NA  946
2000-1-11   79.5    327.5   NA  888

如何计算每日日志回报并另外解决NA问题。我的样本期是从2000年到2014年,因此有些公司在2001年上市,因此,2000年全年都有NA,应该如何处理。非常感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

根据this topic,我会尝试描述我的命题:

据我所知,我们拥有日期和数千家公司的数据框。这是我们的示例数据框,名为 price

> prices
    newdates nsp1  nsp2 nsp3 nsp4
1 2000-01-03   NA    NA   NA   NA
2 2000-01-04 79.5 325.0   NA  961
3 2000-01-05 79.5 322.5   NA  945
4 2000-01-06 79.5 327.5   NA  952
5 2000-01-07   NA 327.5   NA  941
6 2000-01-10 79.5 327.5   NA  946
7 2000-01-11 79.5 327.5   NA  888

要创建一个新的日志返回数据框,我在代码下面使用了

logs=data.frame(
+   cbind.data.frame(
+     newdates[-1],
+     diff(as.matrix(log(prices[,-1])))
+     )
+   )
> logs
  newdates..1. nsp1         nsp2 nsp3         nsp4
1   2000-01-04   NA           NA   NA           NA
2   2000-01-05    0 -0.007722046   NA -0.016789481
3   2000-01-06    0  0.015384919   NA  0.007380107
4   2000-01-07   NA  0.000000000   NA -0.011621895
5   2000-01-10   NA  0.000000000   NA  0.005299429
6   2000-01-11    0  0.000000000   NA -0.063270826

为了澄清此代码中发生的事情,我们可以从内到外对其进行分析:

第1步:计算日志退货

  • 你知道log(a/b) = log(a)-log(b),所以我们可以计算出来 对数差异。函数diff(x,lag=1)计算 给定滞后的差异。这是lag=1所以它首先给出 差异。
  • 我们的x是数据框中的价格。选择一个 data.frame我们使用的每一列没有第一列(有日期) prices[,-1]
  • 我们需要对数,所以log(prices[,-1])
  • 函数diff()适用于向量或矩阵,因此我们需要处理 因此,计算的对数为矩阵 `as.matrix(日志(价格[, - 1]))
  • 现在我们可以将diff()lag=1一起使用,diff(as.matrix(log(prices[,-1])))

第2步:创建日志返回和日期的数据框

  • 我们不能仅使用cbind()。首先,因为长度不同(回报短1个记录)。我们需要删除第一个日期,因此newdates[-1]

  • 其次,使用cbind()日期将转换为数值160027或其他。
    在这里,我们必须使用cbind.data.frame(x,y),如上所示。

  • 现在数据准备就绪,我们可以创建使用data.frame()并将其命名为日志logs=data.frame(...),如上所述。

如果您的数据集看起来像数据框价格,它应该运行。最重要的是使用diff(log(x))来轻松计算日志返回。

如果您有任何疑问或问题,请随便询问。