You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R按投资者分组应用带权重的自定义投资组合方差函数

按投资者分组计算投资组合方差的解决方案

你当前的代码无法正确应用权重,核心原因是传递给lvar的weights参数是完整的权重数据框,而非每个投资者对应的专属权重向量。因为每个投资者的权重在所有月份保持一致,我们只需要提取每个投资者的单一行权重即可。

方法1:使用mapply匹配收益组与权重

先提取每个投资者的唯一权重向量,再通过mapply将收益数据和对应权重一一配对:

# 提取每个投资者的固定权重(取第一行即可,所有行权重一致)
investor_weights <- split(returns_df[, 6:8], returns_df$Investor) |>
  lapply(function(w_df) unlist(w_df[1, ]))

# 用mapply分别传入每个投资者的收益数据和权重
variance <- mapply(lvar,
                   x = split(returns_df[, 3:5], returns_df$Investor),
                   weights = investor_weights)

方法2:使用by函数直接分组计算

by函数可以直接按投资者分组处理数据,在分组函数内同时提取收益和权重:

variance <- by(returns_df, returns_df$Investor, function(group_df) {
  # 从分组数据中提取收益列和权重向量
  stock_returns <- group_df[, 3:5]
  weights <- unlist(group_df[1, 6:8])
  lvar(x = stock_returns, weights = weights)
})

验证结果

运行上述代码后,你会得到两位投资者的投资组合方差:

> variance
      Jane        Tom 
0.06808000 0.08578667

为什么原代码失效?

原代码中sapply(split(returns_df[3:5], returns_df$Investor), lvar, weights=returns_df[6:8])会把完整的returns_df[6:8]数据框传递给每个分组的lvar函数,而lvar需要的是长度与股票数量匹配的权重向量,这就导致权重参数无法正确参与计算。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 13:17:42