You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

在R中基于DataFrame行计算月度收益率的实现方法

没问题,这在R里实现起来很顺畅,而且还能轻松适配以后多股票的场景。我给你两种常用的实现方式,你可以根据自己的习惯选:

方法一:用dplyr包(推荐,代码更直观易读)

首先我们先把你的样本数据在R里还原出来,然后一步步处理:

# 1. 构造样本数据DF1
DF1 <- data.frame(
  Date = c("1/31/2011", "2/28/2011", "3/31/2011", "4/29/2011", "5/31/2011", "6/30/2011", "7/29/2011", "8/31/2011"),
  Price = c(339.32, 353.21, 348.45, 348.23, 347.83, 335.67, 390.48, 348.83),
  Stock = rep("AAPL", 8)
)

# 2. 把日期列转成日期格式(好习惯,避免后续排序或分组出问题)
DF1$Date <- as.Date(DF1$Date, format = "%m/%d/%Y")

# 3. 安装并加载dplyr包(如果没装过的话)
# install.packages("dplyr")
library(dplyr)

# 4. 按股票分组计算收益率
DF2 <- DF1 %>%
  group_by(Stock) %>%  # 确保不同股票的收益率单独计算,不会串数据
  mutate(RETURNS = (Price / lag(Price)) - 1) %>%  # lag(Price)取上一行的价格
  ungroup()

# 查看结果
print(DF2)

运行后你会看到第一行的RETURNS是NA,这很正常——第一个月没有上月价格来计算收益率。

方法二:基础R实现(不用额外装包)

如果你不想安装新包,用基础R的ave()函数也能搞定:

# 1. 同样先构造并处理数据(和上面步骤1、2一样)
DF1 <- data.frame(
  Date = c("1/31/2011", "2/28/2011", "3/31/2011", "4/29/2011", "5/31/2011", "6/30/2011", "7/29/2011", "8/31/2011"),
  Price = c(339.32, 353.21, 348.45, 348.23, 347.83, 335.67, 390.48, 348.83),
  Stock = rep("AAPL", 8)
)
DF1$Date <- as.Date(DF1$Date, format = "%m/%d/%Y")

# 2. 计算收益率
DF1$RETURNS <- ave(DF1$Price, DF1$Stock, FUN = function(x) (x / c(NA, x[-length(x)])) - 1)
DF2 <- DF1

# 查看结果
print(DF2)

两种方法得到的结果是一样的,选你顺手的就行~

内容的提问来源于stack exchange,提问作者Zhoe

火山引擎 最新活动