[英]Calculating compound return in a row
我有以下數據框,我需要計算這三年的復合回報。
2013 2014 2015 2016 Compound
21480 26384 166760 259842 12.1
104530 92259 80700 79434 0.76
28245 31614.7 29591.3 28557.1 1.01
第三列Compound
是第三行以下公式中2013-16數據的乘積:
(31614.7/28245) * (29591.3/31614.7) * (28557.7/29591.3) = 1.0111
以下是我的啞代碼:
CR <- rep(1,3);
Compounding_Yrs <- 3;
Annual_Gwth <- data.frame(matrix(NA, nrow = 3, ncol = 3));
for(i in 1:nrow(dt))
for(j in 1:Compounding_Yrs)
{
Annual_Gwth[i,j]<-dt[i,j+1]/dt[i,j];
CR[i]<-CR[i]*Annual_Gwth[i,j]
}
CR
是最后一列的復合比率。 我的數據集dt
有10萬多行,因此上面的代碼非常慢。
必須有更好的方法來做到這一點。 將不勝感激。
您所需要做的就是將去年除以第一年。
例如第3行:
> 28557.1/28245
[1] 1.01105
而且您不必遍歷行。 R與向量配合良好。
所以
dt[,4] / dt [,1]
會做的工作。
您可以通過向量化方式一次完成所有操作( df
是您的數據):
(df[,2]/df[,1])*(df[,3]/df[,2])*(df[,4]/df[,3])
希望我沒有弄錯這個問題:
當您在年份T1和T2之間鏈接復合時,由於中間項被取消,因此解決方案歸結為T2的值/ T1的值。 例如:
(31614.7 / 28245)*(29591.3 / 31614.7)*(28557.7 / 29591.3)= 1.0111
歸結為:28557.7 / 28245,因為其他條款已取消。
因此,我的簡單解決方案是將第4列除以第1列,並將其記錄在最后一列中。 這也將照顧中間列中可能出現的任何0(由於缺少數據等):
DF[,5] <- DF[,4] / DF[,1]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.