riskParityPortfolio与portfolioBacktest回测结果为空,求原因排查
问题原因及解决方案
你的回测结果为空,大概率是以下几个原因导致的,对应解决方案如下:
1. 股票代码过时
Facebook的股票代码已从FB改为META,使用旧代码会导致无法下载该股票的数据,进而使价格矩阵中出现大量NA,后续协方差计算、风险平价权重求解都会失败,最终回测无结果。
解决:将代码中的"FB"替换为"META"。
2. 收益数据处理错误
你在计算对数收益时多写了[-1],这会额外去掉第一个收益样本,虽然一般不会直接导致结果为空,但如果遇到样本量刚好卡阈值的情况,可能引发协方差矩阵计算异常。此外,未处理数据中的NA值,也是潜在的报错点。
解决:移除[-1],并添加NA值处理步骤。
3. 策略函数未处理异常场景
当回测窗口内的收益数据样本量不足(少于资产数量),或者协方差矩阵奇异时,riskParityPortfolio会返回空值,导致回测流程中断,没有结果输出。
解决:在策略函数中添加异常判断,返回默认权重(比如等权)兜底。
修改后的完整代码
library(portfolioBacktest) library(riskParityPortfolio) # 下载价格数据(更新股票代码) faang_data <- stockDataDownload(c("GOOG", "NFLX", "AAPL", "AMZN", "META"), from = "2014-01-01", to = "2019-06-25") # 定义风险平价策略(添加异常处理) risk_parity <- function(dataset) { prices <- dataset$adjusted # 计算对数收益,移除NA值 log_returns <- diff(log(prices)) |> na.omit() # 样本量不足时返回等权 asset_count <- ncol(prices) if(nrow(log_returns) < asset_count) { return(rep(1/asset_count, asset_count)) } # 计算协方差矩阵,检查是否奇异 cov_mat <- cov(log_returns) if(any(eigen(cov_mat)$values < 1e-8)) { return(rep(1/asset_count, asset_count)) } # 求解风险平价权重 return(riskParityPortfolio(cov_mat)$w) } # 执行回测 bt <- portfolioBacktest(list("risk parity portfolio" = risk_parity), list(faang_data), lookback= 12*20, optimize_every = 3*20, rebalance_every = 3*20) # 查看绩效汇总 backtestSummary(bt)$performance
内容的提问来源于stack exchange,提问作者Jae Hoon
相关产品推荐
相关产品推荐

