4. 单资产收益率与风险度量

好,咱们进入第四讲。这一讲的核心,说白了就是回答一个问题:你手里这只股票(或者比特币、黄金),到底靠不靠谱?

我刚开始做量化的时候,总觉得看K线图就够了。后来发现,光看图不行。你得用数字说话。期望收益率、方差、标准差、最大回撤——这些就是给资产做“体检”的指标。

嗯,咱们一个一个来拆解。

4.1 期望收益率:你大概能赚多少?

期望收益率,就是所有可能收益率的加权平均。数学上很简单:

E(R) = Σ (pᵢ × rᵢ)

其中 pᵢ 是第 i 种情况发生的概率,rᵢ 是对应的收益率。

但在实际项目中,我们通常用历史数据的算术平均来近似。比如你拿了某只股票过去252个交易日(约一年)的日收益率,直接求平均:

import numpy as np

# 假设 returns 是日收益率数组
expected_return = np.mean(returns)
print(f"期望日收益率: {expected_return:.6f}")
我的经验: 期望收益率对极端值非常敏感。有一次我处理一只妖股的数据,某天涨了40%,直接把年化期望拉高到不切实际的水平。后来我学会了用中位数或者截尾均值做辅助判断。

4.2 方差与标准差:波动有多大?

期望收益率告诉你“平均能赚多少”,但没告诉你“波动有多大”。这时候方差就派上用场了。

方差衡量的是收益率偏离期望的程度:

Var(R) = E[(R - E(R))²]

标准差就是方差的平方根。为什么用标准差?因为它的单位和收益率一样,更直观。

variance = np.var(returns, ddof=1)  # 样本方差,ddof=1
std_dev = np.std(returns, ddof=1)
print(f"日收益率方差: {variance:.8f}")
print(f"日收益率标准差: {std_dev:.4f}")
注意: 这里 ddof=1 表示用样本方差(除以 n-1)。如果你用总体方差(除以 n),在样本量较小时会低估真实波动。我曾经因为这个细节,在回测报告里被老板当众质疑……嗯,从那以后我再也没搞错过。

年化标准差怎么算?很简单:

annual_std = std_dev * np.sqrt(252)  # 假设252个交易日
print(f"年化标准差: {annual_std:.4f}")

4.3 最大回撤:最惨的时候亏多少?

这个指标我特别喜欢。因为它很“诚实”。

最大回撤,就是从历史最高点跌到最低点的最大幅度。它告诉你:如果你在最倒霉的时候入场,最多会亏多少钱。

计算逻辑:

  1. 计算累计净值曲线(假设初始为1)
  2. 找到每个时间点的历史最高净值
  3. 计算当前净值相对于历史最高点的回撤
  4. 取所有回撤中的最大值
def max_drawdown(prices):
    # prices: 价格序列
    peak = np.maximum.accumulate(prices)
    drawdown = (prices - peak) / peak
    return np.min(drawdown)

# 假设 close_prices 是收盘价数组
md = max_drawdown(close_prices)
print(f"最大回撤: {md:.2%}")
避坑指南: 我曾经用日数据算最大回撤,结果发现某只股票日内曾经跌过30%,但收盘只跌了5%。日线数据完全没捕捉到这个风险。所以,如果你做高频或日内策略,最好用分钟级数据算回撤。

4.4 可视化:一图胜千言

光有数字不够。咱们得画图。

两张图:

  • 价格走势图:看趋势、看波动、看回撤区间
  • 收益率分布直方图:看分布形态、看肥尾、看偏度
import matplotlib.pyplot as plt

fig, axes = plt.subplots(1, 2, figsize=(14, 5))

# 左图:价格走势
axes[0].plot(close_prices, color='#2E86AB', linewidth=1.5)
axes[0].set_title('价格走势', fontsize=14)
axes[0].set_xlabel('交易日')
axes[0].set_ylabel('价格')

# 右图:收益率分布直方图
axes[1].hist(returns, bins=50, color='#A23B72', alpha=0.7, edgecolor='white')
axes[1].axvline(expected_return, color='red', linestyle='--', linewidth=2, label='期望收益率')
axes[1].set_title('收益率分布直方图', fontsize=14)
axes[1].set_xlabel('日收益率')
axes[1].set_ylabel('频次')
axes[1].legend()

plt.tight_layout()
plt.show()

你想想看,如果直方图显示收益率分布是“左偏”的(左边尾巴长),说明这只股票容易出大跌。这就是风险信号。

4.5 知识体系总览

下面这张图,把咱们这一章的核心逻辑串起来了:

单资产收益率与风险度量 · 知识体系 单资产分析 期望收益率 E(R) = Σ(pᵢ × rᵢ) 方差 & 标准差 波动率度量 最大回撤 最坏情景损失 可视化 价格走势 + 分布直方图 核心目标:量化收益与风险,辅助投资决策 指标不是孤立的,要综合看

4.6 综合示例:把指标串起来

咱们用真实数据跑一遍。假设你拿到了某只股票过去一年的日收盘价:

import pandas as pd
import numpy as np

# 模拟数据(实际项目中从数据库或API获取)
np.random.seed(42)
days = 252
prices = 100 * np.exp(np.cumsum(np.random.normal(0.0005, 0.02, days)))
returns = np.diff(prices) / prices[:-1]

# 计算指标
exp_ret = np.mean(returns)
vol = np.std(returns, ddof=1)
md = max_drawdown(prices)

# 年化
annual_ret = exp_ret * 252
annual_vol = vol * np.sqrt(252)

print("===== 单资产分析报告 =====")
print(f"期望日收益率: {exp_ret:.4%}")
print(f"年化期望收益率: {annual_ret:.2%}")
print(f"日波动率: {vol:.4%}")
print(f"年化波动率: {annual_vol:.2%}")
print(f"最大回撤: {md:.2%}")
print("==========================")

输出结果:

===== 单资产分析报告 =====
期望日收益率: 0.0523%
年化期望收益率: 13.18%
日波动率: 2.01%
年化波动率: 31.92%
最大回撤: -18.45%
==========================

解读:

  • 年化13%的期望收益,看着不错
  • 但年化32%的波动率,说明上蹿下跳很厉害
  • 最大回撤-18.45%,意味着你最多亏过将近两成

这三个数字放一起,你就能判断:这只股票属于高收益高风险类型。能不能拿得住,看你的风险承受能力。

4.7 几个容易踩的坑

  • 用算术平均还是几何平均? 短期用算术平均没问题。长期(比如5年以上),我建议用几何平均,更符合复利逻辑。
  • 样本量不够怎么办? 少于30个数据点算出来的方差基本没意义。我一般要求至少252个交易日(一年)。
  • 最大回撤只看数值? 别。还要看回撤持续了多久。有些资产回撤20%但一个月就回来了,有些回撤15%却趴了两年。后者更可怕。
我的习惯: 每次做完分析,我都会把期望收益率、波动率、最大回撤这三个数字写在便签纸上,贴在显示器旁边。看久了,你对数字的敏感度自然就上来了。

好,这一讲就到这里。记住:数字是死的,但解读是活的。 别光算指标,要理解指标背后的含义。


公众号:蓝海资料掘金营,微信deep3321