基于变量值创建新Data.Frame:股票日度组合权重计算需求
解决股票投资组合每日指标计算问题
我来帮你搞定这个股票数据处理需求,咱们先从修正测试数据开始,再一步步实现你要的所有计算:
第一步:修正测试数据的日期格式
你提供的测试数据日期格式是"2017-22-11",这不符合标准的年-月-日格式,所以没法转换成日期类型。咱们先把它改成正确的格式,比如"2017-11-22"(年-月-日):
# 修正后的测试数据 RawInput <- data.frame( Date = c("2017-11-22", "2017-12-22", "2017-11-23", "2017-11-22", "2017-12-22", "2017-11-23", "2017-11-22"), Close = c(50, 55, 56, 10, 11, 12, 200), Volume = c(100, 110, 150, 60, 70, 80, 30), Stock_ID = factor(c(1, 1, 1, 2, 2, 2, 3)) ) # 转换成日期类型 RawInput$Date <- as.Date(RawInput$Date)
第二步:用dplyr实现每日指标计算
我们用dplyr包来完成分组计算,它能轻松处理可变数量的股票,完全适配你“每个日期1至n只股票”的数据特点。以下是完整的代码:
library(dplyr) # 计算核心指标 portfolio_data <- RawInput %>% # 1. 先计算每只股票的当日交易价值(收盘价*成交量) mutate(Trade_Value = Close * Volume) %>% # 2. 按日期分组,计算当日总交易价值,并给每只股票标记当日总价值 group_by(Date) %>% mutate(Daily_Total_Value = sum(Trade_Value)) %>% # 3. 计算每只股票的当日权重(个股交易价值/当日总交易价值) mutate(Weight = Trade_Value / Daily_Total_Value) %>% # 4. 将数据转成宽格式:每个日期一行,每只股票的权重单独成列 tidyr::pivot_wider( id_cols = Date, names_from = Stock_ID, values_from = Weight, names_prefix = "Stock_", values_fill = 0 # 当日没有交易的股票权重填0 ) %>% # 5. 计算每日收益率:(当日总价值 - 前一日总价值)/前一日总价值 mutate(Daily_Return = (Daily_Total_Value - lag(Daily_Total_Value)) / lag(Daily_Total_Value)) %>% # 取消分组 ungroup() # 查看结果 print(portfolio_data)
代码解释
- 交易价值计算:
Trade_Value = Close * Volume,得到每只股票当日的成交总金额。 - 每日总价值:按
Date分组后用sum(Trade_Value)计算当日所有股票的总交易价值。 - 股票权重:用个股交易价值除以当日总价值,得到该股票在当日组合中的占比。
- 宽格式转换:用
pivot_wider把每只股票的权重转成单独列,这样每个日期只会出现一行,完全符合你要的新DataFrame格式;values_fill=0确保当日没交易的股票权重显示为0,兼容可变数量的股票。 - 每日收益率:用
lag()函数获取前一日的总交易价值,然后计算当日相对于前一日的收益率。
结果说明
最终的portfolio_data包含以下列:
Date:日期(每个日期唯一)Daily_Total_Value:当日所有股票的总交易价值Stock_1、Stock_2、Stock_3...:对应股票当日的组合权重(自动适配数据中的股票数量)Daily_Return:当日组合的收益率(第一日因为没有前一日数据,会显示NA,你可以根据需求处理)
内容的提问来源于stack exchange,提问作者Rbitrage
相关产品推荐
相关产品推荐

