2016-04-22 88 views
-3

我想请求一些关于如何创建股票数据累积收益新栏的帮助。我的数据结构如下:使用数据表R计划累计收益期计算

Month  Stock Ret 

Jan-2001 A  0.01  
Feb-2001 B  0.02  
Jan-2002 B  0.01  
Feb-2002 B  0.03 

该数据为10年。我想为每只股票以12个月为增量计算累计回报。

例如,第一期回报将涵盖2001年1月至2001年12月。第二阶段将从2001年2月到2002年1月的 等等。

这些计算将按每只股票进行,并将使用每个周期计算的非累计回报。由于我有很多年的股票,我想看看是否有更有效的方法来做这些计算比for循环。

我一直在寻找方法来尝试和data.table包做,但我不确定如何做到这一点。

编辑:

也许我的循环功能,可以更好地解释我想达到的目标。

my.data <- data.frame(Date = seq.Date(as.Date('2001-01-01'), by ='month', length = 24), stock = factor(c(rep('A', 2*12), rep('B', 2*12))), Ret = c(rep(c(.02,.01,0,.03,.02,.01,02,.01,0,.03,.02,.01), 2))) 

final_table <- list() 
num_periods <- 2*12-12 


for(i in unique(my.data$stock)){ 

    ts_i = ts(my.data[my.data$stock==i, 'Ret']) 

    table_i = matrix(nrow=length(ts_i), ncol=15) 

    num_periods = length(ts_i)-12 

    table_i[,1] = ts_i 

    table_i[,14] = i 

    table_i[,15] = ts(my.data[my.data$stock==i,'Date']) 

    for(j in 1:num_periods){ 
    myperiod = cumprod(ts_i[j:(j+11)]+1)-1 
    table_i[12+j,2:13] = myperiod 
    } 
colnames(table_i) = c('original', paste0('p',-12:-2),'p1','stock','Date') 
final_table[[i]] = table_i 
} 

new.my.data = do.call('rbind',final_table) 

new.my.data = na.omit(new.my.data) 
+0

问题缺乏可重现的例子 – jangorecki

+0

也许我的循环函数可以更好地解释我想实现的目标。 – Joshua

回答

0

如果我理解正确,您希望单个股票的年度总和Ret。首先,我想先

df <- cbind(do.call('rbind',strsplit(df$Month,"-")),df[,c(2,3)]) 
names(df)[c(1,2)] <- c("Month","Year") 

从数据中提取年内然后按年份和股票

aggregate(df[,"Ret"],by=list("Year" = df$Year,"Stock"=df$Stock),FUN=sum) 

在这种格式

Year Stock x 
1 2001  A 0.04 
2 2002  B 0.04 
3 2003  B 0.02 

产生DF汇总数据,它不应该是一个可视化的问题。

编辑:

这个怎么样?

aggregate(df[,"Ret"],by=list("Year" = df$Year,"Stock"=df$stock),FUN= function(x) {return (cumprod (x+1)-1)}) 

应该产生这样的:

Year Stock  x.1  x.2  x.3  x.4  x.5  x.6   x.7  x.8  x.9  x.10  x.11  x.12 
1 2001  A 0.02000000 0.03020000 0.03020000 0.06110600 0.08232812 0.09315140 2.27945420 2.31224875 2.31224875 2.41161621 2.47984853 2.51464702 
2 2002  A 0.02000000 0.03020000 0.03020000 0.06110600 0.08232812 0.09315140 2.27945420 2.31224875 2.31224875 2.41161621 2.47984853 2.51464702 
3 2001  B 0.02000000 0.03020000 0.03020000 0.06110600 0.08232812 0.09315140 2.27945420 2.31224875 2.31224875 2.41161621 2.47984853 2.51464702 
4 2002  B 0.02000000 0.03020000 0.03020000 0.06110600 0.08232812 0.09315140 2.27945420 2.31224875 2.31224875 2.41161621 2.47984853 2.51464702 

该报道每年,但我认为你可以操纵和分类月/年,这样很容易符合您的要求。

+0

你好马雷克,谢谢你的回应。你提供的例子并不完全符合我的要求。我编辑了我的问题,以包含我正在寻找的示例代码。 – Joshua