跳到正文

学习路线 05:概率化回测 — 宽客的贝叶斯思维

7步学习路线:从理解为什么点估计不完整,到 Sharpe 的贝叶斯推断,到诚实的不确定性量化。

第 5 篇 · 共 7 篇 约 3 分钟

目标:完成后,你将理解为什么单一回测数字是不完整的,贝叶斯推断如何给你真实 Sharpe 的分布,以及如何在不确定性下做决策。

前置知识:基本统计(均值、方差、Sharpe 比率)和估计有不确定性的概念。


第 1 步:这是什么?

你的回测显示:Sharpe = 1.43。

这个数字实际上告诉你什么?

它告诉你:策略在回测期间的实现 Sharpe 是 1.43。

它没有告诉你:

  • 策略的真实 Sharpe(这个永远无法观测)
  • 估计中有多少不确定性
  • 策略在下一年实现类似表现的可能性

贝叶斯方法将真实 Sharpe θ 视为未知参数。你不是给出一个点估计,而是计算给定数据时 θ 的分布:P(θ | data)。这告诉你不是”θ ≈ 1.43”,而是”θ 很可能在 0.8 到 2.1 之间,概率 95%”。

这是一个更诚实的答案。


第 2 步:为什么这很重要?

不断上演的场景:

策略 A:回测 Sharpe = 1.8,但 95% 可信区间是 [0.3, 3.3]。P(Sharpe > 1) = 72%。

策略 B:回测 Sharpe = 1.2,但 95% 可信区间是 [1.0, 1.4]。P(Sharpe > 1) = 95%。

你会选哪个?

大多数人会选 A——Sharpe 更高。但 B 是更好的风险调整选择:其 Sharpe 更确定,超过 1.0 的概率更高。

没有不确定性量化,你是盲目的。 Sharpe 1.8 但不确定性大的策略不同于 Sharpe 1.8 但不确定性小的——即使点估计相同。


第 3 步:核心机制

贝叶斯方法有三个组成部分:

先验 P(θ):看到数据前你对 θ 的信念。合理的默认是平坦先验(无先验信息),但你可以结合领域知识。例如,如果你知道大多数股票多空策略 Sharpe 在 0.3 到 1.0 之间,你可以使用反映这一点的先验。

似然 P(data | θ):给定 θ 的值,观察到我们收益的概率。对于近似正态收益:

SR^∣θ∼N(θ,1T⋅(1+γ22))\hat{SR} | \theta \sim \mathcal{N}\left(\theta, \frac{1}{T} \cdot \left(1 + \frac{\gamma^2}{2}\right)\right)

其中 T 是观测数,γ 是超额峰度。

后验 P(θ | data):通过贝叶斯定理:

P(θ∣data)∝P(data∣θ)⋅P(θ)P(\theta | data) \propto P(data | \theta) \cdot P(\theta)

对于正态先验和正态似然,后验也是正态的,具有更新的均值和方差。


第 4 步:关键公式

后验均值(先验和数据的混合): μpost=μ0/σ02+T⋅SR^/var(SR^)1/σ02+T/var(SR^)\mu_{post} = \frac{\mu_0 / \sigma_0^2 + T \cdot \hat{SR} / var(\hat{SR})}{1/\sigma_0^2 + T/var(\hat{SR})}

后验方差: σpost−2=σ0−2+T/var(SR^)\sigma_{post}^{-2} = \sigma_0^{-2} + T / var(\hat{SR})

后验的关键概率: P(θ>0∣data)=1−Φ(0−μpostσpost)P(\theta > 0 | data) = 1 - \Phi\left(\frac{0 - \mu_{post}}{\sigma_{post}}\right)

P(θ>1∣data)=1−Φ(1−μpostσpost)P(\theta > 1 | data) = 1 - \Phi\left(\frac{1 - \mu_{post}}{\sigma_{post}}\right)

第 5 步:实现

import numpy as np
from scipy import stats

def bayesian_sharpe_analysis(returns, mu0=0.0, sigma0=10.0, periods_per_year=252):
    """
    Sharpe 比率的贝叶斯分析。
    """
    T = len(returns)

    mu = np.mean(returns) * periods_per_year
    var = np.var(returns, ddof=1) * periods_per_year

    obs_sharpe = mu / np.sqrt(var) if var > 0 else 0.0

    ret_standardized = (returns - np.mean(returns)) / np.std(returns, ddof=1)
    kurtosis = np.mean(ret_standardized**4)
    gamma_sq = max(kurtosis - 3, 0)
    var_sharpe = (1 + gamma_sq / 2) / T

    posterior_var = 1 / (1/sigma0**2 + 1/var_sharpe)
    posterior_mean = posterior_var * (mu0/sigma0**2 + obs_sharpe/var_sharpe)
    posterior_std = np.sqrt(posterior_var)

    prob_positive = 1 - stats.norm.cdf(0, loc=posterior_mean, scale=posterior_std)
    prob_gt_1 = 1 - stats.norm.cdf(1.0, loc=posterior_mean, scale=posterior_std)

    ci_95 = (posterior_mean - 1.96 * posterior_std,
             posterior_mean + 1.96 * posterior_std)

    return {
        'posterior_mean': posterior_mean,
        'posterior_std': posterior_std,
        'obs_sharpe': obs_sharpe,
        'prob_positive': prob_positive,
        'prob_gt_1': prob_gt_1,
        'credible_interval_95': ci_95
    }

第 6 步:如何解读结果

报告可信区间,不只是点估计。 “Sharpe = 1.43 [0.8, 2.1] 95% CI”是诚实的。“Sharpe = 1.43”不是。

P(Sharpe > 0) 是基准。 P(Sharpe > 0) < 50% 的策略更可能亏钱而不是赚钱。拒绝低于此阈值的策略。

P(Sharpe > 1) 是你的”好”标准。 如果你想要 Sharpe > 1 的策略,P(Sharpe > 1) 应该是你的主要决策指标。P(Sharpe > 1) > 80% 是合理的标准。


第 7 步:常见陷阱 + 在知识体系中的位置

陷阱:有时使用平坦先验。 如果你知道你的策略是股票多空,Sharpe 5.0 是不合理的。在先验中编码这个。

陷阱:忽略峰度。 金融收益有厚尾。正态 Sharpe 分布低估不确定性。总是根据峰度调整。

陷阱:混淆后验与预测。 后验 P(θ | data) 是你对不可观测真实 Sharpe 的信念。后验预测是用于可观测未来 Sharpe 的。它们的方差不同——预测总是更宽。

在知识体系中的位置:

  • 当你有有限数据时(先验有帮助)
  • 当你想要诚实的不确定性量化时
  • 当比较具有不同不确定性特征的策略时
  • 基于完整分布(不只是点估计)设置仓位时

贝叶斯思维不替代频率主义方法(PBO、DSR)——它是补充。PBO 告诉你过拟合风险。贝叶斯分析告诉你真实表现的不确定性。它们一起给你更完整的画面。


下一步

准备好下一级了吗?→ 学习路线 06:Sharpe 比率崇拜

想要百科参考卡片?→ 概率化回测(百科词条)