如何计算不同跨度上不同行的百分比变化

时间:2013-02-15 18:16:20

标签: r statistics plyr quantmod

我正在尝试计算由gvkey(1001,1384等等)认可的公司的季度数据的价格变化百分比。它是相应的季度股票价格PRCCQ

    gvkey  PRCCQ
1   1004 23.750
2   1004 13.875
3   1004 11.250
4   1004 10.375
5   1004 13.600
6   1004 14.000
7   1004 17.060
8   1004  8.150
9   1004  7.400
10  1004 11.440
11  1004  6.200
12  1004  5.500
13  1004  4.450
14  1004  4.500
15  1004  8.010

我要做的是添加8列,显示1季度回报,2季度回报等,一直到8个季度。我已经能够使用delt的{​​{1}}和quantmod的{​​{1}}函数计算每个PRCCQ的1季度回报率,我也能够得到第2季度通过更改ddply返回使用相同的代码。

plyr

然而,这个等式不允许我高于k,而不会给出<2,3>行数2,3 的错误。我现在尝试使用许多替代方法,但是工作。是否有一个函数我可以插入ddply(data, "gvkey", transform, DeltaCol = Delt(PRCCQ,k=2)) 代码我必须替换k=2或者可能是另一个完全替代的代码行来显示各个列中的所有8个季度的返回值?

2 个答案:

答案 0 :(得分:1)

您可以将数据声明为ts()并使用cbind()diff()

data <- read.table(header=T,text='gvkey  PRCCQ
   1004 23.750
   1004 13.875
   1004 11.250
   1004 10.375
   1004 13.600
   1004 14.000
   1004 17.060
   1005  8.150
   1005  7.400
  1005 11.440
  1005  6.200
  1005  5.500
  1005  4.450
  1005  4.500
  1005  8.010')

data <- split(data,list(data$gvkey))
(newdata <- do.call(rbind,lapply(data,function(data) { data <- ts(data) ; cbind(data,Quarter=diff(data[,2]),Two.Quarter=diff(data[,2],2))})))

      data.gvkey data.PRCCQ Quarter Two.Quarter
 [1,]       1004     23.750      NA          NA
 [2,]       1004     13.875  -9.875          NA
 [3,]       1004     11.250  -2.625     -12.500
 [4,]       1004     10.375  -0.875      -3.500
 [5,]       1004     13.600   3.225       2.350
 [6,]       1004     14.000   0.400       3.625
 [7,]       1004     17.060   3.060       3.460
 [8,]       1005      8.150      NA          NA
 [9,]       1005      7.400  -0.750          NA
[10,]       1005     11.440   4.040       3.290
[11,]       1005      6.200  -5.240      -1.200
[12,]       1005      5.500  -0.700      -5.940
[13,]       1005      4.450  -1.050      -1.750
[14,]       1005      4.500   0.050      -1.000
[15,]       1005      8.010   3.510       3.560

编辑:

另一种方式,没有split()lapply()(可能更快)

data <- read.table(header=T,text='gvkey  PRCCQ
       1004 23.750
       1004 13.875
       1004 11.250
       1004 10.375
       1004 13.600
       1004 14.000
       1004 17.060
       1005  8.150
       1005  7.400
      1005 11.440
      1005  6.200
      1005  5.500
      1005  4.450
      1005  4.500
      1005  8.010')
newdata <- do.call(rbind,by(data, data$gvkey,function(data) { data <- ts(data) ; cbind(data,Quarter=diff(data[,2]),Two.Quarter=diff(data[,2],2))}))

答案 1 :(得分:0)

df <- read.table(text="gvkey  PRCCQ
1  1004  5.500
2  1004  4.450
3  1004  4.500
4  1004  8.010
5  1005  4.450
6  1005  4.500",header=TRUE)

library(plyr)
library(quantmod)
ddply(df, "gvkey", transform, DeltaCol = Delt(PRCCQ,k=3))
#error

Delt2 <- function(x,k) {
  if(length(x)>k) as.vector(Delt(x1=x,k=k)) else rep(NA,length(x))
}

ddply(df, "gvkey", transform, DeltaCol = Delt2(PRCCQ,k=3))
#  gvkey PRCCQ  DeltaCol
#1  1004  5.50        NA
#2  1004  4.45        NA
#3  1004  4.50        NA
#4  1004  8.01 0.4563636
#5  1005  4.45        NA
#6  1005  4.50        NA