当前位置:首页>python>用 Python 玩转投资组合优化:风险与收益的最佳平衡术

用 Python 玩转投资组合优化:风险与收益的最佳平衡术

  • 2026-08-27 05:51:59
用 Python 玩转投资组合优化:风险与收益的最佳平衡术

2026年重磅升级已全面落地!欢迎加入专注财经数据与量化投研的【数据科学实战】知识星球!您将获取持续更新的《财经数据宝典》与《量化投研宝典》,双典协同提供系统化指引;星球内含300篇以上独有高质量文章,深度覆盖策略开发、因子分析、风险管理等核心领域,内容基本每日更新;同步推出的「量化因子专题教程」系列(含完整可运行代码与实战案例),系统详解因子构建、回测与优化全流程,并实现日更迭代。我们持续扩充独家内容资源,全方位赋能您的投研效率与专业成长。无论您是量化新手还是资深研究者,这里都是助您少走弯路、事半功倍的理想伙伴,携手共探数据驱动的投资未来!

引言

从云计算到 AI 浪潮,科技股一直是美股增长的强劲引擎。然而,高收益往往伴随着高波动——投资者在享受丰厚回报的同时,也不得不面对市场剧烈震荡带来的"胃痛"时刻。

那么问题来了:如何在追求高收益的同时,把风险控制在可接受范围内?

本文将带你了解一个基于 Python 的投资组合优化框架,通过 Riskfolio-Lib 和 QuantStats 两大利器,实现对美股科技股的风险驱动型投资组合构建与回测分析。

核心工具介绍

Riskfolio-Lib:投资组合优化神器

Riskfolio-Lib 是一个开源的 Python 投资组合优化库,主要特点包括:

  • • 支持 24 种风险度量指标(方差、标准差、VaR、CVaR、最大回撤等)
  • • 提供多种优化模型(风险平价、最差情景均值方差等)
  • • 支持资产和因子配置
  • • 可添加交易成本、流动性、监管限制等约束条件

QuantStats:回测分析框架

QuantStats 提供了全面的投资组合分析能力,包括绩效指标、风险评估、回撤分析和综合报告生成。

为什么选择 Ulcer Index(溃疡指数)?

传统风险指标如标准差会同时考虑上涨和下跌的波动,但对投资者来说,真正让人"胃痛"的只有下跌。Ulcer Index 专注于衡量下行风险,更贴近投资者的真实体验。

实战案例:优化十大科技股投资组合

第一步:获取股票数据

import numpy as npimport pandas as pdimport yfinance as yfimport riskfolio as rpimport quantstats as qs# 设置日期范围start = '2022-01-01'end = '2025-09-19'# 定义股票列表:十大科技巨头assets = ['MSFT', 'ORCL', 'IBM', 'PLTR', 'NVDA', 'AAPL', 'META', 'GOOG', 'AMZN', 'NFLX']assets.sort()# 通过 yfinance 下载历史数据data = yf.download(assets, start=start, end=end, auto_adjust=False)data = data.loc[:, ('Close', slice(None))]data.columns = assets# 计算每日收益率Y = data.pct_change().dropna()

第二步:计算各股票的 Ulcer Index

def calculate_ulcer_index(returns):    """    计算溃疡指数(Ulcer Index)    该指标衡量投资的下行风险,数值越大表示回撤越严重    """    returns = returns.dropna()    # 计算财富指数    wealth_index = np.cumprod(1 + returns)    # 计算历史最高点    previous_peaks = np.maximum.accumulate(wealth_index)    # 计算回撤幅度    drawdowns = (wealth_index - previous_peaks) / previous_peaks    # 计算回撤的平方    squared_drawdowns = np.square(drawdowns)    # 溃疡指数 = 回撤平方均值的平方根    ulcer_index = np.sqrt(np.mean(squared_drawdowns))    return ulcer_index# 计算每只股票的溃疡指数for tkr in assets:    ui = calculate_ulcer_index(Y[tkr])    print(f'{tkr} 的溃疡指数为:{ui:.4f}')

运行结果显示,IBM 的溃疡指数最低(0.086),而 NFLX 最高(0.339),说明 IBM 的下行风险相对较小。

第三步:构建夏普均值 UI 优化组合

# 创建投资组合对象port = rp.Portfolio(returns=Y)# 使用历史数据估计预期收益和协方差矩阵port.assets_stats(method_mu='hist', method_cov='hist')# 优化参数设置model = 'Classic'   # 使用经典模型rm = 'UCI'          # 风险度量:溃疡指数obj = 'Sharpe'      # 目标函数:最大化夏普比率rf = 0.0            # 无风险利率# 执行优化w = port.optimization(model=model, rm=rm, obj=obj, rf=rf, l=0, hist=True)print("优化后的权重分配:")print(w)

优化结果显示,最优组合主要配置在四只股票上:IBM(58.37%)、ORCL(31.50%)、PLTR(7.46%)、NVDA(2.67%)。其他六只股票权重为零。

第四步:构建风险平价 UI 组合

