量化交易笔记
数据获取和处理
能拿到什么数据,决定了能做什么策略。数据决定信息的上限,策略只能逼近,不能突破。
加工不产生信息,只会损失信息。
比如一场厄尔尼诺:哪些产区会减产?粮价会不会涨?靠粮食进口的国家,货币会不会承压?这条链上的每一环都要有数据接住,气象、产量、进出口、汇率。谁先拿到、拿得更全,谁就先下注。
获取
- 行情数据:价格、成交量、盘口、逐笔,频率从日线到 tick
- 财务数据:三张表、业绩预告、分红送转
- 另类数据:卫星图、舆情、搜索指数、供应链、天气,边际信息量最大,也最贵、最脏
清洗
- 缺失值与异常值:先区分是数据错误还是真实的极端行情,再决定剔除还是保留
- 除权除息:价格序列要做复权,否则分红、送股会被当成暴跌
- 退市股票:保留已退市的股票,否则会产生幸存者偏差
- 样本范围:按需剔除 ST 股和金融行业,金融股的财报口径和其他行业不可比
- 前视偏差:财报按实际公告日而不是报告期对齐,只用当时已经能拿到的数据
处理
- 时间对齐:统一交易日历,不同频率的数据对齐到同一时点,停牌日做标记而不是填充
- 截面对齐:每个时点只保留当时在样本池里的股票,整理成「日期 × 股票」的面板
- 衍生字段:收益率、换手率、财务比率等从原始字段算出来
- 存储:按 PIT(时点数据)存,财报修订后不覆盖旧值,回测才能还原当时看到的数字
因子(Alpha)
因子是量化投资中用于解释股票收益差异的指标。它可以是基本面因子(如市盈率、盈利增长率)、技术因子(如动量、波动率)或宏观因子(如利率、经济指标)。
要预测的是超额收益或风险调整后的收益,而不是裸的涨跌幅。通常先剥离市场、行业、风格这些系统性因子,再对剩下的残差收益做预测;另一条路线是在无套利约束下直接估计随机折现因子(SDF)。
因子加工与处理(Factor Processing)
因子处理是将原始数据(财报数据、价格数据等)转化为能用于投资决策的因子值的过程。这包括因子构建、清洗、标准化、分布调整、离散化等一系列步骤。
因子计算预处理
- 去极值(Winsorize):百分位法、3σ 法
- 标准化(Standardize):常用 z-score,减均值除标准差,变成均值 0、标准差 1
- 中性化(Neutralize):剔除行业、市值、Beta 等风格因子的影响
- 归一化:min-max,(x - min) / (max - min),压到 0 到 1
单因子
一段声音,普通人听到的是一条起伏的波形,工程师看到的是一组不同频率的正弦波叠在一起(傅里叶变换。
多因子模型看市场也是这样。普通人看到的是一只只个股在涨跌,多因子模型看到的是背后的一组因子:每只股票的收益,都可以拆成它在各个因子上的暴露乘以因子收益,再加上一点个股自己的噪声。
市场不是一支支个股,而是一个个因子。
因子分类
一只股票的收益,一部分来自所有股票共同的驱动,一部分来自它自己。解释前一部分的叫风险因子,主要是风格和行业:风格就是市场公认的那几个因子,Barra 里大约十个;行业用申万或中信一级行业的哑变量表示。它们人人都看得见,只能吃到风格溢价,所以做单因子测试前要先中性化掉,剩下的才是 Alpha。
同一个指标两边都算。动量拿来解释收益是风格,拿来预测收益就是 Alpha,看你怎么用。
所以分类不看数据从哪来,看因子凭什么赚钱。解释只有两种:
- 风险补偿:你扛了别人不想扛的风险,收益是报酬
- 行为偏差:别人犯了错,你站在对面
价值
回答「现在买贵不贵」。便宜的股票长期跑赢,一种解释是它们本来就更危险(风险补偿),另一种是市场对坏消息反应过度,把它们卖得太狠(行为偏差)。
- PE(市盈率)、PB(市净率)、PS(市销率)、股息率、自由现金流收益率、EV/EBITDA(企业价值与息税折旧摊销前利润之比)
- 数据:价格加财报
质量
回答「这家公司本身好不好」。好公司本该更贵,但市场常常给得不够,注意力被有故事的公司抢走了(行为偏差)。
- 盈利能力:ROE(净资产收益率)、ROA(总资产收益率)、ROIC(投入资本回报率)、毛利率与净利率
- 盈利质量:经营现金流与净利润之比、自由现金流与营收之比、应计项(盈余管理的代理指标)、盈利波动
- 安全性:杠杆率、利息保障倍数
- 资本配置:净回购、股本稀释、再融资频率、外部融资与总资产之比
- 数据:财报
成长
回答「它在变好吗」。市场对盈利改善反应偏慢,好消息要几个季度才完全进价格(行为偏差)。单独用效果一般,常和质量、预期修正搭配。
- 营收和 EPS(每股收益)的增长率
- 数据:财报
动量与反转
回答「趋势会不会延续」。中期趋势会延续,因为信息是慢慢扩散的,投资者反应不足;极短期会反转,因为过度反应和流动性冲击会回吐。两头都是行为偏差。A 股中期动量偏弱,短期反转更强。
- 动量:过去 12 个月剔除最近 1 个月的收益(12M-1M),6M-1M 同理
- 短期反转:过去 1 到 5 日的收益
- 技术指标:RSI(相对强弱指数)、KD(随机指标)、DMI(趋向指标)、MACD(平滑异同移动平均线)、OBV(能量潮),大多是动量或反转的变形
- 数据:行情
低波动
回答「稳不稳」。波动越低,风险调整后的收益反而越高,和「高风险高收益」反着来。投资者偏爱彩票型的高波动股票,把它们买贵了(行为偏差);很多机构不能加杠杆,只能靠买高 Beta 股票放大收益,也在推高它们。
- 历史波动率、下行波动率、特质波动率(Idio Vol)、Beta
- 数据:行情
规模与流动性
回答「小不小、好不好买」。小盘股和难交易的股票要给更高回报,才有人愿意拿着(风险补偿)。
- 规模:市值
- 流动性:换手率、日均成交额、Amihud 非流动性指标
- 数据:行情
预期修正
回答「市场对它的看法在怎么变」。分析师调预期是一点点调的,业绩超预期之后股价还会持续漂移,即 PEAD(盈余公告后漂移)。都是反应不足(行为偏差)。
- 盈利预期修正:一致预期净利润和 EPS 的上调、下调
- 业绩超预期:SUE(标准化意外盈余),实际公告值和一致预期的差
- 评级与目标价:分析师评级变化、目标价调整
- 数据:分析师预期、财报公告
资金与情绪
回答「钱和情绪往哪边走」。有的是跟着聪明钱,信息多的一方先动;有的是反着散户情绪,过度乐观之后会回落。方向要分开测。
- 资金流向、大单买卖比率
- 北向资金、主动基金持仓、ETF 份额变动
- 新闻、公告、研报的文本情绪分数
- 期权隐含情绪:偏度(Skew)、持仓量(OI)分布
- 数据:行情、持仓、文本,大多属于另类数据
高频转低频因子:
1. 计算每根分钟线的收益率:
closeₜ
rₜ = ──────── -1
closeₜ₋₁
2. 确定当天参与计算的时段:默认取 9:30–14:55;关闭时段过滤时,取全天。
3. 判断当天是否上涨:把这些时段的分钟收益率相加,只有总和 大于 0 的日子继续计算。这里用的是收益率之和,不是严格的当日累计收益率。
4. 确定放量阈值:计算当天分钟成交量的均值和标准差:
阈值 = mean (volume)+ std (volume)
5. 挑出放量分钟:只保留成交量严格大于阈值的分钟。这些分钟可以上涨,也可以下跌,并不要求每分钟收益为正。
6. 计算因子值:对选中分钟的收益率求标准差,再开平方:
factor = √(std (rₜ ∣ volumeₜ > 阈值))
含义:在整体上涨的日子里,交易异常活跃时,价格变化有多不稳定。 值越高,放量时段的收益率差异越大;值越低,价格变化越一致。代码没有规定高值或
低值哪一边应该买。
单因子测试流程
因子评价
一句话:每个截面上,按因子值给标的排个序,看这个排序能不能预测接下来的收益。从三个角度看,越往后越接近实盘。
准备
- 前瞻收益:同时看几个持有期,比如 1、5、10 根 bar
- 分层:每个截面按因子值分 5 层;大量同值、分不出边界的那一期不分层
- 清洗:因子值或前瞻收益缺失的样本剔除,丢掉超过 35% 就判这个因子不可用
IC:排序对不对
- Rank IC:每个截面算一次因子值和前瞻收益的 Spearman 相关
- Pearson IC:同上,换成按收益幅度算。明显低于 Rank IC,说明排序在多数小波动上是对的,决定收益的大涨大跌没跟上
- 每个持有期汇总四个数:均值、标准差、ICIR(均值 ÷ 标准差,看稳不稳)、胜率(IC 为正的截面占比)
- 累计 IC 曲线:斜率就是均值,走平的地方是失效期;再按月取均值,看哪段时间有效
分层收益:钱在不在头尾
- 每层的平均收益折算到单根 bar,减去全池等权均值,看是否从低到高单调
- 各层净值曲线:持有 k 根时,按 k 个错开建仓的子组合取平均,避免重叠持有的收益被连乘
多空组合:扣完成本还剩多少
- 多最高层、空最低层,各半仓、组内等权,每个持有期调仓一次
- 扣手续费(换手 × 固定费率)和资金费,和回测同一口径
- 看扣费后的年化收益和夏普,再拆开看扣费前收益、每年手续费、资金费、日均换手
IC 再高,扣完成本不赚钱也没用。多空组合是最接近实盘的那个数。
还有一种学术上常用的检验:Fama-MacBeth 回归。每个截面用因子值对收益做一次回归,得到当期的因子收益;再看这串因子收益的均值和 t 值,t 值大于 2 才算显著。
组合
多因子框架概述
Signal → Factor → Alpha → 股票打分 → 组合构建
- Signal Pool:Signal 1 到 Signal n
- 对 Signal 分类后,类内加权合成 Factor,得到 Factor Pool:Factor 1 到 Factor m
- Factor 配权重合成 Alpha
- 用 Alpha 给 Share Pool 里每只股票打分(如 2.4、2.3、2.0、1.9 …… -3.0)
- 根据 Alpha 分值筛选股票或优化组合构建:等权组合、打分加权组合、优化组合……
- 最后利用归因模型对组合归因
组合构建
接着上面的流水线,分两步:先把多个因子合成一个 Alpha 分数,再把分数变成持仓。
因子合成 Alpha
先去重。看相关系数矩阵,高度相关的因子归成一类,类内先合成一个,避免重复押注同一个来源;因子多的时候用 PCA(主成分分析)或聚类来分类。
再合成,有两条路:
- 手工加权:先按 IC、ICIR、多空收益筛一遍,再定权重。等权最稳;IC 加权按历史 IC 给权重;风险平价、最大分散化、最大化夏普要估因子之间的协方差,样本外容易不稳
- 模型合成:因子当特征、前瞻收益当标签,让模型直接学权重。Ridge、Lasso 是线性的,自带筛选,Lasso 会把没用的因子系数压到 0;LightGBM 这类树模型能抓非线性和因子之间的交互,也更容易过拟合,必须留出验证段
打分变持仓
- 选股:按 Alpha 排序,买前 N 名或最高一档,等权或按分数加权
- 优化:最大化预期 Alpha,减去风险和交易成本,再加约束:行业和风格暴露为零(中性化)、单票权重上限、换手上限
- 风险模型:优化要用到股票之间的协方差,几千只股票直接估不可行。Barra 这类风险模型用少数几个风格和行业因子来近似,这是它在这里的用处
例子:科技三杰指数增强
- 范围:申万一级通信、电子、计算机三个行业,539 只股票
- 七个因子:创新(研发费用,市值中性)、盈利(单季度 ROE)、成长(净利润同比增长)、估值(EP)、规模(流通市值)、流动性(月换手)、技术(1 月反转)
- 合成:每个因子在全名单里排名,名次 ÷ 总数,七个相加,等权
- 用法:看好科技板块时,用它代替直接买行业指数
- 来源:广发证券《多因子 Alpha 系列报告之(四十)》
市场中性策略(Market Neutral)
用两个或多个相关资产构建,对冲掉市场波动。
什么是中性策略
- 股票组合多头 = 主动选股(α)+ 市场波动(β)
- 股指期货空头 = 市场波动(β)
- 两者相减:(α + β) - β = 投资收益(α)
回测
回测假设
指标好不好看,先看是在什么假设下跑出来的。
- 成交:当根 bar 收盘产生信号,按这根 bar 的 close 成交,不单独模拟滑点
- 成本:每笔按成交额扣一个固定比例,手续费加滑点合计约 0.03%,开仓、平仓各扣一次;永续合约逐小时结算资金费
- 预热:正式区间之前多载一段历史,给因子算窗口,预热期不计收益
- 幸存者偏差:已退市的标的保留到它最后一根 bar
- 基准:等权持有同一个标的池,每根 bar 再平衡,不扣成本
评价标准
收益
- 总收益:期末权益 ÷ 初始权益 − 1,已扣成本
- 年化收益:(期末权益 ÷ 初始权益)^(365 ÷ 天数) − 1。加密市场 7×24,按自然日折算;A 股按 252 个交易日
- 基准收益:同期等权持有标的池的收益,策略至少要跑赢它
- 月度收益:每月末权益对上月末的涨跌,看收益是不是集中在某几个月
风险
- 最大回撤:净值从历史最高点回落的最大幅度。初始权益也算一个高点,首日亏损同样计入
- 夏普比率:日收益均值 ÷ 日收益标准差 × √365,无风险利率按 0
- 平均多头、空头敞口:策略实际押了多少方向。多空相抵接近 0,才算市场中性
成本
- 手续费拖累:累计手续费占初始权益的比例
- 资金费拖累:累计资金费占初始权益的比例,多头付、空头收
- 两项单独列出来,才看得出毛收益是不是被换手吃掉了
交易统计
- 成交笔数:笔数太少,一两笔就能改变结果
- 胜率:盈利的平仓笔数 ÷ 有盈亏的平仓笔数,开仓成交不计入
还可以自己补的:信息比率、Beta、盈亏比、平均持仓时间。
图形与记录
- 净值曲线,叠加基准
- 月度收益表
- 多空敞口曲线
- 成交记录:时间、标的、方向、价格、数量、单笔盈亏
归因分析
把收益和风险拆开,看钱到底是从哪来的:风险归因、收益归因、行业贡献、风格贡献。常用的尺子是 Fama-French 多因子模型:把组合收益对市场、规模、价值等因子回归,剩下的截距才是真 Alpha。
稳健性测试
- 参数敏感性:参数稍微变一下,结果不应该大幅变化
- 样本外测试
- 不同市场环境:牛市、熊市、震荡市分别看
- 数据扰动:给输入加一点噪声,看结论是否还成立
注意量化的陷阱
- 幸存者偏差(Survivorship Bias):只用活下来的股票回测
- 前视偏差(Look-ahead Bias),也叫未来函数:用了当时还拿不到的数据
- 后视偏差:带着对历史行情的认知去设计策略
- 过拟合(Overfitting)
- 认知偏差:回撤来临时扛不住压力
这个问题也许会击碎很多人的美梦。无论是小波分析还是经验模态分解(Empirical Mode Decomposition,EMD)这些在工程上行之有效的降噪方法,应用在时间序列中都会存在“端点效应”,也就是说这些方法对最近的趋势判断是有问题的,并不能用来指导策略交易。这个问题可以延伸到一些其他的技术,比如z-score标准化,利用隐马尔可夫模型(Hidden Markov Model,HMM)测算当前市场状态等。它们的共同特征是新的市场数据会导致模型历史状态发生变化。也就是说,所有全局优化的滤波技巧都会存在这个问题,本质上它是过度拟合的一种。
策略分类
先按信号的形状分:因子是每期给每只股票打一个分,事件是某些股票、某些时点触发,择时是一个标的决定什么时候进出。另外是套利和高频。
因子策略
AH 溢价选股(价值)
- A 股价格 ÷(H 股价格 × 汇率),溢价最小的买入
- 同一家公司在两个市场的相对贵贱
北上优质机构选股(资金与情绪:跟着聪明钱)
- 先选出历史表现最好的托管机构,再买它们增仓的股票
- 来源:开源证券《量化评论系列(7):从托管机构细窥》
北向个股(资金与情绪)
- 因子值:每日北向流入 ÷ 流通市值
- 也可以当事件用:超过 x%(如 0.25%),或超过近期均值 + n 倍标准差就触发
散户反买(资金与情绪:反着散户)
- 散户净买入越多,后续表现越差,反着做
雪球热门(情绪)
- 讨论热度高的股票往往已经涨过,通常反着用
事件驱动策略(Event-driven)
事件只在某些股票、某些时点触发。想放进多因子模型,就把它改造成因子:触发当天记 1,之后几天逐渐衰减到 0。
分析师评级(预期修正)
- 信号:调高评级最强;其次是 n 家机构同时给买入、隔一段时间后首次覆盖、目标价远高于现价、历史收益高的资深分析师给出评级
- 执行:报告上调评级后,下个交易日买入,资金分 2 份,持有 2 天
机构调研(资金与情绪)
- 调研日期和公告发布日期只差 1 天,信息还新
- 有历史超额好的基金公司参与
- 按市值排序买 2 只,资金分 2 份,持有 2 天
公告事件
- 业绩增长:预期修正,业绩公告后股价还会持续漂移,即 PEAD(盈余公告后漂移)
- 高管增持:内部人信号
- 指数调仓:被动资金被迫买卖,流动性冲击
- 合并重组
择时策略
北向指数
- 北向净流入大于 x 元看多,否则平仓
- 回测年化 20%,回撤 20%
- 只决定进出,不选股
高频交易策略(HFT)
套利策略(Arbitrage)
- 硬搬砖
- 软搬砖(跨市对冲套利)
- 三角套利(跨品种套利)
- 两品种价差回归
- 期现套利
- 跨期套利
- 资金费率套利