R - 按权重组应用自定义函数

问题描述 投票:0回答:2

我有一些关于股票收益的数据。它包括两个投资者在同一时间月份的投资组合。两位投资者都拥有相同的股票,但在各自投资组合中的数量/权重不同。在相关月份中,投资组合权重不会发生变化。

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])

建议表示赞赏。谢谢。

r finance portfolio
2个回答
0
投票

您正在寻找

by
.

by(returns_df, returns_df$Investor, \(x) lvar(x[3:5], x[6:8])) |> c()
#    Jane     Tom 
# 0.06327 0.07496 

0
投票

主要问题是代码中没有拆分权重。我们可以使用

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
© www.soinside.com 2019 - 2024. All rights reserved.