← 返回《进阶量化交易实战:迭代式的量化策略研发》
📑 查看全课大纲(第 53 / 59 节)
  1. 1.量化投资必备基础知识
  2. 2.趋势型策略及模型原理
  3. 3.均值回复型策略及模型原理
  4. 4.配对交易策略及模型原理
  5. 5.量化策略研发流程与基本技能
  6. 6.常用的量化平台概述及如何选择
  7. 7.如何量化一个主观策略思路
  8. 8.常用技术指标及指标计算过程
  9. 9.如何编写指标代码
  10. 10.指标的物理意义
  11. 11.技术指标的应用技巧
  12. 12.更多的交易决策
  13. 13.编写程序去量化一个趋势型技术指标
  14. 14.编写趋势型技术指标的性能评价
  15. 15.策略对交易成本和持仓周期的影响
  16. 16.股票池策略的原理及基本框架
  17. 17.基于多因子分析的股票池设计与实现
  18. 18.股票池的性能评估
  19. 19.使用定制化财务因子构建股票池
  20. 20.趋势型策略原理及股票池机制的设计
  21. 21.趋势型择时信号的设计方法与编程实现
  22. 22.趋势型策略的回测与性能评估
  23. 23.优化趋势型策略的思路及方法
  24. 24.量化体系中的风险控制思想
  25. 25.风险的度量-波动率
  26. 26.常用的风险控制方法
  27. 27.实现止盈止损模块以提高策略性能
  28. 28.策略性能的评估与优化
  29. 29.探讨波动率与风险的关系
  30. 30.量化策略中的经典资金管理模型
  31. 31.用python编程实现资金管理模块
  32. 32.构建一个完善的量化交易策略
  33. 33.趋势型量化策略必备的期货知识
  34. 34.期货量化工具介绍
  35. 35.商品期货趋势型策略原理
  36. 36.用TB编写商品期货趋势型策略(上)
  37. 37.用TB编写商品期货趋势型策略(下)
  38. 38.分析优化商品期货趋势型策略的方法思路
  39. 39.期货交易策略的注意事项
  40. 40.均值回复型策略的原理
  41. 41.A股市场有没有稳定的均值回复效应?
  42. 42.编写一个均值回复型股票量化策略
  43. 43.编写多空组合策略进行策略改进
  44. 44.在策略中实现头寸管理进行策略优化
  45. 45.套利策略原理及常见套利类型
  46. 46.用MC开发一个跨品种套利交易策略(上)
  47. 47.用MC开发一个跨品种套利交易策略(下)
  48. 48.统计套利之股票配对交易策略
  49. 49.实盘中的细节问题:加减仓
  50. 50.关于高频交易
  51. 51.如何评价实盘量化策略的性能
  52. 52.量化系统的工作过程及研发流程
  53. 53.运气or实力
  54. 54.量化实盘交易需要满足什么条件
  55. 55.未来函数的坑
  56. 56.实盘数据接口异常的自动报警
  57. 57.交易系统的压力测试
  58. 58.自动运行的交易策略,什么时候需要人工干预
  59. 59.预案准备和实盘心理建设

运气or实力

约 12 分钟

📺 正在播放小象官方高清录播(支持倍速与清晰度调节)

运气or实力

小象实战讲义 · 进阶量化交易实战:迭代式的量化策略研发 本讲义仅用于编程与量化方法教学,不构成任何投资建议。

在随机游走的金融市场中,短期大赚究竟是策略具备真实 Alpha(实力),还是仅仅碰巧赶上了市场风格(运气)?本节深入剖析假设检验、tt-统计量、拔靴法(Bootstrap 重抽样)以及蒙特卡洛随机置换检验,教你用严密统计学工具剥离运气的幻觉。

💡 核心导读

  • 辨别量化实力与运气的四大统计学工具
    • tt-统计量与 pp-value 检验:检验策略超额收益均值是否显著大于 0(要求 t>2.0,p<0.05t > 2.0, p < 0.05);
    • 拔靴法重抽样(Bootstrap Resampling):对历史交易记录进行 10,000 次有放回重抽样,计算夏普比率的 95% 置信区间;
    • 蒙特卡洛随机打乱(Monte Carlo Permutation):打乱价格走势时序,检验策略是否仍能跑出正收益(若能,则策略存在过拟合漏洞);
    • 风格归因(Factor Attribution):剥离市场 Beta、大小盘风格与行业暴露,提取真正的特异性 Alpha。
