
2026年重磅升级已全面落地!欢迎加入专注财经数据与量化投研的【数据科学实战】知识星球!您将获取持续更新的《财经数据宝典》与《量化投研宝典》,双典协同提供系统化指引;星球内含300篇以上独有高质量文章,深度覆盖策略开发、因子分析、风险管理等核心领域,内容基本每日更新;同步推出的「量化因子专题教程」系列(含完整可运行代码与实战案例),系统详解因子构建、回测与优化全流程,并实现日更迭代。我们持续扩充独家内容资源,全方位赋能您的投研效率与专业成长。无论您是量化新手还是资深研究者,这里都是助您少走弯路、事半功倍的理想伙伴,携手共探数据驱动的投资未来!
在量化投资领域,如何科学地分配资产权重、控制下行风险,是每个 Python 量化爱好者绑不开的课题。市面上虽然有不少组合优化工具,但大多只聚焦于经典的均值-方差模型,对尾部风险、多目标优化的支持十分有限。
今天要介绍的 azapy,是一个开源的 Python 风险导向型投资组合优化库。它内置了 10 种风险度量 × 6 种优化策略 = 60 种组合方式,从数据获取、资产筛选、风险建模到回测输出,提供了完整的端到端工作流。无论你是刚接触量化的 Python 学习者,还是想深入研究尾部风险的进阶用户,azapy 都值得一试。
azapy 是一个专注于 风险导向型投资组合优化(Risk-based Portfolio Optimization) 的 Python 库。其核心思想很简单:投资不仅要关注预期收益,更要量化和管控"事情变糟时会亏多少"。
安装非常简单,一行命令即可:
# 在 Notebook 或终端中安装 azapy
!pip install azapyazapy 的工作流程可以概括为 7 个步骤:
azapy 支持以下 10 种分散度度量,覆盖了从经典到前沿的风险建模需求:
每种风险度量都可以搭配以下 6 种策略使用:
rtype='Risk' | |
rtype='MinRisk' | |
rtype='InvNrisk' | |
rtype='RiskAverse' | |
rtype='Sharpe' | |
rtype='Sharpe2' |
import numpy as np
import pandas as pd
import azapy as az
# 打印 azapy 版本
print(f"azapy version {az.version()}", flush=True)
# 设置参数
mktdir = 'MkTdata' # 数据存储目录
sdate = '2012-01-01' # 起始日期
edate = '2021-07-27' # 结束日期
symb = ['GLD', 'TLT', 'XLV', 'IHI', 'VGT'] # 资产列表
# 获取历史市场数据
mktdata = az.readMkT(symb, sdate=sdate, edate=edate, file_dir=mktdir)运行后,azapy 会自动从 Yahoo Finance 下载数据并保存为 CSV 文件,返回一个包含 open、high、low、close、volume 等字段的 DataFrame,可以直接传给后续的分析器使用。
import numpy as np
import azapy as az
# 定义 mCVaR 的参数
alpha = np.array([0.95, 0.90, 0.85]) # 三个置信水平
coef = np.full(len(alpha), 1/len(alpha)) # 等权混合
# 构建 CVaR 分析器
cr1 = az.CVaRAnalyzer(
alpha, coef, mktdata,
hlength=3.25, # 收益聚合的时间跨度(年)
method='ecos' # 凸优化求解器
)
# 生成一个随机组合权重
ww = np.random.dirichlet([0.5] * len(symb))
# 计算该组合的混合 CVaR 风险
risk = cr1.getRisk(ww)
# 输出结果
print(f"组合权重:{ww.round(4)}")
print(f"预期收益率:{cr1.RR:.4f}")
print(f"混合 CVaR 风险:{risk:.4f}")
print(f"各层级风险分量:{cr1.primary_risk_comp.round(6)}")结果解读:
alpha = 0.95 表示关注最差 5% 的收益;多个 alpha 值意味着同时考虑轻度、中度和重度下行情景。coef 设为等权,表示三个尾部场景同等重要。risk 值是三个 CVaR 分量的加权平均,代表在不同极端情况下的综合预期损失。import azapy as az
# 获取 6 只资产的市场数据
symb = ['GLD', 'TLT', 'XLV', 'IHI', 'VGT', 'OIH']
mktdata = az.readMkT(symb, sdate='2012-01-01', edate='today',
file_dir='../../MkTdata')
# 定义 mEVaR 参数
alpha = [0.75, 0.65] # 两个置信水平
coef = [1.] * len(alpha) # 等权混合
hlength = 1.25 # 历史回望窗口(年)
# 创建 Port_EVaR 组合对象
p4 = az.Port_EVaR(mktdata, pname='mEVaR')
# 以最大化夏普比率为目标构建组合
port4 = p4.set_model(
alpha=alpha,
coef=coef,
rtype='Sharpe', # 最大化广义夏普比率
mu0=0., # 无风险利率设为 0
hlength=hlength
)
# 查看组合表现
_ = p4.port_view(title="mEVaR-Sharpe", ylabel="价格($)")
# 获取绩效指标
performance = p4.port_perf()
print(f"绩效概览:\n{performance.round(4)}")该组合在回测中实现了约 15.8% 的年化收益,RoMaD(收益与最大回撤比)达到 0.65,最大回撤约 24%,远优于 OIH、TLT 等单一资产的表现。
azapy 最强大的功能之一是 ModelPipeline,可以把筛选和优化串联起来:
import numpy as np
import azapy as az
# 40 只 ETF 和大盘股的资产池
symb = ['GLD', 'TLT', 'IHI', 'VGT', 'OIH',
'XAR', 'XBI', 'XHE', 'XHS', 'XLB',
'XLE', 'XLF', 'XLI', 'XLK', 'XLU',
'XLV', 'XLY', 'XRT', 'SPY', 'ONEQ',
'QQQ', 'DIA', 'ILF', 'XSW', 'PGF',
'IDV', 'JNK', 'HYG', 'SDIV', 'VIG',
'SLV', 'AAPL', 'MSFT', 'AMZN', 'GOOG',
'IYT', 'IWM', 'BRK-B', 'ITA', 'VUG']
mktdata = az.readMkT(symb, sdate='2012-01-01', edate='today',
file_dir='../../MkTdata', verbose=False)
# 第 1 步:相关性聚类——去除高度相关的冗余资产
ccs = az.CorrClusterSelector(corr_threshold=0.98, freq='Q')
# 第 2 步:双动量筛选——只保留动量最强的 5 只
nw = 5
ths = np.floor(len(symb) * 0.7) # 70% 资产有正动量才满仓
dms = az.DualMomentumSelector(nw=nw, threshold=ths)
# 第 3 步:CVaR 优化器——最大化 CVaR 夏普比率
cvar = az.CVaRAnalyzer(
alpha=[0.95, 0.9],
freq='Q', # 季度频率
hlength=1., # 1 年回望
rtype='Sharpe',
mu0=0.01
)
# 串联为流水线
model = az.ModelPipeline([ccs, dms, cvar])
# 创建回测引擎并运行
pp = az.Port_Generator(mktdata, freq='Q', fixoffset=-1, histoffset=1.)
port = pp.set_model(model)
# 查看绩效
print(f"年化收益率:{pp.port_perf(fancy=True).iloc[0]['RR']}")
print(f"最大回撤:{pp.port_perf(fancy=True).iloc[0]['DD']}")该策略在 2013–2026 年的回测中实现了约 10.85% 的年化收益,最大回撤为 -24.39%,RoMaD 达到 0.4446。策略会根据市场状态动态调整持仓,在动量不足时自动降低仓位转入现金。
原文作者对 5 个主流 Python 组合优化库进行了多维度对比(1–5 分制):
简单总结:
azapy 目前尚不支持:
作者计划在未来版本中逐步加入这些能力。
azapy 是一个为 风险管控 而生的 Python 投资组合优化库。对于 Python 学习者而言,它的价值在于:
如果你已经掌握了基础的均值-方差优化,想进一步探索尾部风险和下行保护策略,azapy 是一个值得深入研究的工具。
2026年全面升级已落地!【数据科学实战】知识星球核心权益如下:
星球已沉淀丰富内容生态——涵盖量化文章专题教程库、因子日更系列、高频数据集、PyBroker实战课程、专家深度分享与实时答疑服务。无论您是初探量化的学习者,还是深耕领域的从业者,这里都是助您少走弯路、高效成长的理想平台。诚邀加入,共探数据驱动的投资未来!
好文推荐
1. 用 Python 打造股票预测系统:Transformer 模型教程(一)
2. 用 Python 打造股票预测系统:Transformer 模型教程(二)
3. 用 Python 打造股票预测系统:Transformer 模型教程(三)
4. 用 Python 打造股票预测系统:Transformer 模型教程(完结)
6. YOLO 也能预测股市涨跌?计算机视觉在股票市场预测中的应用
9. Python 量化投资利器:Ridge、Lasso 和 Elastic Net 回归详解
好书推荐