2016-03-10 13 views
0

我有一个数据框,它有4000多列和3000行。列是公司和行有每日股票收盘价格。这些数据缺少值,但由于数据的性质,这些数据不能被删除。 现在,我想计算这些每日股票收盘价格观察的简单回报和每月回报。我每天观察15年。 作为,简单的回报率=(今天的价格/昨天的价格)-1 月度回报率=(价格为月/价格的最后一个营业日previousmonth的最后一个工作日)-1从日常股票价格观测数据R中获取的简单回报和月报表

我说明我的数据帧,前两月从15年的数据

Date   A  B  C D 
30/12/1999 79.5 325  NA 961 
04/01/2000 79.5 325  NA 961 
05/01/2000 79.5 322.5 NA 945 
06/01/2000 79.5 327.5 NA 952 
07/01/2000 79.5 327.5 NA 941 
10/01/2000 79.5 327.5 NA 946 
11/01/2000 79.5 327.5 NA 888 
12/01/2000 79.5 331.5 NA 870 
13/01/2000 79.5 334  NA 853 
14/01/2000 79.5 334  NA 834 
17/01/2000 94.5 350  NA 799 
18/01/2000 95.5 351.5 NA 770 
19/01/2000 94.5 352.5 NA 763 
20/01/2000 97.5 352.5 NA 730 
21/01/2000 97.5 352.5 NA 765 
24/01/2000 97.5 352.5 NA 743 
25/01/2000 97.5 352.5 NA 737 
26/01/2000 97.5 352.5 NA 777 
27/01/2000 97.5 351.5 NA 800 
28/01/2000 96.5 350  NA 770 
31/01/2000 96.5 350  NA 747 
01/02/2000 101.5 350  NA 719 
02/02/2000 118.5 350  NA 723 
03/02/2000 117  350  NA 732 
04/02/2000 117  350  NA 673 
07/02/2000 117  317.5 NA 671 
08/02/2000 117  313.5 NA 665 
09/02/2000 117  312.5 NA 655 
10/02/2000 114.5 318.5 NA 684 
11/02/2000 114.5 326.5 NA 655 
14/02/2000 111  337.5 NA 634 
15/02/2000 111  337  NA 647 
16/02/2000 111  337  NA 666 
17/02/2000 111  334.5 NA 713 
18/02/2000 111  334.5 NA 726 
21/02/2000 112  332.5 NA 714 
22/02/2000 111  331.5 NA 653 
23/02/2000 119  332.5 NA 658 
24/02/2000 125  332.5 NA 646 
25/02/2000 125  350.5 NA 633 
28/02/2000 125  350.5 NA 645 
29/02/2000 125  350.5 NA 711 

希望的简易回报,以节省空间,我刚才提出了月度数据

所需出来

Date  A B  C D 
30/12/1999    
04/01/2000 0 0  NA 0 
05/01/2000 0 -0.01 NA -0.02 
06/01/2000 0 0.02 NA 0.01 
07/01/2000 0 0.00 NA -0.01 
10/01/2000 0 0.00 NA 0.01 
11/01/2000 0 0.00 NA -0.06 
12/01/2000 0 0.01 NA -0.02 
13/01/2000 0 0.01 NA -0.02 
14/01/2000 0 0.00 NA -0.02 
17/01/2000 0.19 0.05 NA -0.04 
18/01/2000 0.01 0.00 NA -0.04 
19/01/2000 -0.01 0.00 NA -0.01 
20/01/2000 0.03 0 NA -0.04 

所需的输出的某些部分

Month  A  B  C D 
Jan-00 0.21 0.076 NA -0.22 
Feb-00 0.29 0.001 NA -0.04 
+1

'quantmod'有每日和每月返还功能此目的。 http://www.quantmod.com/documentation/periodReturn.html – ytk

回答

-1

将您的数据转换为zoo对象,例如,

library(zoo) 
prices <- data.frame(dates = c("2016-01-01", "2016-01-03", "2016-01-04"), 
        companyA = c(100,110,99), 
        companyB = c(90,81,89.1)) 
prices.z <- zoo(prices[,-1], order.by = as.Date(prices[,1])) 
head(prices.z) 
simple.returns <- diff(prices.z)/lag(prices.z, -1) 
simple.returns 

生产:

> head(prices.z) 
      companyA companyB 
2016-01-01  100  90.0 
2016-01-03  110  81.0 
2016-01-04  99  89.1 
> 
> simple.returns <- diff(prices.z)/lag(prices.z, -1) 
> 
> simple.returns 
      companyA companyB 
2016-01-03  0.1  -0.1 
2016-01-04  -0.1  0.1 

(也注意到,你与数收益更好 - 它们与较轻松的工作岗位工作)

+0

我的意思是要批量或循环运行代码。 – Aquarius

+0

既不是 - 它是矢量化的,所以R照顾它。创建一个动物园对象,并通过'diff(prices.z)/ lag(prices.z,-1)'试试看结果。 – rbm