我有一些关于股票收益的数据。它包括两个投资者在同一时间月份的投资组合。两位投资者都拥有相同的股票,但在各自投资组合中的数量/权重不同。在相关月份中,投资组合权重不会发生变化。
returns_df <- data.frame(
Investor = c("Jane","Jane","Jane","Jane","Jane","Tom","Tom","Tom","Tom","Tom"),
Month = c("January","February","March","April","May","January","February","March","April","May"),
Stock_A = c(0.2,0.3,-0.1,0.2,0.4,0.2,0.3,-0.1,0.2,0.4),
Stock_B = c(0.1,-0.3,0.5,0.6,-0.1,0.1,-0.3,0.5,0.6,-0.1),
Stock_C = c(0.5,0.7,-0.3,-0.3,0.1,0.5,0.7,-0.3,-0.3,0.1),
Weight_Stock_A = c(0.5,0.5,0.5,0.5,0.5,0.2,0.2,0.2,0.2,0.2),
Weight_Stock_B = c(0.2,0.2,0.2,0.2,0.2,0.4,0.4,0.4,0.4,0.4),
Weight_Stock_C = c(0.3,0.3,0.3,0.3,0.3,0.4,0.4,0.4,0.4,0.4))
我有一个自定义 R 函数,可以计算股票投资组合的方差 -
lvar <- function(x, weights, na.rm = TRUE) {
if (missing(weights)) {
weights <- rep(1, ncol(x))
}
covmat <- var(x = x, na.rm = na.rm)
utc <- upper.tri(covmat)
wt.var <- sum(diag(covmat) * weights^2)
wt.cov <- sum(weights[row(covmat)[utc]] *
weights[col(covmat)[utc]] *
covmat[utc])
variance <- wt.var + 2 * wt.cov
return(variance)
}
我想为每个投资者使用他们各自的投资组合权重应用此功能。
我用过 sapply 但它似乎没有应用权重。
variance <- sapply(split(returns_df[3:5], returns_df$Investor), lvar,
weights=returns_df[6:8])
建议表示赞赏。谢谢。
您正在寻找
by
.
by(returns_df, returns_df$Investor, \(x) lvar(x[3:5], x[6:8])) |> c()
# Jane Tom
# 0.06327 0.07496
主要问题是代码中没有拆分权重。我们可以使用
Map
遍历列表元素
Map(lvar, split(returns_df[3:5], returns_df$Investor),
weights = split(returns_df[6:8], returns_df$Investor))
-输出
$Jane
[1] 0.06327
$Tom
[1] 0.07496
或使用
dplyr
library(dplyr)#version >= 1.1.0
returns_df %>%
reframe(out = lvar(pick(starts_with("Stock")),
weights = pick(starts_with("Weight"))), .by = Investor)
-输出
Investor out
1 Jane 0.06327
2 Tom 0.07496