如何在R中配置初始投资的累积股息再投资
股息再投资的股票总价值计算(R语言实现)
步骤1:加载依赖包与获取数据
首先加载tidyverse工具包,调用提供的D_NVDY_Pull()函数获取Yahoo Finance月度数据,并确保数据按日期排序(避免计算顺序出错):
library(tidyverse) # 获取数据 df <- D_NVDY_Pull() # 按日期升序排列 df <- df %>% arrange(Date)
步骤2:定义初始参数
设定初始投资金额与对应初始股票数量:
initial_investment <- 1000 # 按第一期平均股价计算初始股票数,或直接用示例值44.4 initial_shares <- initial_investment / first(df$Avg_Price) # initial_shares <- 44.4 # 直接使用示例值时取消注释
步骤3:递推计算股息再投资相关列
由于New Shares、Cumulative New Shares等列存在行间依赖(当期值依赖上期累积结果),直接用mutate+lag无法完成完整递推,以下提供两种实现方式:
方式一:for循环(直观易理解)
# 初始化空列存储计算结果 df$New_Shares <- 0 df$Cumulative_New_Shares <- 0 df$Total_Shares <- 0 df$Total_Value <- 0 # 第一期初始化 df$Total_Shares[1] <- initial_shares df$Total_Value[1] <- initial_shares * df$Avg_Price[1] # 从第二期开始递推计算 for (i in 2:nrow(df)) { # 当期新增股票数 = 上期总股票数 * 当期股息 / 当期平均股价 df$New_Shares[i] <- df$Total_Shares[i-1] * df$Dividends[i] / df$Avg_Price[i] # 累积新增股票数 = 上期累积值 + 当期新增值 df$Cumulative_New_Shares[i] <- df$Cumulative_New_Shares[i-1] + df$New_Shares[i] # 总股票数 = 初始数 + 累积新增数 df$Total_Shares[i] <- initial_shares + df$Cumulative_New_Shares[i] # 总价值 = 总股票数 * 当期平均股价 df$Total_Value[i] <- df$Total_Shares[i] * df$Avg_Price[i] }
方式二:purrr::accumulate(函数式编程,更简洁)
利用accumulate函数传递每一期的总股票数状态,避免显式循环:
# 定义递推函数:输入上期总股票数,返回当期总股票数 update_shares <- function(prev_total, current_row) { new_shares <- prev_total * current_row$Dividends / current_row$Avg_Price prev_total + new_shares } # 计算每一期的总股票数 df$Total_Shares <- accumulate( .x = df[-1, ], # 从第二期开始迭代 .f = update_shares, .init = initial_shares # 初始股票数作为初始状态 ) # 基于总股票数计算其他列 df <- df %>% mutate( # 新增股票数 = 当期总股票数 - 上期总股票数 New_Shares = Total_Shares - lag(Total_Shares, default = initial_shares), # 累积新增股票数 = 总股票数 - 初始股票数 Cumulative_New_Shares = Total_Shares - initial_shares, # 总价值 = 总股票数 * 当期平均股价 Total_Value = Total_Shares * Avg_Price )
关键说明
- 必须确保数据按
Date升序排列,否则递推逻辑会出错。 - 若
Dividends列包含0(无股息月份),代码会自动处理(新增股票数为0,总股票数保持不变)。 - 两种方式计算结果完全一致,可根据个人习惯选择。
内容的提问来源于stack exchange,提问作者TheNautical_Sailor
相关产品推荐
相关产品推荐

