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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 15:50:38