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

如何在R语言PortfolioAnalytics中启用做空机制

投资组合优化启用做空后权重全为0的解决方法

问题重现

使用PortfolioAnalytics包进行最小方差投资组合优化时,将原有的long_only约束替换为允许做空的box约束(min=-1, max=1)后,优化结果显示所有资产权重均为0,无法得到合理的多空组合。

原因分析

出现权重全0的核心原因主要有两个:

  • 优化器收敛不足:默认的DEoptim优化器迭代次数、种群规模设置较低,难以找到满足full_investment(权重和为1)且最小化方差的有效解,陷入局部最优。
  • 约束过度宽松:极端的min=-1, max=1约束可能让优化器试图寻找完全对冲风险的组合,但实际数据中难以实现,导致优化逻辑失效。

解决步骤

1. 优化DEoptim参数,提升收敛能力

修改optimize.portfolio的optim.control参数,增加迭代次数和种群规模,帮助优化器跳出局部最优:

OptimizedPortfolioMinVariance=optimize.portfolio(
  R=securities_matrix,
  portfolio=MinimumVariancePortfolio, 
  trace=TRUE,
  optimize_method = "DEoptim",
  optim.control = list(itermax = 1000, NP = 500) # 提升迭代次数与种群数量
)

2. 调整做空约束范围

将box约束的范围适度收窄,减少优化难度,比如限制单个资产做空/做多比例不超过50%:

MinimumVariancePortfolio=add.constraint(
  portfolio = MinimumVariancePortfolio,
  type="box", min=-0.5, max=0.5
)

3. 切换到ROI优化器

ROI优化器在处理二次规划问题(如最小方差组合)时稳定性更强,需先安装依赖包:

install.packages(c("ROI", "ROI.plugin.quadprog", "ROI.plugin.glpk"))

然后使用ROI执行优化:

OptimizedPortfolioMinVariance=optimize.portfolio(
  R=securities_matrix,
  portfolio=MinimumVariancePortfolio, 
  trace=TRUE,
  optimize_method = "ROI"
)

4. 验证约束有效性

检查组合对象的约束是否正确加载:

print(MinimumVariancePortfolio$constraints)

确认输出包含full_investment类型约束,且权重和要求为1。

完整修改后代码示例

library(quantmod)
library(PerformanceAnalytics)
library(PortfolioAnalytics)
library(DEoptim)
# 首次运行需安装ROI依赖
# install.packages(c("ROI", "ROI.plugin.quadprog", "ROI.plugin.glpk"))

symbol_list = c('AAPL','MSFT','GOOGL','AMZN','TSLA','BRK-A','META', 'UNH','NVDA', 'JNJ')

maxDate <- "2017-10-27"
minDate <- "2022-10-26"
getSymbols(symbol_list, from = maxDate, to = minDate)
getSymbols("^GSPC", from = maxDate, to = minDate)

# 构建收益率矩阵
securities_matrix = NULL
for( sym in symbol_list){
  securities_matrix = merge.xts(securities_matrix, Return.calculate(Ad(get(sym)), method='discrete'))
}
securities_matrix = securities_matrix[complete.cases(securities_matrix)]

fund.names <- colnames(securities_matrix)

# 构建允许做空的最小方差组合
MinimumVariancePortfolio = portfolio.spec(assets=fund.names)

# 全投资约束
MinimumVariancePortfolio = add.constraint(
  portfolio = MinimumVariancePortfolio,
  type="full_investment"
)

# 箱型约束(限制多空比例)
MinimumVariancePortfolio = add.constraint(
  portfolio = MinimumVariancePortfolio,
  type="box", min=-0.5, max=0.5
)

# 最小化方差目标
MinimumVariancePortfolio = add.objective(
  portfolio=MinimumVariancePortfolio,
  type="risk", name="StdDev"
)

# 使用ROI优化
OptimizedPortfolioMinVariance = optimize.portfolio(
  R=securities_matrix,
  portfolio=MinimumVariancePortfolio, 
  trace=TRUE,
  optimize_method = "ROI"
)

# 查看与可视化权重
print(OptimizedPortfolioMinVariance$weights)
chart.Weights(OptimizedPortfolioMinVariance)

内容的提问来源于stack exchange,提问作者Louisinator

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 04:15:18