查看全课大纲(第 5 / 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.预案准备和实盘心理建设

量化策略研发流程与基本技能

约 26 分钟

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

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

在专业量化对冲基金与高水平自营交易团队中,一个策略的成功诞生绝非依靠灵光一闪的孤注一掷,而是依靠一套标准化、工业级、可迭代的量化策略研发流水线(Quant R&D Pipeline)。从最初的交易灵感提出,到严格的历史回测、严苛的样本外盲测,再到模拟仿真与实盘上线,每一步都有其明确的准入准出标准。本讲系统解构量化策略研发全生命周期的六大核心环节,解析优秀宽客必备的”三维技能三角”,并建立科学的过拟合诊断与衰减评估模型。


💡 核心导读

  • 量化策略研发全生命周期六大核心阶段:
    1. 策略构想(Trading Idea):基于金融逻辑(供求不平衡、行为偏差、结构性套利)而非纯数据盲目挖掘提出假设;
    2. 数据工程(Data Engineering):清洗处理 Point-in-Time 历史时序数据,剔除停牌、除权异常与幸存者偏差;
    3. 特征工程与信号建模(Alpha Modeling):构建多因子与择时信号,进行去极值、标准化与正交化;
    4. 事件驱动历史回测(Backtesting):精确模拟撮合规则,扣除佣金、印花税与市场冲击滑点;
    5. 样本外交叉验证(OOS & Walk-Forward):严格隔离样本内训练与样本外测试数据,评估参数稳健性与收益衰减率;
    6. 模拟盘仿真与实盘部署(Production Deployment):在真实网络与行情节拍下运行 1~3 个月,核验接口稳定性后极小资金实盘。
  • 优秀量化宽客的核心技能三角(Skills Triangle):
    • 金融领域认知(Domain Knowledge):深刻理解市场微观结构、品种交割规则与风险敞口;
    • 数学与统计学功底(Math & Statistics):熟练掌握概率分布、假设检验、时序分析与多变量回归;
    • 计算机与工程实现(Software Engineering):精通 Python / C++、向量化计算、数据库管理与交易网关开发。
  • 过拟合衰减率(Overfit Decay Ratio)警戒线: Decay Ratio=SharpeIS−SharpeOOSSharpeIS×100%\text{Decay Ratio} = \frac{\text{Sharpe}_{IS} - \text{Sharpe}_{OOS}}{\text{Sharpe}_{IS}} \times 100\% 若样本外夏普衰减超过 30%30\%,判定策略存在过度拟合历史噪声的严重风险,坚决不予实盘上线!
┌─────────────────────────────────────────────────────────────┐
│                    量化策略研发全生命周期流水线             │
└──────────────────────────────┬──────────────────────────────┘
                               │
 ┌───────────────┬─────────────┼─────────────┬───────────────┐
 ▼               ▼             ▼             ▼               ▼
┌─────────────┐ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌─────────────┐
│ 1. 交易假设 │ │2. 数据工程│ │3. 特征建模│ │4. 回测回检│ │5. 样本外盲测│
├─────────────┤ ├───────────┤ ├───────────┤ ├───────────┤ ├─────────────┤
│ • 逻辑驱动  │ │ • 停牌除权│ │ • 因子正交│ │ • 撮合滑点│ │ • WFO 滚动  │
│ • 经济机理  │ │ • 防作弊  │ │ • 信号合成│ │ • 成本扣除│ │ • 衰减率<30%│
└─────────────┘ └───────────┘ └───────────┘ └───────────┘ └─────────────┘
                                                             │
                                                             ▼
                                                    ┌─────────────────┐
                                                    │ 6. 模拟盘与实盘 │
                                                    └─────────────────┘

一、量化研发中的三大致命作弊陷阱与防御

  1. 未来函数(Look-Ahead Bias):
    • 典型错误:在 tt 日盘中使用 tt 日收盘价作为买入触发条件,或在财报发布前提前使用了未公开的利润数据;
    • 防御规范:严格使用 shift(1),基本面数据严格按公告披露日(publish_date)进行 merge_asof 对齐。
  2. 幸存者偏差(Survivorship Bias):
    • 典型错误:在回测历史中仅使用当前存续的股票池,忽略了历史上已退市暴雷的标的;
    • 防御规范:使用包含全部历史退市个股的全动态股票池。
  3. 数据窥探偏差(Data Snooping):
    • 典型错误:在全量数据上反复调整数十个参数直到曲线完美;
    • 防御规范:严格执行样本内调优(70%)与样本外盲测(30%)物理隔离。
import pandas as pd
import numpy as np

def align_fundamental_data_without_lookahead(market_df, report_df):
    """
    基于公告日期严格对齐财报数据,彻底杜绝未来函数(前视偏差)。
    合成教学样例,实际应用需注意财报数据披露延迟与修正风险。
    """
    market_df['date'] = pd.to_datetime(market_df['date'])
    report_df['publish_date'] = pd.to_datetime(report_df['publish_date'])
    
    aligned = pd.merge_asof(
        market_df.sort_values('date'),
        report_df.sort_values('publish_date'),
        left_on='date',
        right_on='publish_date',
        by='code',
        direction='backward'
    )
    return aligned

# 合成数据:模拟3只股票5天的行情和财报披露
rng = np.random.default_rng(seed=42)
dates = pd.date_range('2024-01-02', periods=5, freq='B')
codes = ['000001.SZ', '000002.SZ', '000003.SZ']

market_data = []
for code in codes:
    for date in dates:
        market_data.append({
            'code': code,
            'date': date,
            'close': rng.uniform(10.0, 50.0)
        })
market_df = pd.DataFrame(market_data)

report_data = [
    {'code': '000001.SZ', 'publish_date': '2024-01-01', 'roe': 0.15},
    {'code': '000001.SZ', 'publish_date': '2024-01-03', 'roe': 0.18},
    {'code': '000002.SZ', 'publish_date': '2024-01-02', 'roe': 0.12},
    {'code': '000003.SZ', 'publish_date': '2024-01-04', 'roe': 0.09},
]
report_df = pd.DataFrame(report_data)

# 执行对齐
result_df = align_fundamental_data_without_lookahead(market_df, report_df)
print("===== 财报数据对齐结果(杜绝未来函数) =====")
print(f"对齐后数据形状: {result_df.shape}")
print("\n对齐数据预览(按日期和代码排序):")
print(result_df.sort_values(['date', 'code']).to_string(index=False))
print("\n关键检查:交易日2024-01-02的000001.SZ,应使用1月1日的ROE(0.15),而非1月3日的。")
===== 财报数据对齐结果(杜绝未来函数) =====
对齐后数据形状: (15, 5)

对齐数据预览(按日期和代码排序):
     code       date     close publish_date  roe
000001.SZ 2024-01-02 40.958242   2024-01-01 0.15
000002.SZ 2024-01-02 49.024894   2024-01-02 0.12
000003.SZ 2024-01-02 24.831921          NaT  NaN
000001.SZ 2024-01-03 27.555138   2024-01-03 0.18
000002.SZ 2024-01-03 40.445588   2024-01-02 0.12
000003.SZ 2024-01-03 47.070600          NaT  NaN
000001.SZ 2024-01-04 44.343917   2024-01-03 0.18
000002.SZ 2024-01-04 41.442572   2024-01-02 0.12
000003.SZ 2024-01-04 35.754605   2024-01-04 0.09
000001.SZ 2024-01-05 37.894721   2024-01-03 0.18
000002.SZ 2024-01-05 15.124545   2024-01-02 0.12
000003.SZ 2024-01-05 42.910465   2024-01-04 0.09
000001.SZ 2024-01-08 13.767094   2024-01-03 0.18
000002.SZ 2024-01-08 28.015438   2024-01-02 0.12
000003.SZ 2024-01-08 27.736568   2024-01-04 0.09

关键检查:交易日2024-01-02的000001.SZ,应使用1月1日的ROE(0.15),而非1月3日的。

二、样本内外绩效对比与衰减率评估函数

在策略评估环节,必须建立多维指标矩阵,衡量策略泛化能力:

import numpy as np

def evaluate_strategy_generalization(returns_is, returns_oos):
    """
    计算样本内 (IS) 与样本外 (OOS) 的夏普比率及衰减幅度。
    合成教学样例,过拟合是策略失效的主要风险之一。
    """
    sharpe_is = (np.mean(returns_is) / np.std(returns_is)) * np.sqrt(252)
    sharpe_oos = (np.mean(returns_oos) / np.std(returns_oos)) * np.sqrt(252)
    decay = (sharpe_is - sharpe_oos) / (sharpe_is + 1e-6)
    
    is_qualified = (sharpe_oos > 1.2) and (decay < 0.30)
    return {
        'sharpe_is': sharpe_is,
        'sharpe_oos': sharpe_oos,
        'decay_rate': decay,
        'is_qualified': is_qualified
    }

# 合成数据:模拟策略在样本内和样本外的日收益率序列
rng = np.random.default_rng(seed=123)
# 样本内:500个交易日,年化夏普约1.5
returns_is = rng.normal(loc=0.0008, scale=0.01, size=500)
# 样本外:250个交易日,年化夏普约0.9(模拟衰减)
returns_oos = rng.normal(loc=0.0004, scale=0.012, size=250)

# 执行评估
eval_result = evaluate_strategy_generalization(returns_is, returns_oos)
print("===== 策略泛化能力评估 =====")
print(f"样本内夏普比率 (IS Sharpe): {eval_result['sharpe_is']:.4f}")
print(f"样本外夏普比率 (OOS Sharpe): {eval_result['sharpe_oos']:.4f}")
print(f"夏普衰减率 (Decay Rate): {eval_result['decay_rate']:.2%}")
print(f"策略是否合格 (OOS Sharpe > 1.2 & Decay < 30%): {eval_result['is_qualified']}")
===== 策略泛化能力评估 =====
样本内夏普比率 (IS Sharpe): 1.3656
样本外夏普比率 (OOS Sharpe): 0.7535
夏普衰减率 (Decay Rate): 44.82%
策略是否合格 (OOS Sharpe > 1.2 & Decay < 30%): False

📝 动手练一练

下面我们用 Python 编写一段 量化策略研发全流程回测评估引擎,模拟计算策略在样本内调优与样本外盲测中的 CAGR、夏普比率、最大回撤与衰减率:

import pandas as pd
import numpy as np

def run_strategy_rd_pipeline():
    """
    量化策略研发流水线评估引擎:样本内 (IS) vs 样本外 (OOS)。
    合成教学样例,历史回测绩效不代表未来,需警惕幸存者偏差与过拟合。
    """
    rng = np.random.default_rng(seed=2024)
    # 模拟 3 年日度收益率序列 (前 2 年 IS, 第 3 年 OOS)
    # 样本内表现略好,样本外加入更多噪声和亏损
    r_is = rng.normal(0.0010, 0.012, 500)
    r_oos = rng.normal(0.0002, 0.015, 250)  # 更低均值,更高波动

    # 样本内绩效
    cagr_is = (np.prod(1 + r_is) ** (252 / 500) - 1) * 100.0
    sharpe_is = (np.mean(r_is) / np.std(r_is)) * np.sqrt(252)
    cum_is = np.cumprod(1 + r_is)
    max_dd_is = np.max((np.maximum.accumulate(cum_is) - cum_is) / np.maximum.accumulate(cum_is)) * 100.0
    
    # 样本外绩效
    cagr_oos = (np.prod(1 + r_oos) ** (252 / 250) - 1) * 100.0
    sharpe_oos = (np.mean(r_oos) / np.std(r_oos)) * np.sqrt(252)
    cum_oos = np.cumprod(1 + r_oos)
    max_dd_oos = np.max((np.maximum.accumulate(cum_oos) - cum_oos) / np.maximum.accumulate(cum_oos)) * 100.0
    
    decay_ratio = (sharpe_is - sharpe_oos) / sharpe_is * 100.0 if sharpe_is != 0 else 100.0
    
    res = {
        "IS_CAGR": f"{cagr_is:.2f}%",
        "IS_Sharpe": f"{sharpe_is:.2f}",
        "IS_MaxDD": f"{max_dd_is:.2f}%",
        "OOS_CAGR": f"{cagr_oos:.2f}%",
        "OOS_Sharpe": f"{sharpe_oos:.2f}",
        "OOS_MaxDD": f"{max_dd_oos:.2f}%",
        "Overfit_Decay": f"{decay_ratio:.1f}% ({'衰减 < 30%, 合格' if decay_ratio < 30.0 else '衰减 > 30%, 不合格'})"
    }
    return res

# 执行流水线评估并打印结果
results = run_strategy_rd_pipeline()
print("================ 量化策略研发全流程回测评估 ================")
for key, value in results.items():
    print(f"  - {key:<18}: {value}")
print("----------------------------------------------------------")
print("核心要点:样本外盲测是检验策略是否过拟合与具备实盘生命力的试金石。")
print("==========================================================")

运行结果输出:

================ 量化策略研发全流程回测评估 ================
  - IS_CAGR           : 28.22%
  - IS_Sharpe         : 1.40
  - IS_MaxDD          : 21.65%
  - OOS_CAGR          : -9.59%
  - OOS_Sharpe        : -0.29
  - OOS_MaxDD         : 22.49%
  - Overfit_Decay     : 120.8% (衰减 > 30%, 不合格)
----------------------------------------------------------
核心要点:样本外盲测是检验策略是否过拟合与具备实盘生命力的试金石。
==========================================================

⚠️ 失败案例解读(反面教材):该策略样本内光鲜(CAGR 28.22%、Sharpe 1.40),样本外却全面崩塌(CAGR -9.59%、Sharpe -0.29),夏普衰减率高达 120.8%——远超 30% 警戒线,判定不合格、坚决不予实盘上线。这正是过拟合的典型画像:样本内参数恰好踩中历史噪声,一旦面对未见过的新数据立即失效。衰减率超过 100% 意味着样本外夏普已转负,策略不仅没保住样本内收益,反而开始亏损。这就是为什么要用代码动态判定合格线,而不是预设”合格”结论——评测函数的职责是如实揭示失败。


👉 点击查看解析

本节练习重点在于完整走通量化策略研发流程,掌握数据准备、信号生成、回测与绩效评估的基本代码实现。关键结论是先建立可复现的研究框架,再基于回测结果逐步优化策略,而不是直接追求复杂模型。

本章小结

  1. 建立严密研发管线:严格遵循构想、数据清洗、信号建模、严密回测、样本外盲测与模拟上线的标准化流程。
  2. 严防三大经典作弊:在代码编写阶段杜绝未来函数、幸存者偏差与数据过度拟合。
  3. 推行样本外硬考核:以样本外夏普衰减率小于 30% 作为策略实盘准入的唯一铁律。

📋 行动清单 (Action Checklist)

  • 运行本讲研发评估代码,观察样本内外夏普衰减对策略质量的判定规则;
  • 检查自己过往的回测代码,确认是否存在未公开数据的未来函数渗入;
  • 预习下一节,全面盘点主流开源与商业量化平台的技术架构与选型策略。

—— 小象教研组

配套资料 · 直接下载

课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。

  • 第1章课件:实战量化投资必备基础知识
    PDF · 4.5MB
    下载