在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




