
最近两年每当有人听说我在做量化交易问得最多的一句话就是这东西真能在A股稳定赚钱吗我的回答一直没变——量化交易不能保证你赚钱但它能帮你把每一笔亏损亏得明明白白。这句话听起来不像广告却是实话。模型会犯错误策略会失效行情会羞辱你但量化交易最值钱的地方不是预测的准确率而是一套强制性的纪律什么情况下进场、什么情况下离场、每笔投入多大、总体亏到什么时候停下来。今天我想用“道、法、术、器、势”这五个字把A股实战里我自己踩过、爬出来、反复验证过的东西完整地梳理一遍。这篇文章适合两类人一类是刚接触量化、想搞明白它到底怎么运作的新手另一类是已经在写Python跑策略、但总觉得哪里不对劲的业余选手。我不会只给结论我会把每个决策背后的“为什么”也一起讲透因为真正让你亏钱的往往不是策略本身而是你对每个环节理解上的漏洞。1. 道量化交易的底牌先搞清楚你赚的是什么钱1.1 量化的本质不是预测而是概率优势很多人对量化交易的第一印象是“用程序预测股价”这个理解从一开始就偏了。股价短期走势里夹杂着太多噪声任何模型都不可能稳定预测下一秒的涨跌。量化的真正逻辑是找到一种在长期大量交易中期望收益为正的规则然后顶住情绪、严格执行让概率站在自己这边。通俗地打个比方你和一个朋友反复抛硬币猜正反只要规则设计成“你猜中赢1元、猜错亏0.9元”那么哪怕每次都是随机猜玩一千次之后你也大概率是赚钱的。量化交易要找的就是这种在规则层面存在微弱优势的市场状态它不要求每次都对只要求盈亏比和胜率的组合足够健康。我自己衡量一个策略值不值得做从来不看它过去一年赚了多少倍只看三个数胜率、盈亏比、最大回撤。这三个数组合起来才决定这个策略是不是具备可持续的正期望。1.2 A股市场里常见的三类“钱”在A股实战中量化策略赚的钱归根到底来自三种市场行为趋势延续的钱股价一旦形成趋势情绪和资金会推动它继续惯性运动。均线突破、动量因子本质上都是捕捉这类钱。均值回归的钱股价短期涨跌过头时价格会向均值回归。超跌反弹、布林带反转就是这类逻辑。定价错误的钱市场对某些信息反应不足或反应过度导致价格偏离真实价值。比如事件驱动、套利类策略赚的是这种钱。这三种钱的来源不同对应的策略特性也完全不同。趋势策略的胜率通常不高可能只有四成但盈亏比高赚一次能抵三次亏回归策略胜率高但单笔盈利幅度有限怕的是单边行情反复打脸。我的建议是入门阶段先选一种钱去赚不要三种都碰。把一种逻辑做透比什么都想抓却什么都抓不住强得多。1.3 认知边界先定义“我不做什么”“道”层面的最后一件事是明确不做什么。很多新手一开始就踩的坑是试图用一套策略覆盖所有行情。牛市里趋势策略好使震荡市里趋势策略连续止损几十次心态直接崩掉。我给自己定的规矩很简单不做预测宏观政策拐点的策略不做依赖内幕消息的策略不做流动性极差的标的。这几类东西要么不可证伪要么即使模型赚钱了也会因为执行走样而亏回去。与其追求“什么行情都能赚”不如承认“我只赚某一类行情的钱”。这个认知决定你后面在“法、术、器、势”上的所有配置方向。2. 法把投资逻辑翻译成机器能听懂的语言2.1 从模糊想法到可执行规则的推导过程“道”想清楚了接下来就是把它变成代码。“法”的核心工作是把“我觉得涨”“我认为该买”这种模糊判断翻译成一条条没有歧义的规则。举个例子。假如我的想法是“趋势启动时追进去”这句话本身没法编程。我必须回答几个问题什么叫趋势启动用什么指标度量启动的触发阈值是多少进场后什么时候走亏损到什么程度离场我最早做的双均线策略就是一次完整推导。逻辑链条如下趋势的度量用短期均线和长期均线的关系来判断。短期均线在长期均线上方说明近期价格强于远期定义为多头趋势。进场条件5日均线从下方向上穿越20日均线金叉产生买入信号。离场条件5日均线从上方向下穿越20日均线死叉产生卖出信号。仓位规则每次信号触发只使用总资金的50%剩余50%作为缓冲。这个过程看似简单但每一步都强迫你面对细节均线参数选5和20是拍脑袋还是历史检验金叉的定义是“价格穿过”还是“均线穿过”这些细节不敲定代码就跑不起来。2.2 信号生成的两种主流范式在A股量化里信号生成无非两大流派时序择时和截面选股。时序择时针对单个标的根据其自身历史数据决定当前该买、该持币还是该卖。上面说的双均线策略就属于这一类。它适合指数、ETF和流动性好、趋势规律明显的品种。截面选股在每个调仓周期把全市场所有股票按某个因子排序买入排名靠前的、卖出或回避排名靠后的。它赚的是股票之间的相对强弱差异。这两种范式对数据的要求、对代码的架构要求完全不同。时序择时数据量小、逻辑直观适合新手入门截面选股需要处理全市场的高维面板数据还要应对财务数据对齐、停牌处理、ST剔除等问题复杂度高一个量级。我的建议是第一个策略务必选择时序择时哪怕只做一只ETF也好。等你把回测、风控、实盘这一条链路跑通了再考虑截面选股。2.3 仓位管理和风控军规很多业余选手研究策略时只看进出场把仓位管理完全忽略掉。这是大忌。一个胜率60%的策略如果仓位管理混乱照样可能爆仓一个胜率只有40%的策略配合科学的仓位控制却能长期活下来。我常用的仓位控制方法有以下几种固定比例法每次信号进场固定使用总资金的固定百分比比如10%。简单、稳定适合刚上手的阶段。波动率目标法根据标的的近20日真实波幅来调整仓位波动大就少买波动小就多买。这种方法天然控制了每次进场对账户带来冲击的“能量”我认为比固定比例更科学。凯利公式改进版用胜率和盈亏比算出一个理论上的最优下注比例但因为A股的单笔最大亏损无法完全精确预测我一般会把它打个折扣执行取理论值的四分之一到一半。除了仓位风控军规同样重要。我给自己定了几条铁律单笔最大亏损不超过总资金的2%账户回撤达到15%时强制降半仓单一个股持仓不超过总资金的20%。这些规则写死以后遇到极端行情时即使心态崩了规则也能帮你守住底线。3. 术Python回测与实盘落地的关键动作3.1 技术栈选型我为什么是Python pandas backtrader“术”是整个量化体系里最实操的部分。我的技术栈很简单Python做研究和回测pandas做数据处理backtrader做回测框架实盘阶段用券商提供的量化接口或第三方交易终端来落地。选择Python不是因为它最快而是因为它的生态太适合这个场景数据获取有成熟的库计算有pandas和numpy策略研究有Jupyter这种交互环境写代码和实盘之间的衔接成本很低。这里单独说说回测工具的选择。很多人上来就研究backtrader、vn.py这类重量级框架我建议不要这么干。第一次做量化最好的“框架”其实是自己用pandas手工写一个最小化回测函数。因为自己写代码你会被迫搞清楚每一笔成交、每一个净值曲线的计算逻辑一旦用现成框架很多隐藏假设就会被你稀里糊涂地忽略掉而这些假设恰恰是回测失真的一大来源。3.2 一个最小化双均线回测代码与陷阱下面给出一个我早期写过的回测骨架尽可能简化但关键细节都在import pandas as pd import numpy as np def generate_signals(df, short5, long20): 生成双均线策略的持仓信号。 关键信号整体后移一根K线避免用到未来数据。 df df.copy() df[ma_short] df[close].rolling(short).mean() df[ma_long] df[close].rolling(long).mean() df[position] np.nan df.loc[df[ma_short] df[ma_long], position] 1 df.loc[df[ma_short] df[ma_long], position] 0 # 这一步是灵魂真正成交只能发生在信号确认后的下一根K线 df[position] df[position].shift(1).fillna(0) return df def run_backtest(df, init_cash100000, fee0.0003): df df.copy() df[ret] df[close].pct_change().fillna(0) df[trade_ret] df[position] * df[ret] # 双边手续费按每次换仓的仓位变化比例扣除 df[turnover] df[position].diff().abs().fillna(0) df[net_ret] df[trade_ret] - df[turnover] * fee df[net_value] init_cash * (1 df[net_ret]).cumprod() return df这个回测函数本身只有二十多行但它已经涵盖了最重要的几个细节信号后移一位K线收盘后你才能算出均值关系然后第二天开盘才能成交。如果不做shift等于你当天收盘时看到了信号、还假设当天开盘就能买入属于典型的未来函数。这个细节很多现成框架里默认帮你处理了但你自己写一遍才能真正理解为什么需要。手续费和滑点A股双边交易成本加起来大约在万几水平加上滑点后实际交易成本远比很多人以为的更高。如果不把这些损耗算进回测你看到的策略收益会显著虚高尤其是高频调仓策略。3.3 参数寻优的过拟合陷阱回测跑通之后大多数人会立刻进入参数优化环节。这个环节是量化新手的“绞肉机”。我见过太多人做参数扫描均线参数从短5长20扫到短3长10再扫到短50长200最后选出历史收益最高的那组参数兴奋得不得了。但问题在于把几千组参数里最优的那组挑出来本身就是一种过拟合——它大概率是在历史上“记住”了噪声而不是提炼出了规律。我的做法是参数范围先基于业务逻辑来定比如均线周期取5到60之间跨度太大就没有意义然后只看参数邻近区间内的收益稳定性而不是只看单一参数的峰值。如果短参数附近的策略表现都尚可而且参数从5到15变化时收益曲线平缓这个策略才可信收益峰值孤零零地悬在某个特定参数上比如只有短4长17最优其他都很差那基本可以判定是过拟合。3.4 实盘执行从回测到真实账户的距离回测和实盘之间有一条巨大的鸿沟很多人就是在跨越这条沟的时候亏掉了所有的利润。实盘阶段有几个细节必须注意委托方式回测里假设成交价格就是收盘价实盘里你需要选择限价单还是市价单。市价单成交快但极端行情下可能被瞬间扫到离谱的价格限价单价格可控但可能成交不了。我通常选择限价单挂单价格设在信号价格到当时盘口买卖价之间确保可成交性。账户与代码的同步程序下单后必须把订单状态同步到本地数据库。A股没有递延结算的概念但程序跑着跑着断网、API返回超时是最常见的问题。必须保存本次操作的完整日志。盘中检查即便程序全自动运行我每天也会在开盘前检查一遍持仓、可用资金和当日风险指标。机器不是万能的行情极端时软件异常、网络延迟都可能造成事故。这些问题的共同点是回测里根本看不到实盘里全部会真实出现。所以我一直建议第一次实盘只拿极小资金跑比如一两万就当交学费跑三个月以上确认链路稳定了再上量。4. 器数据源、算力与工具链的实用配置4.1 数据源的选择量化策略最底层的燃料是数据数据质量决定策略上限。A股常见的数据源有以下几类数据源类型费用适用场景Tushare Pro日线、基本面积分制部分免费新手入门、低频策略AKShare日线、实时复用公共接口免费快速原型验证聚宽 / 米筐研究环境数据一体收费平台化研究、回测Wind / Choice机构级全量数据高收费专业机构、高频研究券商量化接口实盘行情与交易按券商而定实盘接入时需要这里我跟大家说一个亲身教训不要一开始就追求全市场、逐笔级的高频数据你会发现绝大部分用不上。对于日频、周频的策略日线数据完全够用财务数据一定要看“信息公布日”而不是“事实发生日”因为只有公布日当天市场才知道业绩用未公布的数据回测会产生极其严重的未来函数这个坑几乎所有新手都踩过。4.2 算力与硬件你需要什么级别的机器很多新手会囤CPU、搭服务器其实绝大多数日频策略用一台普通的笔记本就足够了。我自己的策略回测全市场4000多只股票的日线数据跑一次也就几分钟真正费时间的是参数寻优需要反复扫描但即使如此一台8核以上的台式机也能应付。只有当你的策略频率升高、数据量变大比如做日内分钟级、或全市场高频因子挖掘才需要认真考虑内存和并发。到那个阶段你可以用多进程把全市场按板块拆开并行算。内存不够时把数据存SQLite或者Parquet落盘做文件级缓存而不是把一切数据都塞进内存。对了分布式计算、GPU加速这些词在新手阶段基本和你无关。不要为了用工具而用工具你的瓶颈通常在数据质量而不是算力。4.3 开发与运维工具链一个稳定的量化系统不只是策略代码本身还包括一整套支撑设施。我日常使用到的工具链如下Jupyter做研究和因子探索交互式验证想法效率极高。VSCode写正式的策略代码和实盘脚本配合Git做版本管理。SQLite存行情快照、交易记录、账户状态轻量、可靠、单文件。定时任务用系统的cron或写个简单调度脚本每天盘后自动拉数、跑信号、发送报告。这套组合最大的好处是每一层都独立出了问题能快速定位。策略代码和调度代码分开数据和代码分开回测环境和实盘环境也分开。很多人最后系统跑崩了原因就是所有东西糅在一个文件里改了一处牵动全局干脆一不做二不休全部推倒重来。5. 势A股市场节奏与策略的兴衰周期5.1 风格轮动与策略衰减“势”这个维度最难量化但也最决定你在A股能不能活下来。A股市场有异常明显的风格轮动现象某段时间大盘蓝筹强某段时间小盘题材疯涨某段时间高股息被追捧某段时间成长股领跑。这意味着任何策略都有生存周期。你在某一年的市场环境下打磨出的策略换一个年份可能完全失效。我见过很多回测漂亮的策略在实盘的前三个月确实赚钱然后突然进入长达半年的回撤期原因不是代码坏了而是市场风格变了。应对风格轮动我有两个办法一是策略层面设置“状态开关”用市场温度指标来判断当前适不适合运行主策略比如市场整体处于单边下跌时策略自动降低仓位或整体空仓二是在组合层面同时运行几个逻辑上互补的策略比如一个趋势策略加一个回归策略让它们在不同市场环境里相互对冲。5.2 制度细节对你策略的隐形约束新手做量化时常常会忽略A股特有的制度规则结果策略预期和实盘表现严重脱节。我随便举几个例子T1交易制度当天买入的股票当天不能卖出。日内的高频策略天然受限任何依赖当日买卖的策略都必须把这一制度纳入约束否则回测收益全是纸上富贵。涨跌停制度涨停时你可能买不进跌停时你可能卖不掉。这类日子在回测里会被当作正常交易处理但实盘中根本无法成交。流动性枯竭导致的实际损失远高于手续费和滑点。ST与退市风险带帽股票和潜在退市风险的股票机构数据会标记但新手往往忽略。如果策略选股池里混入这类股票极端行情下会直接拖垮账户净值。我的做法是每次回测前先做一层严格的清洗——剔除ST、剔除上市不足60天的新股、剔除日均成交额低于某个阈值的流动性不足标的。这些规则不是锦上添花而是保证策略在实盘中至少能按预期成交。5.3 借“势”为模型加一层保险说了这么多制度限制最后聊聊怎么“借势”。我一直觉得纯粹的量化策略也就是只靠价量数据跑的策略在市场单边剧烈波动时是最脆弱的。而给自己加一层“市场环境保险”往往能大幅提升净值的平滑度。我常用的宏观与情绪过滤指标包括指数均线滤网当主要宽基指数运行在长期均线下方时整体仓位减半。这是一种弱状态的择时不考虑个股只判断外部环境是否适合高仓位运行。两融余额增速融资余额快速增加时市场情绪偏热趋势策略的容错度更高融资余额持续下滑时市场去杠杆期策略胜率普遍下降。涨停家数与跌停家数比作为情绪温度计情绪极端冰点时很多底部信号更可靠情绪极度亢奋时反而要警惕反转。这些指标都不复杂但它们的作用是给你的策略加一层面上的“势能”判断。量化交易不该是冷冰冰地无视环境恰恰相反一个成熟的量化体系必须把大环境的“势”纳入变量让模型在市场不适合它运行的时候主动选择离场。我个人几年来最大的体会是量化交易不会让你变成一个永赚的机器它只会让你变成一个诚实的交易者——策略强的时候它帮你加仓吃利润策略弱的时候它逼你减仓控回撤。那个最终决定长期收益的并不是某个漂亮的因子或精确的参数而是当你面对连续亏损、系统提示你止损时你是否还能照着规则执行。这个坎比任何代码都难迈过去。