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

如何用代码批量实现权重矩阵与收益矩阵的乘法并存储结果

批量计算权重组合的收益矩阵

问题描述

已通过以下R代码生成100组随机权重(对应4个交易标的):

# 创建存储权重的矩阵
all_wts <- matrix(nrow = 100,
 ncol = length(tickers))  ### 标的数量为4                   

# 循环生成100组权重
for (i in 1:100) {
  wts <- runif(length(tickers))
  wts <- wts/sum(wts)

# 将权重存入矩阵
  all_wts[i,] <- wts }

生成的权重矩阵$w$每行对应一组权重:
$$ w= \begin{bmatrix}
w_1 & w_2 & w_3 & w_4 \
\vdots& \vdots & \vdots & \vdots \
\vdots & \vdots & \vdots & \vdots \
\end{bmatrix}$$

需要将每组权重与日对数收益矩阵$R_t$(对应代码中的log.return,共252行4列)逐元素相乘后按行求和。手动重复的示例代码如下:

a1 <- all_wts[1,] 
b <- log.return
yts <-  rowSums(a1 * b)
a2 <- all_wts[2,] 
b <- log.return
yts2 <- rowSums(a2*b)

手动重复效率极低,需批量完成运算并将结果存入新矩阵。


解决方案

方法1:矩阵乘法(最优解,高效简洁)

从线性代数角度,每组权重与收益矩阵的行求和操作,等价于收益矩阵与权重矩阵的转置相乘。最终结果矩阵的每行对应一个交易日,每列对应一组权重组合的收益。

代码实现:

# 直接通过矩阵乘法批量计算,结果维度:交易日数 × 权重组合数
portfolio_returns <- log.return %*% t(all_wts)

说明:log.return为252×4矩阵,t(all_wts)为4×100矩阵,相乘后得到252×100的矩阵,每一列对应一组权重计算出的每日收益序列,与手动计算结果完全一致。

方法2:apply函数遍历权重

若偏好直观的遍历逻辑,可使用apply函数对all_wts的每一行(每组权重)执行计算:

# 遍历每组权重,计算对应收益序列,转置后得到目标矩阵
portfolio_returns <- t(apply(all_wts, 1, function(w) {
  rowSums(w * log.return)
}))

说明:apply(all_wts, 1, ...)遍历权重矩阵的每一行,计算该行对应的每日收益序列,最后用t()转置,使结果结构与方法1一致。

方法3:改进循环批量存储

若习惯循环写法,可提前初始化结果矩阵,在循环中直接存储计算结果:

# 初始化结果矩阵,维度:交易日数 × 权重组合数
portfolio_returns <- matrix(nrow = nrow(log.return), ncol = nrow(all_wts))

# 循环计算每组权重对应的收益序列
for (i in 1:nrow(all_wts)) {
  wts <- all_wts[i,]
  portfolio_returns[,i] <- rowSums(wts * log.return)
}

说明:提前创建结果矩阵避免重复内存分配,每次循环将计算结果存入对应列,效率远高于手动重复代码。


内容的提问来源于stack exchange,提问作者A.F.R.S2022

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 09:20:21