查看全课大纲(第 5 / 59 节)
- 1.量化投资必备基础知识
- 2.趋势型策略及模型原理
- 3.均值回复型策略及模型原理
- 4.配对交易策略及模型原理
- 5.量化策略研发流程与基本技能
- 6.常用的量化平台概述及如何选择
- 7.如何量化一个主观策略思路
- 8.常用技术指标及指标计算过程
- 9.如何编写指标代码
- 10.指标的物理意义
- 11.技术指标的应用技巧
- 12.更多的交易决策
- 13.编写程序去量化一个趋势型技术指标
- 14.编写趋势型技术指标的性能评价
- 15.策略对交易成本和持仓周期的影响
- 16.股票池策略的原理及基本框架
- 17.基于多因子分析的股票池设计与实现
- 18.股票池的性能评估
- 19.使用定制化财务因子构建股票池
- 20.趋势型策略原理及股票池机制的设计
- 21.趋势型择时信号的设计方法与编程实现
- 22.趋势型策略的回测与性能评估
- 23.优化趋势型策略的思路及方法
- 24.量化体系中的风险控制思想
- 25.风险的度量-波动率
- 26.常用的风险控制方法
- 27.实现止盈止损模块以提高策略性能
- 28.策略性能的评估与优化
- 29.探讨波动率与风险的关系
- 30.量化策略中的经典资金管理模型
- 31.用python编程实现资金管理模块
- 32.构建一个完善的量化交易策略
- 33.趋势型量化策略必备的期货知识
- 34.期货量化工具介绍
- 35.商品期货趋势型策略原理
- 36.用TB编写商品期货趋势型策略(上)
- 37.用TB编写商品期货趋势型策略(下)
- 38.分析优化商品期货趋势型策略的方法思路
- 39.期货交易策略的注意事项
- 40.均值回复型策略的原理
- 41.A股市场有没有稳定的均值回复效应?
- 42.编写一个均值回复型股票量化策略
- 43.编写多空组合策略进行策略改进
- 44.在策略中实现头寸管理进行策略优化
- 45.套利策略原理及常见套利类型
- 46.用MC开发一个跨品种套利交易策略(上)
- 47.用MC开发一个跨品种套利交易策略(下)
- 48.统计套利之股票配对交易策略
- 49.实盘中的细节问题:加减仓
- 50.关于高频交易
- 51.如何评价实盘量化策略的性能
- 52.量化系统的工作过程及研发流程
- 53.运气or实力
- 54.量化实盘交易需要满足什么条件
- 55.未来函数的坑
- 56.实盘数据接口异常的自动报警
- 57.交易系统的压力测试
- 58.自动运行的交易策略,什么时候需要人工干预
- 59.预案准备和实盘心理建设
量化策略研发流程与基本技能
约 26 分钟
小象实战讲义 · 进阶量化交易实战:迭代式的量化策略研发 本讲义仅用于编程与量化方法教学,不构成任何投资建议。
在专业量化对冲基金与高水平自营交易团队中,一个策略的成功诞生绝非依靠灵光一闪的孤注一掷,而是依靠一套标准化、工业级、可迭代的量化策略研发流水线(Quant R&D Pipeline)。从最初的交易灵感提出,到严格的历史回测、严苛的样本外盲测,再到模拟仿真与实盘上线,每一步都有其明确的准入准出标准。本讲系统解构量化策略研发全生命周期的六大核心环节,解析优秀宽客必备的”三维技能三角”,并建立科学的过拟合诊断与衰减评估模型。
💡 核心导读
- 量化策略研发全生命周期六大核心阶段:
- 策略构想(Trading Idea):基于金融逻辑(供求不平衡、行为偏差、结构性套利)而非纯数据盲目挖掘提出假设;
- 数据工程(Data Engineering):清洗处理 Point-in-Time 历史时序数据,剔除停牌、除权异常与幸存者偏差;
- 特征工程与信号建模(Alpha Modeling):构建多因子与择时信号,进行去极值、标准化与正交化;
- 事件驱动历史回测(Backtesting):精确模拟撮合规则,扣除佣金、印花税与市场冲击滑点;
- 样本外交叉验证(OOS & Walk-Forward):严格隔离样本内训练与样本外测试数据,评估参数稳健性与收益衰减率;
- 模拟盘仿真与实盘部署(Production Deployment):在真实网络与行情节拍下运行 1~3 个月,核验接口稳定性后极小资金实盘。
- 优秀量化宽客的核心技能三角(Skills Triangle):
- 金融领域认知(Domain Knowledge):深刻理解市场微观结构、品种交割规则与风险敞口;
- 数学与统计学功底(Math & Statistics):熟练掌握概率分布、假设检验、时序分析与多变量回归;
- 计算机与工程实现(Software Engineering):精通 Python / C++、向量化计算、数据库管理与交易网关开发。
- 过拟合衰减率(Overfit Decay Ratio)警戒线: 若样本外夏普衰减超过 ,判定策略存在过度拟合历史噪声的严重风险,坚决不予实盘上线!
┌─────────────────────────────────────────────────────────────┐
│ 量化策略研发全生命周期流水线 │
└──────────────────────────────┬──────────────────────────────┘
│
┌───────────────┬─────────────┼─────────────┬───────────────┐
▼ ▼ ▼ ▼ ▼
┌─────────────┐ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌─────────────┐
│ 1. 交易假设 │ │2. 数据工程│ │3. 特征建模│ │4. 回测回检│ │5. 样本外盲测│
├─────────────┤ ├───────────┤ ├───────────┤ ├───────────┤ ├─────────────┤
│ • 逻辑驱动 │ │ • 停牌除权│ │ • 因子正交│ │ • 撮合滑点│ │ • WFO 滚动 │
│ • 经济机理 │ │ • 防作弊 │ │ • 信号合成│ │ • 成本扣除│ │ • 衰减率<30%│
└─────────────┘ └───────────┘ └───────────┘ └───────────┘ └─────────────┘
│
▼
┌─────────────────┐
│ 6. 模拟盘与实盘 │
└─────────────────┘一、量化研发中的三大致命作弊陷阱与防御
- 未来函数(Look-Ahead Bias):
- 典型错误:在 日盘中使用 日收盘价作为买入触发条件,或在财报发布前提前使用了未公开的利润数据;
- 防御规范:严格使用
shift(1),基本面数据严格按公告披露日(publish_date)进行merge_asof对齐。
- 幸存者偏差(Survivorship Bias):
- 典型错误:在回测历史中仅使用当前存续的股票池,忽略了历史上已退市暴雷的标的;
- 防御规范:使用包含全部历史退市个股的全动态股票池。
- 数据窥探偏差(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% 意味着样本外夏普已转负,策略不仅没保住样本内收益,反而开始亏损。这就是为什么要用代码动态判定合格线,而不是预设”合格”结论——评测函数的职责是如实揭示失败。
👉 点击查看解析
本节练习重点在于完整走通量化策略研发流程,掌握数据准备、信号生成、回测与绩效评估的基本代码实现。关键结论是先建立可复现的研究框架,再基于回测结果逐步优化策略,而不是直接追求复杂模型。
本章小结
- 建立严密研发管线:严格遵循构想、数据清洗、信号建模、严密回测、样本外盲测与模拟上线的标准化流程。
- 严防三大经典作弊:在代码编写阶段杜绝未来函数、幸存者偏差与数据过度拟合。
- 推行样本外硬考核:以样本外夏普衰减率小于 30% 作为策略实盘准入的唯一铁律。
📋 行动清单 (Action Checklist)
- 运行本讲研发评估代码,观察样本内外夏普衰减对策略质量的判定规则;
- 检查自己过往的回测代码,确认是否存在未公开数据的未来函数渗入;
- 预习下一节,全面盘点主流开源与商业量化平台的技术架构与选型策略。
—— 小象教研组
配套资料 · 直接下载
课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。
- 下载第1章课件:实战量化投资必备基础知识PDF · 4.5MB