计算股票收益率与波动率
问题引入:为什么收益率和波动率是投资决策的「指南针」与「安全气囊」?
假设你已经掌握了数据获取、清洗和时间序列操作技能,面对处理完善的A股历史行情数据,准备开始核心的量化分析。这时,你需要回答几个关键问题:
- 收益评估:一只股票在过去一年中的整体表现如何?是简单收益率更能反映实际回报,还是对数收益率更适合长期分析?
- 风险度量:股票价格的波动有多大?日波动率和年化波动率有何区别?如何通过滚动波动率观察风险的变化趋势?
- 组合构建:多只股票之间的收益率相关性如何?哪些股票可以分散风险,哪些会放大波动?
- 策略基础:收益率和波动率数据如何为后续的因子计算、策略回测奠定基础?
根据《量化投资:以Python为工具》统计,超过80%的量化策略直接或间接依赖于收益率和波动率指标。但实际应用中常见两大误区:
核心问题:如何通过Python准确计算股票的各类收益率和波动率指标,并将这些基础指标转化为有实际投资指导意义的分析工具?
知识铺垫:收益率与波动率的四大核心体系
2.1 简单收益率 vs 对数收益率:应用场景的本质区别
| 简单收益率 |
R t = P t − P t − 1 P t − 1 R_t = \\frac{P_t – P_{t-1}}{P_{t-1}} Rt=Pt−1Pt−Pt−1 |
相邻价格的变化率,反映单期实际盈亏 | 短期分析、每日盈亏计算、投资者直观理解 | df['close'].pct_change() |
| 对数收益率 |
r t = ln ( P t P t − 1 ) r_t = \\ln\\left(\\frac{P_t}{P_{t-1}}\\right) rt=ln(Pt−1Pt) |
连续复利收益率,具有时间可加性和近似正态分布特性 | 长时间序列分析、投资组合理论、风险模型、衍生品定价 | np.log(df['close'] / df['close'].shift(1)) |
关键原则:
- 短期投资(<1个月):简单收益率更直观,直接反映盈亏百分比
- 长期分析(>1个月):对数收益率更科学,多期总收益等于各期对数收益率之和
- 统计建模:对数收益率更接近正态分布,便于假设检验和模型构建
2.2 累计收益率:复利奇迹的数学表达
累计收益率衡量从投资起始点到当前时点的总回报,有两种等效计算方法:
| 累计简单收益率 |
C t = ∏ i = 1 t ( 1 + R i ) − 1 C_t = \\prod_{i=1}^t (1 + R_i) – 1 Ct=∏i=1t(1+Ri)−1 |
直观反映实际复利过程,但计算稍复杂 |
| 累计对数收益率 |
c t = ∑ i = 1 t r i c_t = \\sum_{i=1}^t r_i ct=∑i=1tri |
对数收益率之和,数学性质优良,转换后与简单收益率等价 |
实践建议:优先使用(1 + 简单收益率).cumprod() – 1计算累计收益率,因其更贴近投资者的实际感受。
2.3 波动率体系:从日频波动到年化风险
波动率是收益率标准差的统计度量,金融实践中需根据分析目的选择合适口径:
| 日波动率 |
σ d a i l y = std ( r t ) \\sigma_{daily} = \\text{std}(r_t) σdaily=std(rt) |
日收益率的波动程度 | 日内交易风险监控 |
| 年化波动率 |
σ a n n u a l = σ d a i l y × 252 \\sigma_{annual} = \\sigma_{daily} \\times \\sqrt{252} σannual=σdaily×252 |
标准化为年度的风险水平,便于跨资产比较 | 组合风险管理、绩效评估 |
| 滚动波动率 |
σ r o l l i n g ( t ) = std ( r t − w + 1 : t ) × 252 \\sigma_{rolling}(t) = \\text{std}(r_{t-w+1 : t}) \\times \\sqrt{252} σrolling(t)=std(rt−w+1:t)×252 |
动态风险监控,捕捉市场波动率变化 | 趋势策略、止损设置、风险预警 |
关键假设:金融市场一年约有252个交易日(扣除周末和节假日),这是年化计算的基础。
2.4 收益率相关性:投资组合的「化学键」
相关系数矩阵是多资产分析的核心工具,其金融意义如下:
| +0.8 ~ +1.0 | 强正相关 | 风险高度集中,分散效果差 |
| +0.3 ~ +0.7 | 中等正相关 | 适度分散,但仍受市场共同因素影响 |
| -0.3 ~ +0.3 | 弱相关 | 理想分散标的,能有效降低组合波动 |
| -0.7 ~ -0.3 | 中等负相关 | 对冲潜力,但需注意风险收益平衡 |
实践建议:构建投资组合时,优先选择相关系数在0.3以下的股票组合,以实现风险分散最大化。
数据准备:三只代表性A股的1年历史行情数据
3.1 股票选择逻辑
为保证分析的代表性和对比性,选择三只来自不同行业、市值规模的A股:
| 600519.SH | 贵州茅台 | 食品饮料 | 超大盘 | 消费龙头,波动相对稳定 |
| 000001.SZ | 平安银行 | 银行 | 大盘 | 金融板块代表,低波动特征 |
| 300750.SZ | 宁德时代 | 电力设备 | 大盘 | 新能源龙头,高成长高波动 |
3.2 数据获取与预处理
基于Tushare实战技能,获取2025年1月1日至2025年12月31日的日线行情数据,并进行数据清洗:
3.3 基础数据概览
通过Python代码输出三只股票的基本统计特征,为后续分析奠定数据基础。
收益率与波动率实战:四大核心计算与可视化
4.1 简单收益率与对数收益率对比分析
计算三只股票的日简单收益率和对数收益率,并通过统计描述和分布图对比差异:
- 统计对比:均值、标准差、偏度、峰度
- 数值关系:验证当收益率较小时,简单收益率 ≈ 对数收益率
- 极端值影响:分析大涨大跌时两种计算方法的差异
4.2 累计收益率计算与可视化
分别计算三只股票的累计收益率,并通过图表展示:
- 累计收益率曲线:直观展示投资回报随时间增长
- 对比分析:观察不同股票累计收益率的差异和变化趋势
- 关键时点标记:标注收益率大幅波动的时期
4.3 波动率计算体系实现
系统实现三大波动率指标的计算:
- 日波动率:计算每日收益率的标准差
- 年化波动率:基于252个交易日的年化处理
- 滚动波动率:计算20日滚动窗口的年化波动率,观察动态风险变化
4.4 多股票收益率相关性分析
构建三只股票收益率的相关系数矩阵,并通过热力图直观展示:
- 相关性矩阵:计算皮尔逊相关系数
- 热力图可视化:使用seaborn生成专业热力图
- 解读分析:识别强相关和弱相关股票对
结果解读:数据背后的投资逻辑
5.1 收益率分析:谁是真正的「收益王者」?
基于计算结果,回答以下问题:
5.2 波动率分析:风险与收益的平衡艺术
解读波动率数据的投资意义:
5.3 相关性分析:构建分散化组合的线索
基于相关系数矩阵,提出投资组合建议:
5.4 方法论验证:理论与实践的一致性
验证本文学到的理论知识在实际数据中的表现:
拓展思考:从基础指标到量化策略的进阶路径
6.1 进阶指标:夏普比率、信息比率与最大回撤
在掌握收益率和波动率基础上,可进一步学习:
- 夏普比率:超额收益与总风险的比率,衡量风险调整后收益
- 信息比率:主动收益与跟踪误差的比率,评估主动管理能力
- 最大回撤:投资期间最大可能的亏损幅度,极端风险度量
6.2 投资组合优化:马科维茨均值-方差模型
利用收益率、波动率和相关性数据,可进行:
6.3 波动率建模:从历史波动率到预测波动率
波动率分析可进一步深入:
- GARCH模型:捕捉波动率聚集性和均值回归特性
- 已实现波动率:基于高频数据的波动率估计方法
- 波动率曲面:期权市场隐含的未来波动率预期
6.4 实战应用:从数据分析到策略构建
将本文学到的技能应用于实际投资场景:
6.5 后续学习路径建议
完成收益率和波动率基础学习后,推荐以下学习顺序:
核心提醒:收益率和波动率是量化分析的基石,后续所有高级策略都建立在这些基础指标之上。确保完全掌握本内容后,再进入更复杂的因子和策略学习。
文中源码均可在公众号《量化双码研习社》免费获取~这里专注Python + 量化双码实操,持续更新 A 股数据清洗、策略回测、Tushare 取数、券商量化面试等硬核干货,和千名量化爱好者一起深耕实战、少走弯路! 关注不迷路,后续干货第一时间推送给你 ✨