┌─────────────────────────────────────────────────────────────┐
│                    实力与运气统计学鉴别矩阵拓扑图                │
└──────────────────────────────┬──────────────────────────────┘

 ┌─────────────────────────────┼─────────────────────────────┐
 ▼                             ▼                             ▼
┌─────────────────────────┐   ┌─────────────────────────┐   ┌─────────────────────────┐
│ <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>t</mi></mrow><annotation encoding="application/x-tex">t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6151em;"></span><span class="mord mathnormal">t</span></span></span></span>-统计量假设检验      │   │ Bootstrap 重抽样置信区间│   │ 蒙特卡洛随机置换检验    │
├─────────────────────────┤   ├─────────────────────────┤   ├─────────────────────────┤
│ • <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>t</mi><mo>=</mo><mfrac><mi>μ</mi><mrow><mi>σ</mi><mi mathvariant="normal">/</mi><msqrt><mi>N</mi></msqrt></mrow></mfrac><mo>&gt;</mo><mn>2.0</mn></mrow><annotation encoding="application/x-tex">t = \frac{\mu}{\sigma/\sqrt{N}} &gt; 2.0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6151em;"></span><span class="mord mathnormal">t</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1.3851em;vertical-align:-0.6376em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.7475em;"><span style="top:-2.5374em;"><span class="pstrut" style="height:3em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.0359em;">σ</span><span class="mord mtight">/</span><span class="mord sqrt mtight"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9323em;"><span class="svg-align" style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord mtight" style="padding-left:0.833em;"><span class="mord mathnormal mtight" style="margin-right:0.109em;">N</span></span></span><span style="top:-2.8923em;"><span class="pstrut" style="height:3em;"></span><span class="hide-tail mtight" style="min-width:0.853em;height:1.08em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="1.08em" viewBox="0 0 400000 1080" preserveAspectRatio="xMinYMin slice"><path d="M95,702
c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14
c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54
c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10
s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429
c69,-144,104.5,-217.7,106.5,-221
l0 -0
c5.3,-9.3,12,-14,20,-14
H400000v40H845.2724
s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7
c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z
M834 80h400000v40h-400000z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.1077em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.4461em;"><span class="pstrut" style="height:3em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">μ</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.6376em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">&gt;</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">2.0</span></span></span></span> │   │ • 10000 次模拟夏普分布  │   │ • 打乱时序检验 Alpha 归零│
│ • 证明收益非随机游走    │   │ • 95% 下界夏普仍大于 1.0│   │ • 识破过拟合假象        │
└─────────────────────────┘   └─────────────────────────┘   └─────────────────────────┘

一、夏普比率 tt-统计量与置信度检验数学推导

设策略拥有 NN 笔独立交易记录,样本均值为 μ\mu,标准差为 σ\sigma。检验零假设 H0:μ=0H_0: \mu = 0tt-统计量为:

t=μ0σ/N=Sharpesingle×Nt = \frac{\mu - 0}{\sigma / \sqrt{N}} = \text{Sharpe}_{\text{single}} \times \sqrt{N}

当交易笔数 N<30N < 30 时,即便年化收益很高,tt 统计量往往也无法突破临界值 1.961.96(无法排除纯运气成分)。

import pandas as pd
import numpy as np

def calculate_strategy_t_stat(returns: pd.Series) -> dict:
    """
    计算策略收益率的 t-统计量与统计显著性
    """
    n = len(returns)
    mu = returns.mean()
    se = returns.std() / (np.sqrt(n) + 1e-8)
    t_stat = mu / (se + 1e-8)
    
    return {
        'N_Trades': n,
        'Mean_Return': float(mu),
        'T_Stat': float(t_stat),
        'Is_Statistically_Significant': abs(t_stat) >= 1.96
    }

二、Bootstrap 拔靴法夏普比率置信区间估计

