
2026年重磅升级已全面落地!欢迎加入专注财经数据与量化投研的【数据科学实战】知识星球!您将获取持续更新的《财经数据宝典》与《量化投研宝典》,双典协同提供系统化指引;星球内含300篇以上独有高质量文章,深度覆盖策略开发、因子分析、风险管理等核心领域,内容基本每日更新;同步推出的「量化因子专题教程」系列(含完整可运行代码与实战案例),系统详解因子构建、回测与优化全流程,并实现日更迭代。我们持续扩充独家内容资源,全方位赋能您的投研效率与专业成长。无论您是量化新手还是资深研究者,这里都是助您少走弯路、事半功倍的理想伙伴,携手共探数据驱动的投资未来!
从云计算到 AI 浪潮,科技股一直是美股增长的强劲引擎。然而,高收益往往伴随着高波动——投资者在享受丰厚回报的同时,也不得不面对市场剧烈震荡带来的"胃痛"时刻。
那么问题来了:如何在追求高收益的同时,把风险控制在可接受范围内?
本文将带你了解一个基于 Python 的投资组合优化框架,通过 Riskfolio-Lib 和 QuantStats 两大利器,实现对美股科技股的风险驱动型投资组合构建与回测分析。
Riskfolio-Lib 是一个开源的 Python 投资组合优化库,主要特点包括:
QuantStats 提供了全面的投资组合分析能力,包括绩效指标、风险评估、回撤分析和综合报告生成。
传统风险指标如标准差会同时考虑上涨和下跌的波动,但对投资者来说,真正让人"胃痛"的只有下跌。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()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 的下行风险相对较小。
# 创建投资组合对象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%)。其他六只股票权重为零。
# 风险平价优化:让每只资产对组合风险的贡献相等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)夏普均值 UI 组合的表现显著优于标普 500 基准:
本文介绍了如何使用 Python 构建风险驱动型的投资组合优化框架。核心要点如下:
工具选择方面,Riskfolio-Lib 适合进行投资组合优化计算,QuantStats 则擅长回测分析和绩效评估。两者结合能形成完整的量化投资分析流程。
风险度量方面,相比传统的标准差,Ulcer Index(溃疡指数)更聚焦于下行风险,更符合投资者对"风险"的直观理解。
优化策略方面,夏普均值 UI 策略追求风险调整后收益最大化,倾向于集中持仓;风险平价 UI 策略追求风险贡献均衡,持仓更加分散。
实战表现方面,在本案例中,夏普均值 UI 组合大幅跑赢标普 500 基准,同时最大回撤控制得更好,展现了优秀的风险收益特征。
当然,历史表现不代表未来收益。实际投资中还需考虑交易成本、流动性、再平衡频率等因素。本框架可作为量化投资研究的起点,帮助投资者建立系统化的分析思路。
2026年全面升级已落地!【数据科学实战】知识星球核心权益如下:
星球已沉淀丰富内容生态——涵盖量化文章专题教程库、因子日更系列、高频数据集、PyBroker实战课程、专家深度分享与实时答疑服务。无论您是初探量化的学习者,还是深耕领域的从业者,这里都是助您少走弯路、高效成长的理想平台。诚邀加入,共探数据驱动的投资未来!
好文推荐
1. 用 Python 打造股票预测系统:Transformer 模型教程(一)
2. 用 Python 打造股票预测系统:Transformer 模型教程(二)
3. 用 Python 打造股票预测系统:Transformer 模型教程(三)
4. 用 Python 打造股票预测系统:Transformer 模型教程(完结)
6. YOLO 也能预测股市涨跌?计算机视觉在股票市场预测中的应用
9. Python 量化投资利器:Ridge、Lasso 和 Elastic Net 回归详解
好书推荐