如何用代码批量实现权重矩阵与收益矩阵的乘法并存储结果
批量计算权重组合的收益矩阵
问题描述
已通过以下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
相关产品推荐
相关产品推荐