通过对历史收益率进行 5000 次有放回重抽样,计算夏普比率在 95%95% 置信度下的最悲观下界。

def bootstrap_sharpe_confidence_interval(returns: pd.Series, n_iterations: int = 1000, alpha: float = 0.05) -> dict:
    """
    Bootstrap 估计夏普比率置信区间
    """
    boot_sharpes = []
    n = len(returns)
    rets_arr = returns.values
    
    for _ in range(n_iterations):
        sample = np.random.choice(rets_arr, size=n, replace=True)
        s = sample.mean() / (sample.std() + 1e-8) * np.sqrt(252)
        boot_sharpes.append(s)
        
    lower_bound = np.percentile(boot_sharpes, alpha / 2 * 100)
    upper_bound = np.percentile(boot_sharpes, (1 - alpha / 2) * 100)
    
    return {'Sharpe_Mean': float(np.mean(boot_sharpes)), 'Sharpe_Lower_95': float(lower_bound), 'Sharpe_Upper_95': float(upper_bound)}

📝 动手练一练

编写 Python 测试脚本,对模拟策略进行 1000 次 Bootstrap 抽样,测算夏普比率 95% 置信区间:

import pandas as pd
import numpy as np

def run_luck_vs_skill_test():
    np.random.seed(42)
    # 模拟 200 笔具备稳定正期望的交易收益
    trades = pd.Series(np.random.normal(0.005, 0.02, 200))
    
    t_info = calculate_strategy_t_stat(trades)
    boot_info = bootstrap_sharpe_confidence_interval(trades, n_iterations=1000)
    
    print("================ 运气 vs 实力:统计显著性检验 ================")
    print(f"交易样本量 N: {t_info['N_Trades']} 笔")
    print(f"超额收益 t 统计量: {t_info['T_Stat']:.4f} (临界值 1.96)")
    print(f"统计显著性判定   : {t_info['Is_Statistically_Significant']} (排除纯运气)")
    print(f"夏普 95% 置信区间: [{boot_info['Sharpe_Lower_95']:.2f}, {boot_info['Sharpe_Upper_95']:.2f}]")
    assert t_info['Is_Statistically_Significant'], "策略未能通过统计显著性检验!"
    print("✅ 统计学假设检验与 Bootstrap 置信区间测试 PASS")
    print("============================================================")

if __name__ == '__main__':
    run_luck_vs_skill_test()

运行结果输出:

================ 运气 vs 实力:统计显著性检验 ================
交易样本量 N: 200 笔
超额收益 t 统计量: 3.1782 (临界值 1.96)
统计显著性判定   : True (排除纯运气)
夏普 95% 置信区间: [1.35, 5.92]
✅ 统计学假设检验与 Bootstrap 置信区间测试 PASS
============================================================

本章小结

  1. 用统计大数定律剥离运气:单笔或少量交易的大赚往往纯属运气,唯有 t>2.0t > 2.0 的大样本才能证明实力。
  2. 以 Bootstrap 下界评估风险:关注夏普比率在 95%95% 置信度下的悲观下界,做好实盘降速心理准备。
  3. 警惕样本量过小的欺骗性:策略评估至少需要累积 100 笔以上独立交易样本,杜绝基于三五次交易妄下结论。

📋 行动清单 (Action Checklist)

  • 运行显著性检验代码,测试样本量缩减至 20 笔时的 tt 统计量变化;
  • 编写时序随机置换检验(Permutation Test)脚本;
  • 预习下一节,掌握量化策略上线实盘所需满足的硬性条件。

— 小象教研组

配套学习资源与课件
  • 第10章课件:实盘中的细节问题讨论(PDF · 1.7MB)
    下载
🎁 免费学习资源

领取《小象 11GB VIP 课件资料包与大厂真题手册》

包含全套实战 Jupyter 源码、清洗后数据集、大厂高频面试真题与专属学员答疑交流群。

  • 完整 Python / 数据分析 Jupyter 实战源码
  • 大厂真实业务数据集与练习题
  • 微信扫码添加课程顾问,免费获取网盘下载链接
微信二维码:扫码添加课程顾问微信扫码添加顾问