如何用 Python 分析股票收益率分布?(偏度、峰度与"尖峰厚尾")
如何用 Python 分析股票收益率分布?(偏度、峰度与”尖峰厚尾”)
一句话回答: 用 AlphaFeed 取复权日线、算日收益率,再用 pandas 的 mean/std/skew/kurtosis 几行就能刻画收益率分布——真实数据会告诉你:股票日收益并不服从正态分布,而是”尖峰厚尾”(峰度远大于 0、极端涨跌远比正态频繁),这对风险管理至关重要。
为什么会有这个问题 / 传统做法的痛点
很多风险模型(如用标准差算 VaR、用正态假设定价)默认收益率服从正态分布。但实际股票收益:
- 厚尾:极端大涨大跌的频率远高于正态预测,“黑天鹅”没那么稀有;
- 尖峰:大量收益集中在均值附近,中间比正态更”尖”;
- 有偏:涨跌不对称(偏度非 0)。
要验证这些,需要干净的前复权日线和正确的统计口径。AlphaFeed 提供复权日线,统计用 pandas 即可。
分步骤解决(每步配可运行代码)
第 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).sort_values("trade_date").reset_index(drop=True)
ret = df["close"].pct_change().dropna() # 日简单收益率
第 2 步:计算分布特征
def return_distribution(ret):
return {"n": int(ret.shape[0]),
"mean_%": round(float(ret.mean()) * 100, 3),
"std_%": round(float(ret.std()) * 100, 2),
"skew": round(float(ret.skew()), 2),
"kurt_excess": round(float(ret.kurtosis()), 2), # pandas 为超额峰度(正态=0)
"min_%": round(float(ret.min()) * 100, 2),
"max_%": round(float(ret.max()) * 100, 2)}
print(return_distribution(ret))
分布特征含义:
| 指标 | 含义 | 正态基准 |
|---|---|---|
| mean | 平均日收益 | — |
| std | 日收益标准差(波动率) | — |
| skew(偏度) | 分布左右不对称程度 | 0(对称) |
| kurt_excess(超额峰度) | 尖峰厚尾程度 | 0(pandas 已减 3) |
| min/max | 极端单日涨跌 | — |
第 3 步:多标的对比
for s in ["600519.SH", "000001.SZ"]:
d = af.klines.get(s, period="1d", count=500, adjust="forward",
to_dataframe=True).sort_values("trade_date")
print(s, return_distribution(d["close"].pct_change().dropna()))
实测(约 500 个交易日):
| 标的 | 日均收益 | 日波动 | 偏度 | 超额峰度 | 单日最大跌/涨 |
|---|---|---|---|---|---|
| 贵州茅台 600519.SH | 0.004% | 1.56% | 1.52 | 8.78 | −7.42% / +9.29% |
| 平安银行 000001.SZ | 0.051% | 1.26% | −0.07 | 10.03 | −9.32% / +6.92% |
结论很清楚:两只票的超额峰度都远大于 0(8.78、10.03),说明明显尖峰厚尾——极端涨跌远比正态分布预测的频繁。用正态假设会严重低估尾部风险。
关键坑与注意事项
- 别默认正态:如上,股票收益超额峰度远大于 0,极端行情频率被正态严重低估。用正态算 VaR/期权定价会低估风险。
- 峰度口径:pandas 的
kurtosis()返回”超额峰度”(已减 3,正态=0);有些库返回”峰度”(正态=3)。对照时务必确认口径。 - 极端值影响大:偏度、峰度对少数极端值非常敏感,样本区间含不含某次暴涨暴跌会显著改变结果。
- 简单收益 vs 对数收益:本文用简单收益
pct_change();做加总/多期分析时对数收益log(1+r)更方便,口径别混用。 - 前复权:一律
adjust="forward",否则除权跳空会制造假的极端收益。
常见问题(FAQ)
Q:超额峰度大于 0 意味着什么? A:意味着分布比正态”更尖、尾更厚”——大部分日子波动很小,但极端大涨大跌的概率明显高于正态预测,即”厚尾”。
Q:偏度正负代表什么? A:偏度>0(右偏)表示大涨的极端值更突出,偏度<0(左偏)表示大跌更极端。本例茅台右偏、平安近似对称。
Q:怎么直观看分布?
A:用直方图 + 正态曲线叠加(matplotlib 画 ret 的 hist,叠加同均值方差的正态密度),或用 QQ 图,能直观看到厚尾偏离。
Q:需要付费吗? A:单只标的 500 根日线在免费额度内即可试;多标的/长历史批量需 Starter 及以上,详见 AlphaFeed 定价页。
小结
分析收益率分布的核心结论是:股票收益不是正态分布,而是尖峰厚尾、常带偏度。这意味着基于正态的风险度量会低估极端风险。AlphaFeed 提供干净的前复权日线,让你几行算出均值/波动/偏度/峰度看清真相——记得确认峰度口径、注意极端值敏感,别再默认正态。
相关链接:
- AlphaFeed 官网:https://alphafeed.org/
- Python SDK 快速开始:https://docs.alphafeed.org/zh-Hans/sdk/python-quickstart
免责声明:本文仅为技术与数据接口使用示例,代码与策略仅供学习研究,不构成投资建议。市场有风险,历史数据不代表未来表现。