# 风险平价优化:让每只资产对组合风险的贡献相等w_rp = port.rp_optimization(model=model, rm=rm, rf=rf, b=None, hist=True)print("风险平价组合权重:")print(w_rp)

风险平价组合将资金分散到所有十只股票,其中 IBM 权重最高(41.27%),NFLX 最低(3.00%)。

第五步:回测分析

# 下载标普 500 作为基准sp500 = qs.utils.download_returns('^GSPC')sp500 = sp500.loc['2022-01-01':'2025-09-18']# 定义组合一的权重weights = [0.58, 0.03, 0.32, 0.07]  # IBM, NVDA, ORCL, PLTR# 计算组合收益portfolio = (Y['IBM'] * weights[0] +              Y['NVDA'] * weights[1] +              Y['ORCL'] * weights[2] +              Y['PLTR'] * weights[3])# 生成完整回测报告qs.reports.full(portfolio, benchmark=sp500)

回测结果对比

指标
标普 500
夏普均值 UI 组合
累计收益
38.35%
199.6%
年化收益
6.24%
22.69%
夏普比率
0.57
1.35
最大回撤
-24.32%
-22.75%
年化波动率
18.19%
24.29%
Alpha
-
0.23
Beta
-
0.94

夏普均值 UI 组合的表现显著优于标普 500 基准:

  • • 累计收益高出 161 个百分点
  • • 夏普比率提升 137%
  • • 最大回撤反而更小
  • • Alpha 为正,表明组合创造了超额收益

总结

本文介绍了如何使用 Python 构建风险驱动型的投资组合优化框架。核心要点如下:

工具选择方面,Riskfolio-Lib 适合进行投资组合优化计算,QuantStats 则擅长回测分析和绩效评估。两者结合能形成完整的量化投资分析流程。

风险度量方面,相比传统的标准差,Ulcer Index(溃疡指数)更聚焦于下行风险,更符合投资者对"风险"的直观理解。

优化策略方面,夏普均值 UI 策略追求风险调整后收益最大化,倾向于集中持仓;风险平价 UI 策略追求风险贡献均衡,持仓更加分散。

实战表现方面,在本案例中,夏普均值 UI 组合大幅跑赢标普 500 基准,同时最大回撤控制得更好,展现了优秀的风险收益特征。

当然,历史表现不代表未来收益。实际投资中还需考虑交易成本、流动性、再平衡频率等因素。本框架可作为量化投资研究的起点,帮助投资者建立系统化的分析思路。

参考文章

加入专注于财经数据与量化投研的知识星球【数据科学实战】,获取本文完整研究解析、代码实现细节。

财经数据与量化投研知识社区

2026年全面升级已落地!【数据科学实战】知识星球核心权益如下:

  1. 1. 双典系统赋能:获赠《财经数据宝典》与《量化投研宝典》完整文档,凝练多年实战经验,构建系统化知识框架;
  2. 2. 量化因子日更教程(2026重磅新增):每日更新「量化因子专题教程」,配套完整可运行代码与实战案例,深度拆解因子构建、回测与优化全流程;
  3. 3. 量化文章专题教程库:300+篇星球独有高质量教程式文章,系统覆盖策略开发、因子研究、风险管理等核心领域,内容基本每日更新,并配套精选学习资料与实战参考;
  4. 4. PyBroker实战课程:赠送《PyBroker-入门及实战》视频课程,手把手教学,快速掌握量化策略开发技能;
  5. 5. 财经数据支持:定期更新国内外财经数据,为策略研发提供精准、可靠的数据基础;
  6. 6. 顶尖学者与行业专家分享:年度邀请学术界博士与业界资深专家开展前沿论文精讲与实战案例分享,不少于4场,直击研究前沿与产业实践;专家直连答疑:与核心开发者及领域专家实时互动,高效解决投研实战难题;
  7. 7. 专业社群与专属福利:加入高质量交流社群,获取课程折扣及更多独家资源。

星球已沉淀丰富内容生态——涵盖量化文章专题教程库、因子日更系列、高频数据集、PyBroker实战课程、专家深度分享与实时答疑服务。无论您是初探量化的学习者,还是深耕领域的从业者,这里都是助您少走弯路、高效成长的理想平台。诚邀加入,共探数据驱动的投资未来!

好文推荐

1. 用 Python 打造股票预测系统:Transformer 模型教程(一)

2. 用 Python 打造股票预测系统:Transformer 模型教程(二)

3. 用 Python 打造股票预测系统:Transformer 模型教程(三)

4. 用 Python 打造股票预测系统:Transformer 模型教程(完结)

5. 揭秘隐马尔可夫模型:因子投资的制胜武器

6. YOLO 也能预测股市涨跌?计算机视觉在股票市场预测中的应用

7. 金融 AI 助手:FinGPT 让你轻松掌握市场分析

8. 量化交易秘籍:为什么专业交易员都在用对数收益率?

9. Python 量化投资利器:Ridge、Lasso 和 Elastic Net 回归详解

10. 掌握金融波动率模型:完整 Python 实现指南

好书推荐

最新文章

随机文章