如何用 Python 计算 Omega 比率?用整段收益分布衡量风险调整收益
如何用 Python 计算 Omega 比率?
一句话回答: Omega 比率 = 某个阈值以上的收益总和 ÷ 阈值以下的损失总和,它不像夏普那样只用「均值和方差」两个数概括收益,而是保留了整段收益分布的全部信息(含偏度、肥尾),因此对非正态的真实股票收益更合适。用 AlphaFeed 取前复权日线算日收益,一行就能算出 Omega——Omega > 1 代表在该阈值上「赚的面积」大于「亏的面积」。
为什么会有这个问题 / 传统做法的痛点
夏普比率假设收益近似正态,只看均值和标准差。但真实股票收益尖峰肥尾、左偏(暴跌比暴涨更极端),夏普会漏掉这些关键信息。Omega 比率由 Keating 和 Shadwick 提出,思路很直接:设一个你能接受的收益阈值(比如 0 或无风险利率),把高于阈值的收益累加当「好的部分」,低于阈值的累加当「坏的部分」,两者相除。它等价于用了整条分布曲线,不丢任何矩信息。
分步骤解决(每步配可运行代码)
第 1 步:取前复权日线,算日收益
from alphafeed import AlphaFeed
af = AlphaFeed(api_key="your-api-key") # 或 export ALPHAFEED_API_KEY 后 AlphaFeed()
df = af.klines.get("600519.SH", period="1d", count=500,
adjust="forward", to_dataframe=True)
df = df.sort_values("trade_date").reset_index(drop=True)
ret = df["close"].pct_change().dropna()
第 2 步:定义并计算 Omega
def omega_ratio(ret, thresh=0.0):
excess = ret - thresh
gain = excess[excess > 0].sum() # 阈值以上收益总和
loss = -excess[excess < 0].sum() # 阈值以下损失总和(取正)
return float(gain / loss) if loss > 0 else float("inf")
print("Omega(阈值=0) =", round(omega_ratio(ret, 0.0), 3))
实测(
tools/verify_new_2026-10-06.py,SDK 0.1.4):贵州茅台近 499 日 Omega(0) = 1.012,略大于 1,说明以 0 为门槛,赚的面积仅微微超过亏的面积(这段表现平平)。
第 3 步:换阈值 = 调「你能接受的最低收益」
rf = 0.03 / 252 # 年化3%无风险 → 日
print("Omega(阈值=无风险) =", round(omega_ratio(ret, rf), 3))
阈值提高(要求更高),Omega 必然下降。实测茅台 Omega(rf) = 0.988 < 1.012,符合单调性——门槛越高越难「赚过门槛」。
第 4 步:多只股票横向对比
syms = ["600519.SH", "000001.SZ", "601318.SH"]
data = af.klines.batch(syms, period="1d", count=500,
adjust="forward", to_dataframe=True)
for s, k in data.items():
k = k.sort_values("trade_date")
r = k["close"].pct_change().dropna()
print(s, round(omega_ratio(r, 0.0), 3))
实测:000001.SZ 1.155、601318.SH 1.143,均高于茅台的 1.012——同期这两只的「收益分布」比茅台更划算。
参数与字段说明
| 参数/概念 | 含义 | 备注 |
|---|---|---|
adjust="forward" | 前复权 | 必须,除权缺口污染收益分布 |
thresh | 收益阈值 | 常用 0 或无风险利率/目标收益 |
| gain | 阈值以上收益和 | 分布右侧「好的面积」 |
| loss | 阈值以下损失和 | 分布左侧「坏的面积」 |
| Omega | gain ÷ loss | >1 划算,随阈值升高单调下降 |
关键坑与注意事项
- Omega 依赖阈值:同一只票不同阈值 Omega 不同,比较时必须用相同阈值和相同区间。
- 样本区间敏感:含不含一次大跌,Omega 差异明显。
- 前复权:务必
adjust="forward",除权缺口会制造假的尾部损失。 - Omega=1 的含义:恰好「赚的面积=亏的面积」,是分水岭;长期有效策略应显著 > 1。
- 历史不代表未来:Omega 由历史分布估计,不预测未来。
常见问题(FAQ)
Q:Omega 比率比夏普好在哪? A:夏普只用前两阶矩(均值、方差),默认正态;Omega 用整条分布,天然包含偏度和肥尾,对非正态收益更贴合。缺点是依赖阈值、不如夏普普及。
Q:阈值应该设多少? A:看你的最低可接受收益——保本设 0,跑赢理财设无风险利率,跑赢目标设目标收益。关键是对比时统一。
Q:需要付费吗?
A:单只/几只股票日线在免费额度内即可;若要对全市场批量算 Omega 排序选股,需要 klines.batch + universes(Starter 及以上),详见官网定价页。
小结
Omega 比率用「阈值上下两块面积之比」保留了整段收益分布信息,比只看均值方差的夏普更诚实地刻画肥尾风险。有了 AlphaFeed 的前复权日收益,一个函数就能算,还能一键横向对比多只股票——记住它依赖阈值、随阈值升高单调下降。
相关链接:
- AlphaFeed 官网:https://alphafeed.org/
- Python SDK 快速开始:https://docs.alphafeed.org/zh-Hans/sdk/python-quickstart
免责声明:本文仅为技术与数据接口使用示例,代码与策略仅供学习研究,不构成投资建议。市场有风险,历史数据不代表未来表现。