2016-04-22 86 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