从 “道、法、术、器、势“ 看量化交易:A 股实战指南
这两年不断有人问我,量化交易到底靠不靠谱、普通人能不能做、该从哪里下手。问的人多了,我发现一个规律:大多数人的困惑不是缺代码能力,也不是缺资金,而是脑子里的框架是乱的。今天想做趋势跟踪,明天听人说高频套利赚钱,后天又觉得价值因子才是正道,最后连自己到底在赚什么钱都说不清楚。
我做了几年的A股量化实盘,踩过的坑比写过的策略还多。如果让我用一句话总结量化交易的本质,那就是:量化交易不是预测未来的水晶球,而是一套把投资逻辑变成可执行规则的工程系统。它解决的核心问题,不是“明天涨不涨”,而是“当你有了一个想法之后,如何用可重复、可验证、可控制风险的方式把它落地”。
这篇文章我想用“道、法、术、器、势”这五个层面,把量化交易这件事完整拆一遍。这个框架不是玄学,它其实非常实用——对应到实战里,“道”是你的投资哲学和收益来源,“法”是策略体系和风控规则,“术”是具体的因子构建和交易算法,“器”是工具链和数据基础设施,“势”是对市场环境的感知与应对。五层缺一不可,很多人只盯着“术”和“器”,结果就是把屠龙刀舞成了烧火棍。
1. “道”:先想清楚量化交易到底赚谁的钱
1.1 多数人亏钱不是因为代码烂,而是因为“道”没立住
我在接触大量想做量化的朋友之后发现,大家普遍有一层误解:只要代码写得好、回测曲线漂亮,就能稳定盈利。但实际上,策略曲线好看只是一个结果,背后真正起决定性作用的是你对市场的根本认知。
举个例子。有人写了一个简单的双均线策略,金叉买入、死叉卖出,回测过去三年年化收益20%,最大回撤8%。他兴奋地拿真金白银上实盘,结果连续两个月亏损,直接怀疑人生。问题出在哪?不是策略代码有bug——回测没问题——而是他没想清楚这个策略在“道”的层面赚的是什么钱:双均线的本质是捕捉趋势行情的趋势跟踪策略,它赚的是市场出现持续单边走势时“动量延续”的钱。如果市场长期处于震荡状态,这类策略天然会反复止损,实盘跑两个月亏损是完全符合逻辑的,而不是策略失效。
大多数人不肯接受的现实是:每种策略都有它的“不利期”,没有一种策略能在所有市场环境下赚钱。如果你在“道”的层面没有想清楚自己赚的是什么钱、要承受什么样的亏损、凭什么市场愿意把这笔钱给你,那你在“术”和“器”上花再多功夫,也只是在给一个错误的假设做精密包装。
1.2 “道”层面的三个问题:赚什么钱、拿什么钱、亏得起什么
我建议每个准备做量化的人,动手写第一行代码之前,先逼自己回答三个问题:
第一,这个策略赚的是哪类市场参与者的钱,或者哪类市场行为的钱?是赚价值回归的钱(股价偏离内在价值后回归)、赚情绪波动的钱(人群过度反应后的反向修正)、赚流动性的钱(为市场提供买卖对手方)、还是赚趋势延续的钱(动量效应在A股中的持续存在)?如果说不清楚,说明你还没有形成投资哲学。
第二,你用的资金是什么性质的钱?这是我在实战中见过最致命的分类错误。短期资金、随时可能要用的闲钱、长期可以锁定的资金,对应的策略选择完全不同。用短线资金去做需要扛3年回撤的价值策略,心理上根本扛不住;拿长期资金去做高换手的日内策略,手续费和滑点会把你磨死。
第三,你能承受的最大亏损边界在哪里?这个边界不仅是金钱上的,更是心理上的。回撤40%的理论收益再诱人,如果你在回撤20%时就会失眠、会手动干预策略,那这个策略就不属于你。量化交易的核心优势之一,是让你用规则代替情绪做决策。但如果你的资金性质和心理承受力撑不住策略所需的回撤,规则迟早会被情绪推翻。
1.3 “道”的落地:建立策略的收益来源档案
当你理清了上面三个问题,接下来要做一件非常具体的事:为每一个策略建立一份“收益来源档案”。里面至少包含这几项:
- 策略赚的到底是什么钱(一句话说明)
- 这套收益逻辑在什么市场环境下有效(利好环境)
- 在什么环境下会失效(恶劣环境)
- 历史上失效的最长持续时间和最大回撤(底线数据)
- 失效期的典型特征是什么(用来预警)
这份档案不需要多华丽,但对实盘决策极其关键。它能帮你在策略连亏三个月时判断:现在是暂时的“恶劣环境”还是策略逻辑本身被市场淘汰了。你不可能区分“坏运气”和“策略失效”,除非你在入场前就写清楚判断标准。
2. “法”:策略体系的骨架,决定了你能活多久
“道”解决的是方向和认知,而“法”解决的是系统性的规则构建。到这一层,我们要回答的是:用什么样的频率去做、选什么样的标的、配置多大的仓位、用什么规则控制风险。这四件事搞不定,哪怕你的因子再灵,资金曲线也走不出长期向上的趋势。
2.1 频率选择:先想明白你打算持有多久
我常和刚入门的朋友说,做量化第一件事不是跑策略,而是定频率。因为频率决定了你整个工程体系的设计难度——数据精度要求、交易成本占比、服务器响应时间、滑点敏感程度全都不一样。
我把自己的策略分成三档来分析:
低频策略(持仓周期数周至数月):这类策略通常是慢变量驱动的,比如估值修复、净利润增速变化、行业景气度轮动等。它对数据精度的要求不高,日线收盘数据基本够用,交易频率低,手续费和滑点占总收益的比例很低。但坏处是,策略逻辑的验证周期长,一个信号从触发到兑现可能需要几个月,迭代反馈慢。
中频策略(持仓周期数天至两周):这是我最喜欢的区间。它可以使用日线或60分钟线数据,决策信号可以来自技术指标、资金流、龙虎榜数据等。交易频率适中,换手率可控,反馈周期不至于太长,容错率也比高频好得多。A股T+1的制度下,中频策略的可行性最高。
高频策略(持仓周期秒级至分钟级):这就是大家常说的“量化收割机”,实际上对个人来说门槛极高。数据要Tick级甚至逐笔委托,服务器要离交易所近,交易通道要有优势,资金体量要大才摊得开成本。在A股普通散户的资金体量和交易权限下,我不建议个人一上来就做高频。别被媒体渲染的“量化巨头割韭菜”吓到,那是另一套生存规则。
2.2 标的池与选股规则
锁定频率之后,接下来要解决“在什么范围内做选择”的问题。A股有5000多只股票,不可能全部纳入候选池——也不用,因为大部分股票不具备流动性或基本面支撑。
我自己的做法是给标的池设置硬性过滤条件,作为所有策略的公共前置环节:
- 剔除ST和*ST类股票(规避非正常的涨跌停和流动性陷阱)
- 剔除上市不足60个交易日的次新股(次新股的波动规律非常不稳定)
- 剔除日均成交额低于1亿元的股票(避免进得去出不来的流动性风险)
- 如果有基本面偏好,叠加剔除净利润连续两年为负的公司
注意:标的池不是越宽越好,也不是越窄越好,关键是“规则一致”。如果每次换策略就重新换一批股票,回测和实盘的口径不一致,再漂亮的曲线都是自欺欺人。
2.3 仓位管理与风险控制法则
“法”这一层,我认为最核心的是仓位管理和风控规则。很多人做量化只盯着“何时买何时卖”,对“每次买多少”完全凭感觉,这是大忌。仓位管理不是资金管理的一部分,它就是策略本身。
我个人常用的仓位配置思路,是“风险预算制”。具体逻辑是:每个策略每周初都带有一份总风险预算(比如账户净值的2%),如果策略当前持仓的潜在亏损已经消耗了这份预算,就强制降低仓位或空仓等待。这个逻辑综合了“波动率目标”和“凯利公式”的思想,但比纯理论更容易落地。
举个例子:我的一个中频策略,每次建仓时都会估算一个“单笔最大亏损幅度”(比如6%的止损),那么理论上单笔投资金额上限 = 账户权益 × 单笔风险预算 ÷ 单笔最大亏损比例。假设账户100万,单笔风险预算定为1.2%,单笔止损幅度6%,那么这笔交易的最高仓位= 100万 × 1.2% ÷ 6% = 20万元。这个方法的妙处在于:它把“这笔交易亏多少我能接受”和“这笔交易买多少钱”统一到了一个公式里,而不是拍脑袋决定买20万还是30万。
3. “术”:从想法到信号的落地技巧
“法”把框架搭好之后,“术”就是具体的实现技巧——这一步是把投资逻辑翻译成可执行代码的关键环节。很多人在这一层掉进了“过度优化”的坑里无法自拔,也有很多人连“回测和实盘的差距为什么这么大”都没搞清楚。下面我来讲几个最关键的技术细节。
3.1 一个完整的最小策略骨架
为了让你对“术”有一个完整概念,我用一个经典的双因子策略做例子,演示一个最小可用的策略骨架。假设我们的策略逻辑是:当股价站上20日均线,同时成交量是5日均量的1.5倍以上时,买入;当股价跌破10日均线时,卖出。这个逻辑不算高级,但它能完整展示“信号生成—仓位计算—交易执行”的全链路。
import pandas as pd import numpy as np def generate_signals(df, position_pct=0.2, risk_per_trade=0.012, stop_loss_pct=0.06): """ df: 包含每日 open/high/low/close/volume 的DataFrame 返回:带信号和仓位的DataFrame """ df = df.copy() # 1. 计算均线指标 df['ma20'] = df['close'].rolling(20).mean() df['ma10'] = df['close'].rolling(10).mean() df['vol_ma5'] = df['volume'].rolling(5).mean() # 2. 生成买入/卖出信号 buy_cond = (df['close'] > df['ma20']) & (df['volume'] > 1.5 * df['vol_ma5']) sell_cond = df['close'] < df['ma10'] df['signal'] = 0 df.loc[buy_cond, 'signal'] = 1 df.loc[sell_cond, 'signal'] = -1 # 3. 信号去重:头寸只在状态变化时更新 df['position'] = df['signal'].replace(0, np.nan).ffill().fillna(0) # 4. 根据风险预算计算目标仓位 equity = 1000000 # 假设初始资金100万 target_value = equity * risk_per_trade / stop_loss_pct df['target_position'] = np.where(df['position'] != 0, target_value / df['close'] / equity, 0) return df上面的代码里,最容易被忽略的是第3步“信号去重”。如果你每天只要满足买入条件就重复买入,累积两次重复信号,结果就是仓位翻倍,风险失控。信号去重是回测和实盘一致性的基础细节,很多新手在这里栽过跟头。
3.2 回测中最容易自欺的三个地方
回测的本质是用历史数据验证策略逻辑,但历史数据不会说谎,骗人的是回测框架本身。我见过太多人把回测做得绚烂夺目、年化90%、回撤5%,结果一上实盘就现出原形。原因无非下面三个:
第一,前视偏差。在用数据计算指标时,用了当天收盘之后才能知道的信息去决策当天的买卖。比如用“当日涨停价买入了当日涨停的股票”这种回测逻辑,实盘根本没机会成交。A股尤其要小心涨跌停的处理,回测中买入标的当天涨停封死,现实中你根本买不进。
第二,幸存者偏差。回测使用的是当前还在上市的股票列表,而退市的股票被自动忽略了。这对于A股尤其致命——过去几年退市股票越来越多,如果你只用现在的股票池做历史回测,等于自动规避了“暴雷退市血本无归”的那段真实历史,收益曲线自然被系统性高估。
第三,过拟合。把参数的每一个细节都调到历史数据上最优,本质上是用20个参数拟合过去的一段行情。这种策略就像是给你一张过去的考卷答案去拿满分,下一场考试完全没用。我的经验是:每个参数背后必须有一个“可解释的经济逻辑”。如果连你自己都不能用大白话解释这个参数为什么要设成15而不是10,那它大概率是在配合数据说话,而不是在表达逻辑。
3.3 参数稳健性检验
对任何一个策略,我都建议做一张“参数敏感性网格”:
选一个关键参数(比如均线周期),在合理范围内连续取20个值(从5到50每隔5取一个),跑出对应的年化收益和最大回撤,做成一张表。如果相邻参数的年化收益差距在5个百分点以内,回撤变化不超过1个百分点,说明策略对这个参数不敏感,相对稳健。如果某个参数从12调到13,年化收益从15%直接跳到60%,不用兴奋——那基本可以断定策略正在过拟合某个特定行情。
我个人的习惯是:回测参数每变化一档,业绩波动越小越可信。稳健策略的特征是“参数高原”而不是“参数尖峰”。
4. “器”:工具链选型与数据工程实战
“道、法、术”说得再天花乱坠,到了“器”这一层,一切都要落地到实实在在的数据、系统和工具上。A股个人量化者面临的真实挑战,和公众想象的不太一样——最大的瓶颈往往不是策略灵感,而是数据质量的清理、回测框架的靠谱程度、以及实盘执行的稳定性。
4.1 数据:量化大厦的地基,也是一天到晚漏水的房顶
我对数据重要性的认识,是在一次真实的“事故”中建立起来的。当时我的一个中频策略里用了分红除权数据,回测时没做前复权处理。恰好那段时间持仓里有只股票发生了大比例分红除权,股价一天之内从30元跳到20元,策略误判成“暴跌突破止损线”直接清仓,错过了后面一段完整的上涨行情。回测数据一个字段没处理干净,实盘账户就为它交了一笔学费。
所以我把“器”这一层的数据要求列成了铁律:
- 必须做复权处理,且实盘信号计算与回测口径严格一致(我用前复权做回测与信号统一,后复权做收益归因)
- 财务数据要注意报告期与公告期的区别,A股财报有滞后披露,回测时如果用到了未来才能公告的数据,就是前视偏差
- 异常数据处理:除权除息日、停牌日、涨跌停日要在数据里明确标识
- 获取数据时,要检查是否有缺失值和跳空,清洗完成后做一次日频校验(比如每日总数据条数和交易所公布的上市股票数量对上)
4.2 回测与执行框架的选择逻辑
工具这块,我不打算罗列一堆软件清单,而是告诉你选型时怎么判断。个人做A股量化,市面上有几条路线,各有优劣:
回测方式上面,大致有“事件驱动回测”和“向量化回测”两种主流思路。向量化回测快、代码简洁,但不容易模拟涨跌停无法成交、开盘涨停无法买入这类A股特色约束;事件驱动回测慢一些,但逐笔推进交易,能更真实地处理涨跌停、停牌、T+1等规则。如果你的策略信号不太依赖分钟级撮合细节,向量化就够用;如果你的策略涉及日内交易或涨跌停附近的买卖,一定要用事件驱动回测框架。
实盘交易环节,A股个人做量化的标准路径是:用券商的量化交易接口或条件单系统,把策略信号转换成委托单,由程序化或半自动化执行。起步阶段不一定非要全自动,可以先做成“策略生成信号、人工手动下单”的半自动模式,等运行稳定后再逐步提高自动化程度。我自己的第一个实盘策略就是半自动跑了两三个月,一方面验证策略逻辑,另一方面也验证自己心理上能不能真正按照信号执行。
4.3 执行链路与运维细节
在“器”的层面,我要特别提醒几个日常运维细节,这些是普通教程里很少提到的:
第一,策略启动前的参数快照。每次实盘部署必须保存一份当时的参数、标的池版本、代码版本。否则三个月后你想复盘“为什么这一单操作了”,很可能发现代码已经不是当时那套了。
第二,信号文件的持久化。我习惯每天收盘后生成一份当天所有信号的明细CSV,包含信号触发时间、价格、量能数据、当时的策略状态。这个文件不是为了跑程序用的,是为了事后复盘和排查“为什么没交易”用的。半年之后你再回看,会发现这比任何日志都管用。
第三,仓位与信号同步机制。程序在极端情况下可能重启、断线、重复发送委托。实盘一定要有“幂等”设计:同一根K线、同一个信号,重复执行只能生效一次。最简单的方法是保存一个本地信号ID,每次执行委托前检查这个ID是否已经处理过。
5. “势”:感知市场温度,不和趋势作对
最后一层“势”,也是我认为最容易被纯技术流忽视的一层。量化交易看似是纯规则驱动的冷冰冰系统,但市场本身是一个复杂系统,同一个策略在不同市场阶段的表现可以天差地别。把“势”纳入量化体系,不是要你放弃规则去预测市场,而是用规则去感知“当前市场适不适合我这套打法”。
5.1 量化语境下的“势”到底是什么
在实战中,我把“势”拆成两个可观测、可量化的信号群,而不是抽象的感觉:
- 市场整体的趋势状态:用主要指数(比如沪深300、中证500、中证1000)的均线系统、波动率水平、成交额变化来衡量当前是趋势市、震荡市还是高波动市
- 市场风格倾向:用大小盘相对强弱、行业轮动速度、涨停板晋级率等指标,感知当前市场更偏好哪一类股票、哪一类策略更容易得到资金响应
5.2 用市场状态指标动态调整策略权重
这部分我分享一个自己用过的“策略开关”模型,非常朴实,但很有效。我的实盘体系里有一个“温度计”模块,每日收盘后计算三组指标:
第一组是宽基指数趋势分:各主要指数站上20/60日均线的数量占比,高于70%定义为“进攻环境”,低于30%定义为“防守环境”。
第二组是市场成交活跃度:全市场成交额近20日的分位数,低于历史30%分位时,整体降低所有策略的仓位权重;因为流动性收缩时,滑点和冲击成本都会显著上升,策略收益会被交易成本侵蚀。
第三组是策略自身状态分:每个策略当前处于净值回撤的什么位置。如果策略从近期高点回撤超过一定阈值,就把它权重减半或暂停,直到净值重新创出新高。
这三者合在一起,形成每周的“高/中/低”三档风险预算,直接作用于第二章提到的仓位管理公式。这套机制的说人话版本就是:市场给机会时,我多暴露一些;市场不给机会时,我主动收缩阵线。量化的优势不在于逆天改命,而在于用规则保证“市场不好的时候你确实会减仓,而不是一边恐慌一边死扛”。
5.3 与“势”共处的实盘心态
最后说点实在的。做量化这几年,我见过太多人前三个月踌躇满志,第五个月开始怀疑人生,半年之后彻底删除代码。核心原因,就是“利空环境下策略回撤”这个必然事件被当成了“策略失效”。你要想稳住,必须在开发策略时就接受一个事实:任何策略都有让你不舒服的日子,成熟的量化交易者不是在寻找“从不回撤的策略”,而是设计“回撤之后还能回来的体系”。
我个人的体会是,“势”这一层最大的价值不是帮你多赚钱,而是帮你在市场的顺风期保持冷静、在逆风期保持存活。A股从来不缺机会,缺的是在机会来临时你还在场、还有充足的弹药。
6. 万字经验浓缩:五层框架怎么落到你的第一个实盘策略
文章写到这里,我不打算做什么高屋建瓴的总结。更想做的,是把前面五层框架浓缩成一份可直接对照的行动清单,给准备开启自己第一个A股量化策略的读者一条清晰的起步路径。
第一步:用“道”校准预期。写一段策略逻辑说明,确定你赚的是哪类钱,并书面写明它失效时的典型特征。这段文字会在你最煎熬的时候救你一命。
第二步:用“法”圈定边界。选定一个频率区间,建立标的池过滤规则,写清楚单笔风险预算和总风险预算,把它们变成代码里的常量约束。
第三步:用“术”专注核心逻辑。从最简单的1-2个因子开始,保持参数可解释,把前视偏差、幸存者偏差、过拟合三座大山小心翼翼地绕开。
第四步:用“器”夯实基础设施。确保数据口径一致、回测框架能模拟A股交易约束,实盘从半自动起步,做好信号持久化和参数快照。
第五步:用“势”感知环境。给策略配一个“温度计”,用规则而不是情绪来决定什么时候加仓、什么时候收缩。
这五步走完,你的量化交易之路才算是刚刚开始。别急着成为“年化翻倍的传说”,先努力成为一个“亏的时候知道为什么亏、赚的时候知道为什么赚”的合格交易者。这是我踩了无数坑之后最想对你说的一句话。