1. 为什么一个交易了八年的老手把“道法术器势”挂嘴边
先交代一下背景,我从15年开始接触A股,前几年基本是纯手工做,中间交过不少学费,也踩过那种“看对了方向但拿不住单”的经典大坑。后来转量化,一开始就是写点简单的均线策略,用Excel复盘,用网上找的tushare接口拉数据,再后来上了聚宽、掘金这类平台,最后因为要走更复杂的机器学习模型和更自定义的回测逻辑,我逐渐把整个研究环境迁移到了纯Python本地,并重度使用微软开源的qlib框架做因子和模型训练。所以这篇文章想聊的东西,不是教科书式的量化教程,而是我这么多年在A股实战里,把“道法术器势”这个框架套到量化交易上之后,突然觉得很多之前零散的经验都能对号入座了。
为什么要用“道法术器势”来说量化交易?因为做量化的人特别容易陷入一个误区——今天学了个新因子,明天调了个新参数,后天看到知乎上说某个模型能跑出年化50%,于是整天忙着堆料。但真正的实战,不是靠一两个花哨指标就能活下来的,它是一套从理念到执行再到迭代的完整体系。用“道法术器势”来拆,刚好能把顶层认知、中层方法论、底层工具、落地招式、市场时势这五个维度串起来。任何一个环节掉链子,资金曲线都会给你脸色看。
这篇文章适合谁看?我觉得适合两类人。一类是刚开始做量化、被各种广告和课程忽悠得有点上头的新手,我希望帮你把“量化交易到底在做什么”这件事想清楚,少走弯路。另一类是已经有一套策略在跑、但是收益不稳定、回撤经常突破心理底线的实践者,你可以对照“道法术器势”的每个层面检查一下,看自己的体系到底哪里漏了风。
下面正式进入正题。我按照“道、法、术、器、势”五个层级逐个拆,每个部分都会结合A股的实际行情规则、Python代码实践,以及我这几年踩过的坑来讲。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 道与法:先搞清楚A股市场里钱从哪来,再谈策略体系
2.1 道的层面:量化交易赚的是谁的钱,凭什么赚
“道”这个东西听起来玄,但落到交易上就一个问题:你的策略凭什么赚钱?如果这个问题答不上来,后面所有参数调优都是无根之木。
A股市场里,钱的来源无非几个方向。第一,赚公司业绩增长和估值修复的钱,这是基本面投资的逻辑,量化里对应的就是基本面因子,比如盈利质量、ROE改善、分析师预期调整。第二,赚其他市场参与者非理性行为的钱,比如散户追涨杀跌、过度反应、处置效应,量化里对应的是反转因子、情绪因子、资金流因子。第三,赚流动性和制度摩擦的钱,比如T+1制度下的隔夜收益、涨跌停板附近的动量效应、打新和套利策略,这些都是A股相对别的市场更特殊的地方。
我见过很多新手的认知误区是,以为量化就是一劳永逸的印钞机,跑个回测年化就稳了。但实际上,每一块钱的超额收益背后,都有某个对手盘的错误在买单。你赚的是别人因为情绪、因为信息滞后、因为执行粗糙而错配的钱。所以做任何因子之前,先问问自己:这个信号捕捉的是哪一类市场无效性?如果说不清楚,那大概率是数据挖掘中的偶然,不是真alpha。
还有一个特别重要的道层面问题,就是你对收益来源的选择决定了你能容纳的资金量和策略寿命。高频做市可以赚微观结构钱,但容量极小且设备门槛高;基本面量化可以赚中长线定价错误,容量大但周期长、回撤看着憋屈。A股散户占比高、换手率大,行为金融类的因子在一定阶段表现极其亮眼,但随着量化私募规模增大、同质化交易增多,这类因子的拥挤度也在快速上升。所以我现在的观点是,道层面的正确姿势不是找到一个永远有效的圣杯,而是“多策略、多频率、多收益来源”的组合,每一个子策略的资金容量和逻辑前提都必须清晰。
2.2 法的层面:从研究假设到回测验证,搭建策略闭环
“法”是方法论,是把道落到地面的中间层。在量化交易里,法就是一套严谨的策略开发流程。我建议所有人都建立下面这个闭环,可以少采很多坑。
第一步,提出可证伪的假设。比如你观察到一个现象:“A股市场上,前期跌幅巨大的股票,在接下来一个月内有反弹倾向。”这就可以成为一个反转因子的候选假设。注意,这个假设需要包含明确的时间周期、股票池、预测目标和逻辑依据。
第二步,数据清洗和因子计算。用Python的pandas、numpy对行情数据和财务数据进行对齐,剔除ST、次新股和停牌股票,计算你定义的因子值。举个例子,20日反转因子就是过去20天的累计收益率,代码可以这样写:
python复制import pandas as pd
def momentum_factor(close: pd.DataFrame, window: int = 20) -> pd.DataFrame:
# close是股票收盘价DataFrame,行是日期,列是股票代码
return close / close.shift(window) - 1
def reverse_factor(close: pd.DataFrame, window: int = 20) -> pd.DataFrame:
# 反转因子是动量的负值
return -(close / close.shift(window) - 1)
第三步,分层回测和IC分析。把因子值按每日排序分成10层,看最高层和最低层的未来收益差异是否单调;同时计算IC(信息系数,即因子值与下期收益的相关系数)的均值、标准差和ICIR(IC均值除以IC标准差)。注意,单看因子年化收益没有意义,一定要看稳定性。
第四步,构建组合并进行样本外测试。我见过太多人长期在训练集上原地打转,调参调到过拟合。正确的做法是把数据按时间切分,比如前70%做因子挖掘和参数选择,中间15%做验证集防止过拟合,最后15%做样本外测试,并且测试期间尽量不要再去调整任何参数。这一步非常考验纪律。
第五步,风控约束和成本模型。法这个层面大多数人最容易忽略的就是交易成本。A股的印花税是卖出收取千分之0.5,加上佣金最低万1到万3,再加上滑点,每次单边换手成本至少在0.15%到0.3%之间。如果策略月度双边换手率达到300%,光成本就吃掉大约1%收益。所以你的因子收益必须把成本扣完之后还能显著覆盖,否则就是给券商打工。
“法”这个字,我特别想强调一点:它不是一个静态的流程,而是一个边跑边修正的闭环。回测曲线跑得再漂亮,也仅仅是过去某个时间段的一种可能产物。真正强大的法是让整个流程具备快速迭代和错误纠正的能力,而不是把某一次的研究成果当成长期饭票。
3. 术的层面:从因子到信号,A股执行细节里的那些坑
3.1 A股特有的规则约束,直接改变策略的写法
“术”是具体的操作技巧和信号构造方法。在A股做量化,首先要记住,很多海外成熟的量化策略不能直接照搬,原因就是A股有一堆独特的交易规则。
第一,T+1制度。今天买入的股票明天才能卖出。这就意味着日内高频的策略逻辑在股票现货上根本施展不开,很多日内信号只能转为隔夜持仓信号。但这同时也创造了一些独特的机会,比如尾盘买入强势股博次日高开,就是典型的T+1制度下的搏击玩法。我做过一个尾盘动量策略,核心信号是收盘前半小时涨幅排名前20且成交额放大,逻辑是利用次日情绪惯性和散户跟风盘的推升。
第二,涨跌停板制度。股票涨跌幅限制是10%(创业板、科创板20%),这会影响信号的连续性和收益分布。比如一只股票连续涨停后,你看到的基本面利好已经被封单充分定价,但如果还想追进去,就面临买不进、次日可能低开的巨大风险。反过来,跌停板打开时的反转信号也是很多策略盯着的猎物。
第三,停牌和退市风险。A股的停牌比海外市场频繁,特别是在重大资产重组期间,一停就是三五个月,复牌后往往是连续补涨或补跌,这对组合的流动性管理和风险控制提出了很高要求。代码上必须做好停牌股的过滤,否则因子计算时会用错误的收益率污染信号。最简单的做法是,如果某只股票在观察窗口内停牌超过一定天数,就直接剔除或标记。
术的层面,我建议构建自己的因子库时要有明确的分类,我把它分成三大类:价量类因子(动量、反转、换手率、量价背离)、基本面类因子(盈利、成长、估值、分析师预期)、另类因子(股东户数变化、龙虎榜资金、融资融券余额变化)。但千万别迷信某一个大神级的因子组合能一招鲜吃遍天,真实的情况是每个因子都有它的生命周期,熟练的量化研究者会持续跟踪因子绩效的衰退情况。
3.2 换手、拆单和择时:执行端决定理论收益和实际收益的差距
一个策略从回测到实盘,术的层面里杀机最重的是执行环节。回测里你是神,可以按收盘价瞬间成交、无限制地买卖。实盘里你面对的是一堆和你抢跑的交易者,还有冲击成本、大单不成交、打板排队等真实问题。
先说换手控制。高换手因子在回测里经常表现不错,因为捕捉的是短期行为偏差,但换成真金白银之后,成本和滑点会让净值曲线明显钝化。我自己的习惯是,在优化目标函数里直接加入换手率惩罚项,让优化器自动在信号强度和交易成本之间找平衡。比如日度调仓的策略,我会设定组合调仓时只在信号变化超过某个阈值时才触发交易。
python复制import numpy as np
def turnover_penalty(weights_new, weights_old, cost_rate=0.001):
# weights是股票权重向量
turnover = np.abs(weights_new - weights_old).sum()
return turnover * cost_rate
再说拆单。如果你管理的资金规模到了一千万以上,某些小盘股的日成交额可能也就两三千万,你一次砸进去五百万,本身就是在给市场发送信号。实务上做大单交易普遍用时间加权平均价格算法(TWAP)或者成交量加权平均价格算法(VWAP)把单子拆成几十笔,在一天内分批执行,减少对市场价格的冲击。
最后说择时。有些读者可能觉得量化不需要择时,全靠选股。但在A股,不做择时的纯多头策略,波动率大得你根本扛不住。我见过一些实盘账户,选股逻辑没问题,但因为全程满仓,2018年那种单边下跌行情里直接浮亏40%,心态崩了之后把策略停了,等行情反转又不敢上,完美错过回本。所以术的层面,我强烈建议加入一个中低频的市场状态过滤器,比如大盘均线之上才允许开仓,均线之下只保留三成以内仓位,甚至空仓等待。
4. 器的落地:Python+Qlib策略代码的实战演算
4.1 为什么我选择了Python+Qlib这套技术栈
“器”是工具和技术栈,它是把道法术真正落地成可执行代码的底座。工欲善其事,必先利其器,这句话放在量化里一点不夸张。每家量化机构的器可能完全不同——有人用聚宽、米筐这类在线平台,有人用自己开发的C++回测系统,有人用Python加开源框架。我的经验是,如果你要做真正深度的策略研发,尤其涉及机器学习和复杂因子组合,自建一套基于Python的开源技术栈是性价比最高的路径。
选Python的原因不用多说,生态太全了:pandas做数据处理、numpy做数值计算、scikit-learn和lightgbm做机器学习、matplotlib和plotly做可视化。而选qlib作为主框架,是因为它能解决我在自研过程中最头疼的几个问题:数据统一管理、特征工程自动化、模型训练与评估一体化。
qlib是微软开源的一个AI量化投资平台,它的核心设计理念是“数据层-表达式层-模型层-策略层”四层分离。数据层提供了从日线到分钟线、从行情到财务的标准化存储格式,你不再需要自己写一大堆SQL去拼接数据;表达式层支持类似SQL的因子表达式,可以非常快速地计算几百个技术指标;模型层内置了LightGBM、GRU、Transformer等常用模型,也支持自定义模型;策略层则负责根据模型预测生成持仓和交易信号。
这里我给出一个用qlib实现简单Alpha158因子集加LightGBM模型,进行滚动训练和回测评估的示例代码骨架,方便大家感受这个框架的用法。
python复制import qlib
from qlib.data import D
from qlib.data.dataset import DatasetH
from qlib.data.dataset.handler import Alpha158
from qlib.model.trainer import TrainerR
from qlib.workflow import R
from qlib.workflow.record_temp import SignalRecord, SigAnaRecord
# 初始化qlib,指定数据存放目录和A股市场
provider_uri = "~/.qlib/qlib_data/cn_data"
qlib.init(provider_uri=provider_uri, region=CN)
# 定义训练窗口
train_period = ("2015-01-01", "2019-12-31")
valid_period = ("2020-01-01", "2020-12-31")
test_period = ("2021-01-01", "2022-12-31")
# Alpha158特征处理器,自动生成158个基础因子
handler = Alpha158(instruments="csi300", start_time=train_period[0], end_time=test_period[1])
# 构建数据集
dataset = DatasetH(handler=handler, segments={"train": train_period, "valid": valid_period, "test": test_period})
# 配置LightGBM模型
import lightgbm as lgb
model = lgb.LGBMRegressor(
n_estimators=1000,
learning_rate=0.02,
num_leaves=64,
colsample_bytree=0.8,
subsample=0.8,
subsample_freq=1,
min_child_samples=20,
)
# 训练和保存模型
with R.start(experiment_name="lgb_alpha158_demo"):
recorder = R.get_recorder()
trainer = TrainerR(model=model, dataset=dataset, recorder=recorder)
trainer.train()
这套代码跑通之后,qlib会自动生成预测信号和回测绩效记录。实际操作中你可以用 SignalRecord 把模型的预测结果保存下来,再用 SigAnaRecord 做IC分析。
4.2 选器时的三个关键陷阱:数据质量、过拟合和框架锁定
选器落地的时候,我踩过三个大坑,值得单独拿出来说。
第一个坑是数据质量。很多人一开始找数据源,用的是一些免费接口,拉下来的数据缺失值特别多,前复权和后复权处理混乱,分红送配信息不全。用这种脏数据跑出来的因子,经常出现“回测极好、实盘拉胯”的情况。我现在的数据管线是日线数据用qlib的官方数据源做基础,再结合上市公司财报季报手工核对关键数据点;分钟级数据则另购商业数据。不要吝啬数据上的投入,你在数据上省的钱,最终都会从回测和实盘的偏差里加倍还回去。
第二个坑是过拟合。qlib提供了很高自由度的特征工程和模型选择,但越是自由度高的框架,越容易诱导你不断调参。我的应对办法是,对每一个参数组合只做一次样本外测试,并且把测试结果封存在实验管理记录里。如果反复用同一个样本外数据集测试不同参数,那么样本外最终也会变成你的训练信息,失去评估意义。
第三个坑是框架锁定。qlib虽然强大,但它并不是所有场景的最优解。比如当你需要处理一些极细粒度的逐笔委托数据、或者需要与实盘柜台接口深度联动时,qlib默认的流程可能不够灵活。所以我的架构是“核心引擎自研+Pandas处理中间层+qlib用于研究和训练”,保持数据和策略逻辑的模块化,避免被单一框架绑架。器的核心原则是让工具服务于研究,而不是研究被工具牵着走。
5. 势的研判:市场环境在变,模型必须跟着变
5.1 市场风格轮动是一种常态,不是意外事件
“势”是整个体系的最高变量,也是我最想提醒大家重视的一层。A股市场最大的确定性就是风格轮动的不确定性。2017年是核心资产蓝筹牛市,一堆基本面多因子策略表现神勇;2019年到2020年成长赛道股大放异彩,新能源、半导体产业链走出主升浪;2021年之后量化小市值和微盘股策略异军突起,中证1000和国证2000的活跃度大幅提升;再到现在,市场审美又在不断切换。
很多策略失效,不是你写代码写错了,也不是因子逻辑突然不成立,而是“势”变了。比如动量类策略,在单边趋势明显的行情里如鱼得水,一旦进入震荡市就会频繁被打脸;低估值价值类策略,在宽松货币周期里不容易跑赢成长,但当市场转向防御时又会重新被关注。
所以策略监控的第一件事,不是每天盯着收益曲线,而是要建立一套“市场环境标签系统”。我给自己的实盘系统设定了几个维度的环境指标:宽基指数趋势状态(均线之上还是之下)、市场波动率水平(用20日年化波动率衡量)、行业集中度(前五行业成交额占比)、横截面动量离散度(个股收益的分化程度)。每个交易日收盘后自动计算这些指标,并用简单规则给出当前市场状态的综合评分:进攻型、防守型、中性型。
5.2 策略生命周期管理和模型的持续校准
意识到“势”会变之后,策略怎么做持续更新?这里我分享一套自己执行了很多年的生命周期管理方法。
一个策略从上线到退役,大致会经历三个阶段:早期验证期、稳定盈利期、绩效衰退期。早期验证期通常是上线后的前三个月,这段时期策略的实际表现和回测往往存在偏差,需要密切注意但不要急着下结论;稳定盈利期是策略与市场环境比较匹配的阶段,超额收益持续为正且回撤可控;绩效衰退期则表现为超额收益下行、回撤频发、因子拥挤度极高。这三个阶段没有明确的时间标准,有的策略能稳定跑两年以上,有的可能三个月就走完一个周期。
我自己的操作习惯是给每个策略建立三道防线。第一道防线是日度监控,关注当日实际收益和模型预测收益的差异,如果出现异常偏离,立刻检查是数据问题还是因子失效。第二道防线是周度复盘,统计本周策略的IC均值、换手率、持仓集中度,与历史同期做对比。第三道防线是月度评估,用滚动12个月的窗口计算策略的夏普比率、卡玛比率(年化收益除以最大回撤)和超额收益稳定性,如果连续三个月排名掉出历史前30%,就启动策略降仓或暂停流程。
在模型校准上,我现在倾向于用滚动再训练的方式取代一次性训练长期不动。比如LightGBM模型每个月重新训练一次,训练数据窗口为过去36个月,这样模型可以自动适应市场风格的变化,不需要手动频繁调整参数。滚动训练也引入一个风险,就是模型会在过度适应近期行情和保持长期稳定性之间摇摆,所以我在损失函数里会对预测变化幅度做一定约束,防止模型每月输出信号发生剧烈跳变。
“势”这一层的本质,是承认市场是复杂适应性系统,没有任何模型可以永久战胜它。但同样重要的是,这不代表我们什么都做不了,而是要保持系统的敏捷度,像冲浪一样,顺着势的节奏不断调整站姿。判断势的方法和能力本身,就是一个量化研究员最大的护城河之一。
6. 回测与实盘的最后一公里:我在实战里踩过的那些坑
6.1 回测绩效与实盘差距最大的三个原因
我知道很多读者看到这里,最想问的一个问题可能是:“你说得头头是道,那回测和实盘到底差了多远?”这个话题我必须单独拿一章出来说,因为即使前面道法术器势都拆得明明白白,最后一公里执行不上,一切都是零。
我自己的经验,回测收益和实盘收益之间的差距,通常来自三个地方。
第一是成本模型过于乐观。回测里常见的默认设置是双边千分之二的佣金加印花税,滑点设一个固定值。但实际交易中,特别是你的单子稍微大一点,滑点会根据市场深度动态变化。比如你在涨停板上挂单买入,成交价可能比收盘价高出一两个百分点;在跌停板上卖出,可能根本卖不出去。我后来做回测时会把最坏情况的滑点成本压测一遍,如果策略在滑点放大三倍的情况下依然有正期望,再考虑上实盘。
第二是信号延迟。回测时,你用的是当天的日线数据,然后假设收盘时就能按收盘价成交。但实盘中,日线数据的最终确认要等收盘后,你只能在第二天开盘时段执行。这个一天的延迟对短期因子影响很大。很多日频策略回测很漂亮,但做成次日开盘执行后,收益直接腰斩。解决思路是尽量采用盘中实时数据驱动信号,或者在回测时强制引入“未来一天执行”的模拟。
第三是心理和执行一致性。这个听起来不像技术问题,但破坏力最大。实盘遇到连续几天浮亏,你是不是敢继续按信号加仓?遇到模型给出一个和你主观判断完全相反的卖出信号,你是不是能毫不犹豫地执行?我在2019年曾经因为自己主观觉得某只票会涨,在模型发出卖出信号后坚持多拿了两天,结果第三天直接吃了两个跌停。从那以后我给自己立了一个规矩:实盘交易必须全自动化执行,除非系统出现故障,否则人工永远不干预。
6.2 实盘系统的模块化设计:从信号到订单的路由
为了避免最后一公里掉链子,我建议所有想认真做量化的朋友,都要搭建一个模块清晰的实盘交易系统。不要用单文件脚本到处打补丁,那样后期维护会崩溃。
我的实盘系统大致分成五个模块。数据采集模块负责每天收盘后自动拉取行情、财务和高频数据,并做清洗和入库。信号生成模块定时运行策略代码,读取最新数据,计算因子,输出目标持仓权重。风控模块检查目标权重是否超过单票持仓上限、行业暴露是否超限、总仓位是否符合当前市场环境评分。交易执行模块把目标权重与当前持仓做对比,生成买卖列表,通过券商的量化交易接口实现自动下单。最后是监控告警模块,记录所有成交和报单信息,当出现下单失败、净值回撤超过阈值等情况时,自动推送告警。
这几个模块之间通过消息队列或文件接口解耦,任何一个模块崩溃都不会影响其他模块运行。实盘系统本身不追求花哨,追求的是稳定、可观测、可回滚。新策略上线前,我会先在模拟盘跑一个月,确认数据流和交易流都正常之后,再以最小资金量实盘运行,逐步放大仓位。
7. 最后想说的:量化交易是一场没有终点的修炼
写到这里,这篇文章的骨架已经完整了。但如果让我提炼最核心的一句话,我会说:量化交易不是买了软件、跑了回测就能躺着赚钱的事情,它是一场把认知、方法、工具和执行持续打磨的修炼。
用“道法术器势”这个框架来复盘我自己的成长路径,特别清晰。最开始我只关注“术”和“器”,拼命找指标、学代码,以为掌握了神奇的买卖点就能稳定盈利。后来发现问题出在“法”上,没有一套科学的研究流程,所有的策略都是拍脑袋。再往后,我开始思考“道”,明白了每一笔收益都必须有明确的来源和退路。这几年,我则越来越敬畏“势”,明白了市场环境的变化比任何策略都更有力量。
如果你正在做自己的第一版策略,我给你的建议是:先把“道”想清楚,选择一两个逻辑过硬的因子类型;把“法”落实成标准化的研究流程,每一次实验都有记录有总结;把“术”打磨到连成本和滑点都计算得清清楚楚;把“器”搭建得稳定可靠,不追求复杂炫技;最后保持对“势”的敏感,每隔一段时间就重新审视自己的系统。这条路没有终点,但每往前走一步,都会比昨天更稳一点。
仅以此文,与在量化这条路上同行的各位共勉。
