1. 我为什么用“道法术器势”来理解量化交易
先坦白一句:我接触量化交易的前两年,基本是在工具和代码里打转。今天学一个回测框架,明天研究一个因子库,后天又去追某个大V的策略代码,电脑里存了一堆“Python量化交易策略代码”,但真正落到实盘的时候,账户曲线还是很难看。后来我停下来认真复盘,才意识到问题不在代码,而在认知。我缺的不是某个“器”,而是一整套把量化交易从理念到执行串起来的框架。
后来我读到传统智慧里的“道、法、术、器、势”五个字,忽然觉得这套框架用来拆解量化交易,意外地贴切。很多人一提量化,第一反应就是“写代码”“搞模型”“上服务器”,这其实是把量化窄化成了“术”和“器”。真正决定一个量化策略能不能持续赚钱的,往往是更底层的“道”和“法”,以及更外部的“势”。
在这篇文章里,我会把量化交易拆成这五个层面来聊,并且结合A股市场的具体环境,讲清楚每一层到底要解决什么问题、有哪些常见坑、以及我个人的实操经验。如果你是一个想系统学习量化、但又被碎片化信息搞得很迷茫的人,这篇文章会帮你搭起一个相对完整的地图。哪怕你目前还处于“量化交易从入门到精通PDF下载了十本但一本都没看完”的阶段,这张地图也能告诉你:你该先看哪本书、先跑哪段代码、先避开哪个坑。
先说结论性的一句话:量化交易不是一套软件,也不是一组策略代码,而是一套用规则和概率代替情绪和直觉的决策系统。道是方向,法是规则,术是动作,器是装备,势是时机。五者缺一不可,顺序也不能乱。
2. “道”:先想清楚收益率从哪里来,再谈模型
2.1 A股市场给了量化交易什么样的底牌
“道”这个字听起来玄,但放在量化交易里其实就是一句话:你凭什么相信自己的策略能赚钱?如果你回答不上来这个问题,后面的一切都是空中楼阁。
很多人觉得量化交易的神秘感来自复杂数学和高速服务器。不可否认,像西蒙斯的大奖章基金确实是用数学家、物理学家和计算机专家堆出来的,但他的成功本质上不是来自数学本身,而是来自一个朴素的信仰:市场不是完全有效的,人类行为中的非理性会反复制造定价偏差,而这些偏差可以用数据和统计方法捕捉。西蒙斯当年不招华尔街出身的金融分析师,反而招语言学家和天体物理学家,就是因为他要的不是“市场直觉”,而是“从数据中找规律”的方法论。
A股市场给了量化交易非常肥沃的土壤。A股散户交易占比长期高企,行为偏差(比如追涨杀跌、处置效应、过度交易)比成熟市场严重得多。这些行为偏差会在股票价格上留下痕迹,表现为动量、反转、换手率异常、波动率聚集等规律。量化交易要做的,就是像猎人一样识别这些痕迹,并且用统计检验确认它们不是随机噪声。
举个简单的例子。A股长期存在显著的反转效应:过去20个交易日涨幅过大的股票,未来10个交易日往往跑输;过去跌幅过大的股票,未来反而容易反弹。这种效应在机构主导的美股市场远不如A股明显,因为它本质上是散户过度反应的结果。一个人看到一只股票连涨几天就忍不住追进去,把价格推到了不合理的高度,接下来的回归就是大概率事件。量化交易要做的,就是不带感情地在人群贪婪时卖出,在恐慌时买入。
2.2 量化交易的目标不是“胜率”,而是“期望”
在“道”的层面,还有一个必须想清楚的问题:你到底在赚什么钱?是赚预测精准的钱,还是赚统计优势的钱?
我遇到过很多新手,看回测报告首先看胜率,觉得胜率低于50%的策略就不是好策略。这其实是个很大的误区。量化交易真正关心的是期望值——每笔交易的平均盈亏。一个胜率只有40%的策略,如果亏损时只亏1个点、盈利时能赚3个点,期望值依然是正的。反之,一个胜率70%的策略,如果亏一次就亏掉之前赚的五次,照样能让账户归零。
这里顺带说一下A股特有的制度背景:T+1限制、涨跌停制度、印花税和过户费。这些制度意味着同样的策略逻辑,在A股和在其他市场执行起来,成本和风险结构完全不同。比如T+1决定了你当天买入的股票不能当天卖出,这对高频策略的落地是一个巨大限制;涨跌停决定了极端行情下你可能买不进也卖不出,流动性和滑点风险比成熟市场大得多。所以凡是把海外的策略代码原封不动搬到A股的,绝大多数都会水土不服。
“道”层面的结论是:你要清楚你赚的是哪一类行为偏差的钱,并且知道这个偏差在A股的历史上有过长期、稳定的统计证据。想不清楚这件事,你只是在一堆代码里碰运气。
3. “法”:策略体系、风控框架与状态决策逻辑
3.1 策略的分类与选型:先定赛道,再谈参数
“法”是方法论层面,解决的是“用什么规则来组织你的交易”的问题。写策略代码之前,你得先决定自己的策略主赛道。按收益来源分类,A股量化策略大致有这几类:
多因子选股策略是A股个人和机构最主流的方向。逻辑是用多个可量化的指标(估值、盈利、成长、换手率等)对全市场股票打分,买入得分高的组合、卖出或回避得分低的组合,赚的是截面定价偏差的钱。这类策略容量大、逻辑清晰、便于归因,适合大多数有基本数据处理能力的个人交易者。
动量/趋势策略赚的是时间序列上的延续性。A股市场在特定环境下有很强的趋势特征,比如放量突破、均线多头排列。这类策略在牛市或单边行情中容易大赚,但在震荡市中会被反复打脸,所以对“势”的判断要求更高。
事件驱动策略利用的是公告、停复牌、指数调样等事件前后的统计规律。这类策略拥挤度较高,信息衰减快,对数据获取的及时性要求很高。
统计套利策略在A股个人交易者中真正做起来的很少,因为需要相对复杂的数学模型,且收益空间被机构不断压缩。我见过很多个人交易者试图做可转债套利、ETF折溢价套利,最后发现手续费和滑点就把利润吃光了。
选赛道要结合自己的资源禀赋。如果你白天有本职工作、只能用晚上时间研究,那就别碰需要盘中高频盯盘的策略;如果你资金量不大,就尽量不要做需要分散到上百只股票的组合策略,因为一手一手的买卖会让交易成本占比变得很高。我给自己的定位是低频多因子选股,逻辑很简单:胜在可解释、可复盘、可持续改进。这是我吃过亏以后才慢慢确定的。
3.2 三层风控框架:从单票到组合到系统的防线
“法”的第二大内容,是风控规则。没有风控框架的策略,就像没有刹车的跑车。我见过太多人在回测里赚得盆满钵满,实盘遇到一次回撤就心态崩盘,然后手动干预,把一套规则化的系统彻底变成情绪化的赌局。
我的风控框架分三层,每一层都有硬性规则,任何情况下不允许突破:
第一层:单笔风险控制。任何一只股票占组合总仓位的比例不超过10%。这听起来保守,但能防止你因为某一笔重仓亏损而陷入被动。如果资金量太小、分散到10只股票有困难,那就要适当缩小股票池范围,而不是增加单票权重。
第二层:组合风险控制。限制行业暴露和风格暴露。比如你持仓的股票不能全部集中在同一行业,否则你表面上买了八只票,实际上等于只买了一个行业指数。我通常会设定单一行业占总仓位的比例不超过25%,同时控制组合整体的Beta暴露在0.8到1.2之间,避免在风格切换时出现不可控的回撤。
第三层:系统风险控制。设定账户级别的回撤熔断线。我的规则是:当组合从最近高点回撤达到15%时,强制降低仓位到五成以下;回撤达到25%时,清仓并停止交易两周,重新检查策略逻辑和数据。这个规则不是为了预测市场,而是为了强制自己从市场中抽离出来,避免陷入“越亏越加仓”的恶性循环。
3.3 把交易看作一个马尔可夫决策问题
“法”的第三个层次,是关于“如何做决策”的。现在很多做量化的朋友开始接触强化学习的思路,搜索“离散时间的马尔可夫决策过程(MDP)量化交易”的人越来越多。其实MDP在量化里的思想并不神秘,简单说就是把交易看作一个“状态—动作—奖励”的循环。
状态就是当前你观察到的市场信息,比如你持仓的市值、组合的估值水平、市场整体的换手率、你的可用资金;动作就是你现在能做的决策,买入、卖出、持有不动,以及各买多少、各卖多少;奖励就是动作发生后带来的收益,还要减去手续费、滑点和风险惩罚。强化学习要做的,就是通过大量历史数据,学到一个“在什么状态下采取什么动作能获得最大长期奖励”的策略。
我特意提MDP,是因为它给我一个很重要的启发:交易决策不是孤立的。你今天要不要调仓,不仅要看今天的信号,还要看当前处于什么状态、这一步动作会对未来状态产生什么影响。用MDP的视角看问题,你就不会为了一个好看的信号而频繁交易,因为你清楚每一次交易都在改变你的持仓状态,而新状态会影响下一步的决策空间。
把“法”层面的规则想清楚以后,你才算真正拥有了一个可以执行下去的交易系统。剩下的事情,才是具体的信号怎么算、代码怎么写。
4. “术”:从信号到执行的细节把控
4.1 因子构造:从原始数据到有效信号的必由之路
“术”是具体动作层面,是绝大多数人理解的“干货”。我们先从最核心的因子开始聊。
我日常做得最多的股票量化交易策略,是多因子选股。一个因子本质上就是一个用于区分股票好坏的数值化指标。传统的因子分为三类:基本面因子(市盈率、市净率、ROE、盈利增长率)、量价因子(换手率、波动率、过去N日收益、均线偏离度)、以及另类因子(舆情、分析师预期修正、资金流)。其中量价因子在A股的有效性往往强于基本面因子,这跟A股散户交易占比高、价格信号中包含着大量行为偏差有关。
我来举一个具体的反转因子构造过程,你可以照着在pandas里实现:
import pandas as pd # 假设 close_price 是 全市场股票日度收盘价,行为日期,列为股票代码 # 计算过去20日累计收益率 momentum_20d = close_price / close_price.shift(20) - 1 # 横截面标准化(按每一天对所有股票做z-score) factor_z = (momentum_20d - momentum_20d.mean(axis=1)) / momentum_20d.std(axis=1) # 剔除ST、停牌、上市不足60日的股票 # 按因子值排序,取最高分组作为“买入组”,最低分组作为“回避组”代码本身很简单,但真正决定因子有效性的不是代码,而是数据质量。做因子分析之前,必须处理四件事:复权价格(区分前复权还是后复权)、停牌状态(停牌股票不能正常交易,必须剔除或标记)、ST状态(ST股票的涨跌幅限制是5%,和普通股票完全不同)、上市不满一定期限的次新股(次新股的波动模式和其他股票差异很大)。我在早期做因子检验时,就是因为没有剔除次新股,导致因子在回测中表现极好、实盘却完全失效,后来发现是次新股的高波动把结果带偏了。
4.2 组合构建:加权、调仓与风险归因
有了因子得分之后,下一步是构建组合。最简单的方式是全市场选因子得分最高的前30只股票,等权买入,持有20个交易日后再调仓。等权听起来很土,但在A股中小市值股票上,等权组合的长期收益往往优于市值加权组合,因为它天然给“被市场忽略的股票”更多的权重,而这类股票恰恰是错误定价的高发区。
调仓频率是另一个关键参数。一个20日调仓的策略,每年大约调仓12次,每次调仓成本(手续费加滑点)假设为0.5%,全年成本大约6%。如果你把调仓频率提升到5日一次,成本会翻倍,除非策略的Alpha能明显覆盖这部分成本,否则就是在给券商打工。
组合构建还要做风险归因,这一点很多人会忽略。你的组合跑赢基准,到底是因为选股选得好,还是仅仅因为持仓偏向了小盘风格?如果你不想清楚这个问题,遇到小盘风格失效的时候,你会误以为是模型失效,其实只是风格暴露的惩罚。现在很多免费的工具和Python库可以帮你做风格归因,我建议每个月至少跑一次,看看自己的组合在市值、估值、动量这些维度上的暴露情况。
4.3 交易执行:细节里藏着真金白银
执行层面的“术”,往往被回测阶段忽略,但实盘中比信号本身更重要。我有一条铁律:回测里假设的交易成本是多少,实盘就按更保守的值来算。我见过太多“回测年化60%、实盘年化6%”的案例,原因就是回测里用了一个不切实际的成本假设。
具体到订单执行,有几个实操习惯可以分享:
- 尽量使用限价单,而不是市价单。市价单在流动性不足的股票上可能出现严重的滑点,限价单至少保证了成交价格不劣于你的心理价位。
- 避免在开盘前15分钟和收盘集合竞价阶段下单。这两个时段价格波动剧烈,买卖价差大,是散户情绪最集中的时候。我的调仓订单一般安排在上午10点以后和下午2点半之前。
- 估算单笔订单对市场冲击。如果你要买入的金额占该股票过去20个交易日平均日成交额的1%以上,流动性和冲击成本就需要特别警惕,可以考虑分多日建仓。
这些细节看起来都是小事,但量化交易本来就是由一个个小概率优势累积起来的。执行环节每多消耗一个千分点,你的夏普比率就会被切掉一块。很多“策略失效”的结论,其实不是策略失效了,而是执行磨损吃掉了Alpha。
5. “器”:Python量化工具链的选型与组合
5.1 从数据到实盘的四层工具架构
聊完“术”,我们来聊“器”——也就是你实际要用到的工具和代码。很多新手一上来就问“量化交易用什么软件”,其实这个问题的正确问法是“量化交易工具链应该怎么分层搭”。我的工具链分四层:数据层、研究层、回测层、实盘执行层。
数据层是一切的基础。A股日线数据比较常见的选择是免费的Tushare、AkShare,以及付费的Wind、Choice。如果说省心,付费终端确实省心,但个人交易者用免费数据起步完全没问题。关键是把数据清洗做好:复权因子、停牌标记、ST状态、退市整理期标记,这些字段缺一不可。我自己的做法是每天收盘后把全市场数据下载到本地,存成Parquet文件,按日期分区管理。
研究层通常是Python环境。pandas做数据处理,numpy做数值计算,matplotlib和seaborn做可视化,statsmodels做回归和统计检验,sklearn和LightGBM做机器学习模型。很多人喜欢一上来就上复杂的深度学习模型,我的建议是先把线性回归和树模型用熟,因为这些模型可解释性强,容易发现数据中的异常问题。
回测层有两种选择:向量化回测和事件驱动回测。向量化回测适合因子研究和低频策略,速度快、代码简单,用pandas基本就能实现。事件驱动回测模拟真实撮合逻辑,能更好地反映交易成本和资金占用,但代码复杂度和运行时间都会大幅上升。我的建议是:先用向量化回测做因子筛选,等到策略逻辑基本稳定后,再用事件驱动回测做最终验证。
实盘执行层,如果是A股股票,个人交易者目前比较友好的选择是QMT。QMT本身是一个量化交易终端,可以用Python编写策略并连接券商柜台下单,支持实盘和仿真交易,很多券商现在都能申请开通,尤其是针对有一定资金量的客户。对小白来说,QMT的一个好处是文档和社区案例相对完整,网上搜索“QMT量化交易小白入门”能找到很多实操教程。我的建议是先花两周时间把QMT的模拟盘跑通,把下单、撤单、持仓查询这些接口都调用一遍,再考虑上真实资金。
5.2 回测框架怎么选:自己写还是用现成的?
选回测框架是一个很容易纠结的地方。Backtrader在个人开发者中流行,功能全面但API风格偏老;vn.py是事件驱动框架的国内代表作,社区活跃,适合做交易系统整合;QMT自带回测模块,和实盘衔接最顺滑,但策略复杂程度高时调试不够灵活;还有一个思路是用像QuantConnect这样的云端平台,但A股数据支持有限,不太推荐作为主力。
如果你只是做日频多因子选股,我其实建议第一版回测引擎自己写,核心逻辑就是循环调仓日、按调仓信号买卖、扣除成本后记录净值。自己写的好处是你对每个细节都有掌控:复权怎么处理、涨跌停怎么判断、停牌股票怎么跳过、交易成本怎么扣。用现成框架时,这些细节往往是黑盒,一旦出了问题你很难发现。等你自己写的那版跑通了,再去学习成熟框架,一眼就能看懂它的设计思路。
我自己第一版回测代码只有三百行左右,用pandas实现,核心函数就三个:一个是计算因子打分,一个是按打分生成目标持仓,还有一个是模拟调仓并记录费用。这个简陋的回测引擎陪了我大半年,帮我验证了几十个因子,直到策略逻辑稳定之后,才迁移到QMT上去做仿真和实盘。
5.3 要不要用自动化任务和Web界面
关于“量化交易WebUI框架”,我个人的看法是:初期完全不必追求可视化界面。很多人花两周时间搭一个漂亮的Web面板,用来展示策略净值曲线和持仓仪表盘,但策略本身的逻辑还没有验证过,这属于本末倒置。
等策略稳定运行以后,如果你希望能随时查看账户和策略状态,再考虑搭一个简单的监控界面也不迟。轻量方案是用Python的Dash或者Streamlit,直接读数据库结合交易接口的数据,写一个几十行的页面就能展示当日持仓、收益曲线、风控指标。更稳妥的方案是直接使用QMT自带的界面和报表功能,先不引入额外的Web框架。工具永远是服务于策略的,不要为工具而工具。
6. “势”:什么时候该出手,什么时候该收手
6.1 每个策略都有它适应的市场环境
最后我来聊“势”。这是我原来最容易忽略、后来发现其实最要命的一层。量化策略不是永动机,每一个策略都有它的“适宜气候”。你在2021年小盘风格盛行的时候跑小市值因子,回测好看得不得了,但2022年之后风格切换,同类策略大雪崩,你不是策略变笨了,而是“势”变了。
判断“势”可以从几个角度入手。第一是市场风格指标。每月末统计全市场股票的市值大小分组收益差、价值成长分组收益差、动量反转分组收益差,可以直观看到当前市场处于什么风格环境。如果你的策略在小盘反转风格下收益突出,而当前市场连续几个月是大盘动量风格领先,那就要警惕策略处于逆风期。
第二是策略的净值特征。我会定期观察自己策略回测和实盘净值曲线的关键指标:卡玛比率(年化收益/最大回撤)、月度胜率、超额收益的月度分布。如果策略只在某几个月大涨、其他时间都在磨底,那说明收益来源高度依赖于特定市场环境,需要格外小心。
第三是拥挤度。一个因子的拥挤度越高,策略失效的风险越大。怎么判断拥挤?一个简单的方法是观察全市场股票在该因子上的收益率分布。如果某个因子近几个月十分位组间的收益差迅速缩小、甚至在多个月份失效,那说明这个因子已经被市场充分定价,也就是被“做烂”了。很多经典的A股小市值因子、次新因子都经历过这样的拥挤周期,最终有效性和容量大幅下降。
6.2 给“收手”设好硬阈值
“势”不好时要懂得收手。但收手不能靠感觉,要提前设定好规则。我给自己定了几条铁律:
- 策略回撤超过历史最大回撤的70%时,强制降仓并进入“观察模式”,此时只保留半仓以下运行。
- 策略连续3个月跑输基准且超额收益为负时,暂停实盘,回归研究和回测阶段,检查因子是否仍然有效。
- 市场整体出现极端行情(比如连续大面积跌停)时,无条件清仓等待情绪稳定。
这些规则写出来好像很普通,难的是执行。人的本性是贪婪和侥幸的,尤其当一个策略前几个月赚了很多钱的时候,你会倾向于相信“这次不一样”,市场只是暂时回调。可恰恰是这种时刻,纪律才是唯一的护身符。我在实盘前两年,有过一次因为不忍心止损而把年度利润全部回吐的惨痛教训。从那以后,我把“收手规则”打印出来贴在显示器边上,并且设置了程序级的熔断提醒,一旦满足条件就会收到告警推送,强制自己执行。
7. 新手最容易踩的四个坑,以及我的避坑心得
7.1 常见问题速查表
在陪伴很多朋友从零开始做股票量化交易的过程中,我发现有几个坑几乎是所有人都踩过的。我把它们整理成一个速查表,供你对照排查。
| 问题 | 典型表现 | 排查方法 | 避坑建议 |
|---|---|---|---|
| 过拟合 | 回测年化80%,实盘亏损 | 看训练集和测试集差异是否巨大;检查参数是否过多 | 参数尽量少;多做样本外测试和滚动训练 |
| 未来函数 | 回测曲线近乎一条直线 | 检查是否用到了当日收盘后才能知道的数据 | 所有信号必须用T日以前的数据计算,用T+1日开盘价成交 |
| 幸存者偏差 | 回测收益显著高于同策略公开排名 | 检查股票池是否包含了退市股、ST股 | 股票池必须包含已退市股票,否则回测严重失真 |
| 交易成本低估 | 回测和实盘净值曲线在半年后差距拉大 | 回测中设置千二以上总成本再测试 | 实盘前用保守成本跑一年仿真交易 |
7.2 我印象最深的一次“策略失效”
我印象最深的一次策略失效,发生在自己做动量因子测试的阶段。回测效果极好,三个月累计超额15%,我当时特别兴奋,觉得找到了一个会下金蛋的鸡。可一上实盘,两个月就亏了8%。我翻来覆去地查因子计算,最后发现一个特别低级的原因:我在计算动量因子时用了当日收盘价,但实际下单是在当天收盘后,也就是说信号和成交是同时发生的,这在实盘中根本做不到。所有数据里都混入了当日信息,导致回测被“作弊”了。
从那以后,我在把所有新策略加入实盘交易之前,强制自己跑一遍“未来函数审查”:把因子计算整体延后一天,即用T日及以前的数据计算因子,然后在T+1日以开盘价成交。延迟一天后,回测收益通常会下降不少,但只要还赚钱,实盘的样子就八九不离十。这个方法虽然老套,而且一点不性感,但它能拦住八成以上的假策略。
7.3 关于学习路径的一点建议
最后再说说学习路径。现在网上搜“量化交易从入门到精通”,能搜出一堆PDF文档和付费课程,但我建议你千万不要贪多。我自己的体会是,完整的量化交易体系不需要很多书,你只需要把三件事吃透就够了:Python数据处理,pandas必须熟练到不用查文档;概率统计,至少要懂均值、方差、正态分布、回归分析和显著性检验;策略回测的基本原理,知道什么是过拟合、什么是样本外测试、如何估计交易成本。这三件事能过关,你就有能力独立开发一个粗糙但真实可用的策略了。
在此基础上,再逐步了解QMT这类工具、马尔可夫决策过程这类更进阶的模型,以及更复杂的事件驱动回测框架。保持一个原则:学一个东西,一定要能落到代码和测试上,否则先放一放。我见过太多人收藏了无数本PDF、买了三门课程,却迟迟没有跑出第一张因子收益图——那不是学习,那是拖延。
道法术器势这五个字,放在量化交易里,刚好对应着认知、规则、动作、工具和时机。我在实盘操作中反复体会到的感受是:越到后面,越发现最重要的不是哪一段代码、哪一个因子,而是你愿不愿意遵守自己定下的规则,并且肯为认知的盲区不断交学费。希望这篇文章能帮你少交一点。