簡體   English   中英

連續計算復合收益

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM