如何将XTS对象与权重向量正确相乘以构建投资组合?
解决XTS对象与权重向量相乘的匹配问题
我来帮你搞定这个问题!首先得搞清楚为什么会出现这种奇怪的结果:
问题根源
XTS本质是带时间索引的矩阵,当你用一个长度为4的权重向量和它做元素乘法时,R会按元素位置循环匹配——也就是把权重向量重复6次(因为你的stocks有6行),然后和stocks的24个元素逐个相乘,这就导致了每一行的元素并没有和对应列的权重匹配,才出现了那种混乱的0和原值交错的情况。
具体解决办法
这里给你几个实用的方案,按需选择:
方案1:按列对应相乘(最直观)
直接针对每一列,匹配对应的权重值相乘,再重新组合成XTS对象:
library(xts) # 对stocks的每一列,乘以part[1,]中对应的权重 weighted_cols <- lapply(seq_along(colnames(stocks)), function(i) { stocks[,i] * part[1, i] }) # 合并成新的XTS对象 weighted_stocks <- do.call(cbind, weighted_cols) colnames(weighted_stocks) <- colnames(stocks) head(weighted_stocks)
方案2:生成同维度权重矩阵再相乘
把单个权重向量扩展成和stocks行数一致的矩阵(每一行都是这个权重向量),这样元素乘法就会按列对应了:
# 生成和stocks行数相同的权重矩阵,每一行都是part[1,] weight_mat <- matrix(rep(part[1,], nrow(stocks)), nrow = nrow(stocks), byrow = TRUE) # 直接元素级相乘 weighted_stocks <- stocks * weight_mat head(weighted_stocks)
方案3:高效计算组合总收益(如果这是你的最终目标)
如果你其实是想得到每日的投资组合总收益(而不是每只股票的加权后价格),可以直接用矩阵点积,一步到位:
# 计算每日组合总价值:每行日期的股票价格和权重的点积 portfolio_total <- xts(rowSums(stocks * weight_mat), index(stocks)) # 或者更简洁的矩阵乘法写法 portfolio_total <- xts(stocks %*% part[1,], index(stocks)) head(portfolio_total)
试一下这些方法,应该就能得到你预期的结果啦!
内容的提问来源于stack exchange,提问作者Agarp
相关产品推荐
相关产品推荐

