量化交易从0到1:因子、回测、工程化与那些90%人踩过的坑
- 前言
- 一、量化系统整体架构
- 二、因子构建:Alpha的源头
- 2.1 基础因子示例(动量因子)
- 2.2 因子检验指标
- 三、回测:仿真市场,不是美图秀秀
- 3.1 必须建模的交易成本
- 3.2 极简事件驱动回测示例(均线择时)
- 四、量化最大杀手:过拟合 Overfitting
- 4.1 什么是过拟合
- 4.2 过拟合规避工程规范
- 五、实盘工程与风控:策略上线才是地狱
- 5.1 实盘架构要点
- 5.2 硬风控规则(必须写死,不能依赖人工)
- 六、工具栈推荐
- 七、个人量化的边界
- 结尾
前言
很多人对量化的理解停留在"写一段均线金叉代码,回测拉出一条漂亮净值曲线"。但实盘上线之后,策略收益直接崩塌。核心原因:回测不等于市场,历史曲线只是仿真结果,不是未来收益保证书。
量化本质是一套概率驱动的工程系统:用统计学挖掘市场可重复的Alpha,通过回测验证,再用低延迟、强风控的程序在实盘持续执行。收益只是这套系统的副产品。
风险提示:本文所有代码与策略仅用于技术学习演示,不构成任何投资建议。市场存在风险,任何历史回测结果无法保证未来盈利。
一、量化系统整体架构
一个最小可运行量化系统,分为五层,缺一不可:
┌─────────────┐ 行情数据源:K线、tick、基本面、量价因子 │ 数据层 │ AKShare / tushare / 券商行情API └──────┬──────┘ ▼ ┌─────────────┐ 因子层:特征计算、中性化、Z-score标准化、去极值 │ 因子/特征层 │ 动量、波动率、估值、量价因子 └──────┬──────┘ ▼ ┌─────────────┐ 策略层:信号生成、组合优化、目标权重计算 │ 策略逻辑层 │ 多因子选股、择时、趋势跟踪、均值回归 └──────┬──────┘ ▼ ┌─────────────┐ 回测层:事件驱动仿真、交易成本、滑点、绩效指标 │ 回测校验层 │ backtrader / vectorbt / Qlib └──────┬──────┘ ▼ ┌─────────────┐ 实盘层:订单路由、风控、日志、监控、熔断 │ 交易与风控层│ └─────────────┘两个主流范式:
截面多因子(选股):同一时间点,在全股票池打分,按因子得分排序,定期调仓。适合日频/周频低频策略,个人量化最常用。
时序择时:对单一标的,用历史时序预测未来涨跌,均线、ATR、机器学习时序模型都属于这类。
二、因子构建:Alpha的源头
因子就是预测未来收益的特征。好因子必须满足逻辑可解释 + 样本内显著 + 样本外稳定。
2.1 基础因子示例(动量因子)
动量因子假设:过去20日涨幅高的标的,短期继续走强。使用Z-score标准化,消除行业、市值带来的偏差,避免数值量级干扰。
importpandasaspdimportnumpyasnpdefcalc_momentum_factor(df,window=20):""" df: 包含close收盘价的DataFrame,index=时间,columns=标的代码 return: 动量因子矩阵 """# 20日收益率ret_20=df["close"]/df["close"].shift(window)-1# 去极值(缩尾处理,剔除3σ外异常值)upper=ret_20.quantile(0.995)lower=ret_20.quantile(0.005)ret_20=np.clip(ret_20,lower,upper)# Z-score标准化:(x-均值)/标准差z_mom=(ret_20-ret_20.mean())/ret_20.std()returnz_mom关键提醒:因子计算一定要 shift(1)。
错误写法:用当日收盘数据生成当日交易信号,在回测中可以直接成交,属于未来函数,是新手第一大坑。
正确:用 t 时刻数据,生成 t+1 的交易信号。
2.2 因子检验指标
因子算完不能直接上策略,先做检验:
IC(信息系数):因子值与下一期收益的相关系数,衡量预测能力。IC均值 > 0.05,一般认为有预测效果;ICIR(IC均值/IC标准差)> 0.5 是比较优质因子。
分层回测:把股票按因子得分分成5组,观察每组收益是否单调,高分组显著跑赢低分组。
单调性:分组收益不能忽高忽低,否则因子不具备稳定预测能力。
三、回测:仿真市场,不是美图秀秀
回测核心目标:尽可能复刻真实交易摩擦。绝大多数"逆天曲线",都是忽略交易成本带来的幻觉。
3.1 必须建模的交易成本
手续费:佣金、印花税
买卖价差(bid-ask spread)
滑点 Slippage:下单预期价和实际成交价差异,小盘股、大仓位尤其明显
流动性约束:标的当日成交量不足,无法全额成交
3.2 极简事件驱动回测示例(均线择时)
importvectorbtasvbt# 加载行情数据(演示用,实际替换为真实K线)np.random.seed(42)price=pd.Series(np.cumprod(1+np.random.randn(500)*0.01),index=pd.date_range('2020-01-01',periods=500,freq='D'))# 计算均线fast_ma=vbt.MA.run(price,window=10)slow_ma=vbt.MA.run(price,window=30)# 金叉做多,死叉平仓entries=fast_ma.ma_crossed_above(slow_ma.ma)exits=fast_ma.ma_crossed_below(slow_ma.ma)# 加入滑点、手续费仿真pf=vbt.Portfolio.from_signals(price,entries,exits,fees=0.0005,# 手续费万5slippage=0.001,# 滑点0.1%init_cash=100000)print(pf.stats())输出关键绩效指标:
总收益、年化收益率
最大回撤 Max Drawdown:账户从高点到最低点的亏损幅度,风控核心指标
夏普比率 Sharpe Ratio:超额收益 / 波动率,衡量单位风险收益。夏普 > 1.5 属于不错策略;> 3 属于优秀
胜率、盈亏比、换手率
夏普比公式:
S R = f r a c E [ R p − R f ] s i g m a ( R p ) SR=frac{E[R_p-R_f]}{sigma(R_p)}SR=fracE[Rp−Rf]sigma(Rp)
其中R p R_pRp为策略收益,R f R_fRf为无风险利率,s i g m a sigmasigma为策略收益标准差。
四、量化最大杀手:过拟合 Overfitting
4.1 什么是过拟合
你反复调参数,让策略完美适配历史行情噪声,而不是捕捉底层市场规律。回测净值曲线平滑如直线,实盘直接翻车。
典型特征:
参数微小改动,收益剧烈变化(参数极度敏感)
训练集收益爆炸,样本外测试集收益大幅衰减
策略逻辑无法解释,纯粹是一堆 if 条件硬凑历史行情
大量参数网格搜索,多重检验带来伪Alpha
4.2 过拟合规避工程规范
时间序列分割,禁止随机 shuffle。金融时序有时间相关性,不能随机划分训练集测试集。严格:训练集 → 验证集 → 样本外测试集,时间顺序不能打乱。
先有业务逻辑,再写代码回测,禁止先看曲线再强行解释逻辑。
参数敏感性扫描:在参数邻域内,绩效不能断崖式下跌。
控制参数数量,少用多层 if 嵌套规则。
做置换检验:打乱收益标签,验证因子是否只是随机幸运。
五、实盘工程与风控:策略上线才是地狱
回测通过,仅仅是第一步。实盘系统重点不在算法,而在稳定性、熔断、异常处理。
5.1 实盘架构要点
行情订阅:不要轮询拉取,优先 Websocket 实时推送,降低延迟。
订单状态机:新建、已报、部分成交、全部成交、拒单、撤单,每个状态做分支处理。
日志全链路记录:行情快照、信号时间、下单时间、成交回报,用于事后复盘。
仓位校验:定时对账,本地仓位与券商柜台仓位比对,防止状态不一致。
5.2 硬风控规则(必须写死,不能依赖人工)
单标的最大仓位上限
单日最大亏损熔断:当日亏损达到阈值,停止开仓,只减仓
订单失败次数阈值:连续多次拒单,暂停策略
行情心跳检测:行情断连超时,全部挂单撤销,停止交易
六、工具栈推荐
| 用途 | 工具库 | 特点 |
|---|---|---|
| 数据获取 | AKShare、Tushare | A股免费行情、基本面数据 |
| 回测 | vectorbt、Backtrader、Qlib | vectorbt 向量化回测速度快;Qlib 专注因子研究 |
| 高性能时序 | DolphinDB | 海量 tick/K线数据,适合机构级 |
| 实盘对接 | 券商 Python SDK | 直接对接柜台API |
七、个人量化的边界
个人开发者不要盲目追逐高频 HFT。高频依赖机房托管、纳秒级延迟、深度订单簿,硬件成本极高。低频日频/周频多因子、ETF轮动才是个人量化的舒适区。
量化不是预测市场涨跌,而是在可控风险下,重复执行具备统计优势的规则。没有永远赚钱的策略,任何 Alpha 都会随着市场参与者变多而衰减。策略需要持续监控、迭代、下线。
结尾
量化的门槛不在于 Python 语法,而在于对偏差的控制:未来函数偏差、幸存者偏差、过拟合、交易成本低估。一条漂亮的净值曲线,只是表象;一套能持续稳定运行、风险可控、逻辑自洽的系统,才是量化的核心。
欢迎评论区交流因子挖掘、回测踩坑经验;后续计划更新:多因子中性化完整实现 + 夏普比率与最大回撤深度解析。