如何在base R中计算投资组合的每日美元价值
R语言data.frame计算投资组合每日美元价值方案
原代码无法运行的核心原因
- R语言中
for循环本身不返回计算结果,无法直接通过赋值符给data.frame新增列填充值 - 代码未提前定义初始投资金额变量、未初始化存储结果的列,引用的
BTCgrowth对象无前置定义 - 循环逻辑未覆盖第一行首日价值的计算规则
可直接运行的实现代码
方法1:修正逻辑后的for循环实现
适合习惯循环写法的场景,提前分配列内存可以大幅提升运行速度:
# 定义初始投资金额 initial_invest <- 5000 # 提前初始化结果列,避免循环中逐行扩容的性能损耗 BTCdf$daily_value <- numeric(nrow(BTCdf)) # 计算首日投资价值 BTCdf$daily_value[1] <- initial_invest * (1 + BTCdf[1, 3]) # 从第二行开始逐行迭代计算 for (i in 2:nrow(BTCdf)) { BTCdf$daily_value[i] <- BTCdf$daily_value[i-1] * (1 + BTCdf[i, 3]) }
提示:如果第3列存储的已经是「1+日收益率」的净值数据,代码里不需要再加1,直接做乘法即可。
方法2:向量化实现(推荐,性能远高于循环)
R内置的累积乘积函数cumprod()可以直接实现复利连乘逻辑,不需要写循环,万行以上数据运行速度比循环快数十倍:
initial_invest <- 5000 # 先计算每日(1+收益率)的累积乘积,再乘初始本金得到每日对应价值 BTCdf$daily_value <- initial_invest * cumprod(1 + BTCdf[, 3])
逻辑说明:cumprod()会逐行返回从第一行到当前行的所有输入值的连乘结果,和你需要的「前一日价值乘当日涨跌幅」的复利计算逻辑完全一致,计算结果和循环写法完全相同。
计算前注意事项
- 先确认数据集已经按交易日期升序排列,日期顺序错误会导致所有计算结果失效
- 确认日收益率为小数格式(例如当日上涨5%对应值为0.05,不是5),如果是百分比数值需要先除以100转换
- 如果收益率列存在缺失值,需要先完成缺失值填充或剔除对应行,否则累积计算会返回NA
内容的提问来源于stack exchange,提问作者Marcus Ma
相关产品推荐
相关产品推荐

