在 R 中迭代复合 returns(如 Excel Product 函数)
Iterate compound returns in R (like Excel Product function)
我正在尝试编写一个简单的函数来重现 Excel 中的 PRODUCT 函数,该函数可用于计算 return 的投资。给定一段时间内的 return 向量(如下所示),我想计算整个持有期间的总 return 。
library(scales)
vec=c(2.1,3.1,5,-2.3,1.7,-9.8)
vecpercent=percent(vec/100)
在 Excel 中,这将计算为数组函数,如下所示:{=1+PRODUCT(B4:B9)-1},如果 "vecpercent" 中的 returns在单元格 B4 到 B9.This 中相当于 (1+r1)(1+r2)...(1+rn),其中 n 是周期数。
我正在尝试使用 for 循环来解决这个问题,我意识到这在 R 世界中是禁忌。如果可能的话,我很想听听更好的方法。但是如果需要一个循环,我是否还需要制作一个 "helper" 列,我将 return 的每个速率与前一个速率相乘?
谢谢。
我认为您正在寻找(矢量化)cumprod
函数:
cumprod(1 + vec / 100) - 1
# [1] 0.0210000 0.0526510 0.1052835 0.0798620 0.0982197 -0.0094058
如果您只想查找最后一个值,可以使用 prod
:
prod(1 + vec / 100) - 1
[1] -0.0094058
(您可以再次将其输入 percent()
,以获得漂亮的格式。)
我正在尝试编写一个简单的函数来重现 Excel 中的 PRODUCT 函数,该函数可用于计算 return 的投资。给定一段时间内的 return 向量(如下所示),我想计算整个持有期间的总 return 。
library(scales)
vec=c(2.1,3.1,5,-2.3,1.7,-9.8)
vecpercent=percent(vec/100)
在 Excel 中,这将计算为数组函数,如下所示:{=1+PRODUCT(B4:B9)-1},如果 "vecpercent" 中的 returns在单元格 B4 到 B9.This 中相当于 (1+r1)(1+r2)...(1+rn),其中 n 是周期数。
我正在尝试使用 for 循环来解决这个问题,我意识到这在 R 世界中是禁忌。如果可能的话,我很想听听更好的方法。但是如果需要一个循环,我是否还需要制作一个 "helper" 列,我将 return 的每个速率与前一个速率相乘?
谢谢。
我认为您正在寻找(矢量化)cumprod
函数:
cumprod(1 + vec / 100) - 1
# [1] 0.0210000 0.0526510 0.1052835 0.0798620 0.0982197 -0.0094058
如果您只想查找最后一个值,可以使用 prod
:
prod(1 + vec / 100) - 1
[1] -0.0094058
(您可以再次将其输入 percent()
,以获得漂亮的格式。)