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
相关产品推荐
相关产品推荐

