
我最早做量化的时候跟大多数程序员一样觉得这就是“把投资策略写成代码然后让程序自动跑”。回测曲线画得漂亮极了年化看着也不错但真金白银放进去之后第一周就开始怀疑人生。后来我才慢慢意识到从“会写代码”到“能下实盘单”之间隔着的不只是几行代码而是一整套关于数据、执行、风控和认知的系统工程。这篇文章就聊聊我自己跑通实盘的那套“三步法”怎么从0到1把量化投资这件事做成一个真正能运转、能睡觉、能持续迭代的个人系统。它不教你选什么股票代码也不保证你能赚多少而是把一名程序员从想法到实盘这段路最容易被忽略的关键环节拆开讲透。适合那些已经能写Python、已经开始研究量化投资策略、但还没真正跑通过实盘的人参考。1. 先想清楚从“会写代码”到“能下实盘单”之间隔着什么很多程序员入场时有个错觉觉得自己的优势是“能写复杂的策略模型”“会用机器学习”“能处理海量数据”所以回测跑得好实盘就一定能赚钱。我见过太多人包括我自己栽在这个错觉里。回测里年化80%的策略实盘跑下来可能连手续费都覆盖不了回测里最大回撤5%实盘可能一天就给你干到8%。问题出在哪不是策略本身不行而是你根本还没有一套能把“策略想法”完整翻译成“市场动作”的系统。1.1 量化投资的完整链路不是一个脚本能搞定的我拿自己的实践举例。一套能跑实盘的量化系统至少要经过这样一条链路数据采集与清洗行情数据、财务数据、因子数据来自哪里怎么落地怎么保证完整和不失真。策略信号生成根据你定义的规则或模型在每一根K线上算出是否该买、该卖、该空仓。订单管理与转发把信号变成具体订单包括标的、方向、价格类型、数量然后通过券商的程序化交易接口发出去。券商柜台与市场撮合订单进入交易所按市场的规则成交。成交回报与持仓更新系统必须实时拿到“到底成交了多少、成交价是多少”才能正确更新当前的仓位和可用资金。风控与熔断任何时刻一旦亏损、仓位、异常状态触发阈值系统要能自动做应急处理。回测脚本解决的是第2步顶多加上第1步的一部分。而真正让你在实盘中“活下来”的是第3到第6步。这正好是程序员最容易低估的部分。1.2 “回测收益”和“实盘收益”为什么永远对不上我不止一次被人问为什么回测结果那么稳实盘一跑就变样这里面的鸿沟是结构性的不是你的回测框架调一调参数就能填平的。先讲滑点。回测里你假设自己按收盘价或者信号触发的那个价格成交但真实市场里你的订单从发送到被撮合需要时间而且订单本身会推动价格变动你买的时候通常买在比预期更高的位置卖的时候卖在更低的位置。尤其是小市值标的或分钟级调仓滑点可能是收益曲线里最大的出血点比手续费狠多了。再讲手续费和冲击成本。印花税、佣金、过户费、平台使用费每一笔都从你的收益里扣。高频调仓的策略一年下来光交易成本吃掉10%到20%的收益太常见了。回测里如果不把这些成本做进撮合逻辑那个漂亮曲线就是自欺欺人。还有未来函数。这个坑我单独强调过很多次它是回测界的头号杀手。什么叫未来函数就是你用了当时不可能拿到的数据去决定当天的动作。举个例子你按“当天最高价突破20日均线”作为买入信号然后回测引擎当天收盘后才把这个信号执行了——听起来没什么问题但如果你不小心用了“当天全部行情”来提前判断信号那这根K线你其实是“偷看”了。很多开源回测框架或者新手自己写的回测脚本里这种bug特别隐蔽一偷看收益曲线就“起飞”。1.3 我的认知框架先有规则再有系统最后才有收益做了这么几年我慢慢总结出一个认知框架也是整篇文章的底层逻辑。量化投资对程序员来说核心价值不在于“写了个策略就能赚钱”而在于“用一套可重复、可审计、可迭代的系统去执行一个有正期望的规则”。这听起来像废话但做起来很关键。因为它意味着三层递进关系规则层你得先有一条清晰、可编程、可验证的策略规则。比如“日线收盘价上穿60日均线买入下穿则卖出”这就是规则。它不需要复杂但必须精确。系统层你得把规则包装成一套能自动运行的软件系统覆盖从数据到执行到风控的完整链路。收益层当规则本身有正期望哪怕很小加上严格的风控长期重复执行收益才会自然涌现。很多新手把顺序搞反了先看收益曲线再倒推规则结果就是反复调参过拟合最后实盘翻车。2. 第一步选定一个“三年内不容易失效”的策略方向在做任何代码之前先花时间想清楚到底做什么类型的策略。这一步看起来跟“程序员量化投资三步法”关系不大但实际上它决定了后面所有的工程架构和数据需求。我见过太多人今天听说动量有效就写动量明天听说套利赚钱就跑去研究套利结果代码写了一堆没有一个跑过完整生命周期。2.1 三类最普适的个人量化策略选你觉得逻辑最顺的个人程序员做量化其实没必要一上来就去整深度学习、强化学习那些高级玩意。至少在“从0到1跑通实盘”这个阶段选一套逻辑清晰、市场逻辑牢固的策略方向比选一个听起来高深的模型重要得多。我把最常见的方向分成三类附上我自己的判断策略方向核心逻辑适合的市场环境程序的复杂程度个人实践难度趋势跟踪价格一旦形成趋势会延续一段时间顺大势逆小势有明确单边行情的市场低低均值回归价格偏离合理区间后会回归涨多了就卖跌多了就买震荡、区间波动的市场中中统计套利/事件驱动利用相关性资产的价差回归或基于确定性事件做交易特定事件窗口、强相关性标的高高对于第一次跑实盘的人来说我强烈建议从趋势跟踪入手。原因有三个。第一它的逻辑足够简单你很容易把它写成不依赖未来数据的规则。第二它的容错率高即使信号晚一两个交易日执行通常也不会毁掉整个策略。第三趋势策略最贴近普通人对“顺势而为”的直觉遇到回撤时心态不容易崩。均值回归我也做过它的逻辑在震荡市里很舒服但有个致命弱点如果市场突然走出单边趋势你的“逆势开仓”会不断接刀亏损像滚雪球一样放大。不是不能做而是需要更严格的止损和更精细的入场过滤对刚实盘的新手来说情绪和系统压力都更大。2.2 把“模糊的经验”变成“精确的规则”程序员有个优势就是对精确性的天然敏感。但放到交易里你得把这种敏感用在刀刃上把一条模糊的规则翻译成一个程序能执行的逻辑。举个例子。很多人说“我看股票跌破支撑位就觉得能抄底”。这句话听起来有道理但“支撑位”是什么是前低是均线还是成交量密集区“跌破”是指盘中瞬间跌破还是收盘价跌破“抄底”是买多少跌多少止损如果这些问题回答不了策略就没法写代码回测也没法做。我自己做策略定义的时候强制给每条规则写一个字段清单你也可以照着做交易标的池明确是沪深300成分股还是全市场还是只做某几个行业ETF。标的池不同数据量、流动性、滑点表现都不一样。入场条件精确到K线周期、指标参数、比较关系。例如“日线收盘价 20日均线 × 1.02”。出场条件包括止损出场、止盈出场、信号反转出场。必须写清楚不能只说“看情况”。仓位规则每笔投入多少剩余资金怎么分配。时间框架日线调仓还是小时线调仓。这直接决定系统需要的行情数据类型和运行频率。把这些字段全填完你其实已经把一个“想法”变成一个“可测的规则”了。接下来才是写回测。2.3 设置预期别让收益幻想毁掉你的实盘心态做量化的程序员还有一个常见毛病因为看多了网上那些极端的收益曲线图自觉不自觉地开始给自己设定不切实际的预期。我得说句实在话长期年化20%到30%已经是极其优秀的实盘表现能做到年化15%且回撤控制得当就已经跑赢绝大多数散户了。不要以“每个月翻倍”“三个月翻十倍”为目标那种目标只存在于梦里和骗局里。预期管理之所以重要不是因为它听起来很理性而是因为它直接影响你的实盘行为。预期定得太高你会在策略正常回撤期比如连续两个月不赚钱选择改参数、换模型、加杠杆一次两次以后整个系统就被折腾废了。我见过好几个水平不错的朋友死在了“等不了”这三个字上。3. 第二步搭一套“个人量化开发环境”数据、回测、执行三层分开定好了策略方向接下来才是程序员最擅长的环节搭系统。但搭系统也有讲究不能上来就把所有功能写在一个脚本里。我强烈建议把系统拆成三层数据层、回测层、执行层。每一层独立开发和测试层与层之间通过明确的接口通信。这样做的好处是出问题时你能快速定位是数据脏了、策略逻辑错了、还是执行通道断了而不是在一坨代码里大海捞针。3.1 数据层保证历史数据干净是回测可信的地基数据层是整个量化的地基地基不牢上面盖什么都白搭。我自己用的数据源大致三类开源数据接口比如通过多家公开数据平台获取的A股历史和实时数据、券商提供的行情接口、以及自己积累的盘中数据。对个人开发者来说开源数据接口基本够用但我给你几个必须注意的细节。第一是复权处理。A股每天都有很多股票除权除息如果你用原始价格做回测股价会在除息日凭空“跳水”趋势策略会误判为大跌然后触发止损。这是我最开始踩过的坑用未复权数据跑策略每年莫名其妙多出几十次止损。解决办法是用前复权或后复权数据做回测而且特别要注意不同数据源的复权算法可能不同换数据源后策略结果可能会整体变化这时不要慌先确认数据口径是不是变了。第二是“T1”和涨跌停约束。A股今天买入明天才能卖出而且一字涨停你买不进去一字跌停你卖不出来。很多回测框架直接把这种数据当正常K线处理策略会以为自己在涨停板上完成了建仓实盘根本做不到。这种细节直接影响回测的可信度。第三是数据的完整性监控。我吃过一个亏数据源某天突然缺了一天的分钟线而我没有任何校验策略照样往下跑导致信号错位持仓和实际价格完全对不上。后来我在数据入库的脚本里加了一条校验当天日线数量必须等于244个A股正常情况下每天约4小时交易每分钟一根分钟线数量必须等于预设值否则告警。这一条看着简单却帮我避免了好几次灾难。3.2 回测层别把回测引擎当黑盒关键逻辑要自己掌控回测层的作用是回答一个问题这套规则在历史数据上到底表现如何但你一定要清楚回测引擎本身有很多假设不同引擎处理撮合的方式完全不同。市面现有的一些开源回测框架非常好用但我建议你不要直接依赖它默认的撮合逻辑至少要把以下几个参数调成自己项目的实际情况。第一是交易成本。我在前面提过成本必须显式建模。我自己的做法是固定成本佣金印花税和冲击成本分开算。股票交易佣金一般在万分之一到万分之三之间印花税是卖出时候收具体比例我就不写死因为政策时有调整你以自己实际账户为准。关键是这套数字要填进回测。第二是撮合方式。最保守的撮合方式是信号触发后的下一个周期开盘价成交。比如你的策略在日线收盘后计算信号假设第二天开盘价成交——这比当天收盘价成交更接近现实因为散户的订单没有价格优势。有些高级回测引擎支持更深度的撮合模拟但对个人开发者来说用“下一根开盘价加滑点”作为默认已经是很稳健的估计了。第三是滑点建模。我用的是一个简单模型每笔交易成本固定加万分之五的滑点然后再加一个取决于标的流动性的额外冲击成本流动性越好冲击越小。这个模型不完美但足够让回测结果保守一点。一切往保守里算实盘才不容易翻车。回测还有一个很多人忽略的坑过拟合。你有了回测引擎后会不自觉地开始调参让曲线更漂亮。调参本身不是问题问题是每一次调参都是在用同一段历史数据“考试”调得多了你其实是在让模型背答案。我的应对方法是样本内外切分用前70%的历史数据调参用后30%做最终验证只在样本外结果也能接受时才考虑实盘。这个方法很土但非常有效。3.3 执行层把信号真正变成订单才是“跑通实盘”的定义执行层是整个系统里最“工程化”的部分也是我刚开始最轻视的部分。它的核心任务是接收策略层产生的信号通过程序化交易接口下单然后处理成交回报。这里涉及一个很关键的概念程序化交易接口。现在国内主流的券商基本都支持程序化交易只是不同券商提供的终端、API、权限申请流程不一样。个人开发者一般是通过券商的量化交易终端比如某些支持QMT、Ptrade的券商或者标准API来实现程序化下单。你需要考虑几件事接口稳定性实盘跑起来以后你不会每时每刻盯着接口能不能稳定连接、断线了能不能自动重连非常重要。下单接口的幂等性网络超时的时候如果你重发订单可能造成重复买入。你必须在客户端做订单去重。持仓同步策略层算出的“应有持仓”和实盘账户的“实际持仓”中间可能因为部分成交、撤单、分红送股而产生差异需要一套对账机制来修正。权限与风控限制不同账户的权限不同有些标的不能买有些交易方式受限执行前系统要能识别并拦截这些非法订单。我自己的执行层设计比较简单一个常驻的Python进程行情驱动收到信号后调用交易API下单同时把每一笔信号和订单都记录到数据库和日志文件里。重点不是技术多先进而是每一笔动作都有完整的痕迹出了问题能回放、能复盘。4. 第三步跑通“模拟盘→最小资金实盘”的两段式验收流程很多程序员回测一做完恨不得立刻把钱放进去。这个冲动我完全理解但这是从0到1跑通实盘过程中最大的一个坑。我的做法是强制自己走完两段验收先模拟盘跑2到4周再最小资金实盘跑4到8周。时间看起来很长但这是“降维试错”最便宜的方法。4.1 模拟盘阶段验证链路完整而不是验证盈利模拟盘阶段很多人理解错了以为它是在赚钱层面做预演其实它验证的是工程链路能不能闭环。我列一个自己的验收清单你可以在模拟盘阶段逐项打勾验收项通过标准信号生成完整性每个交易日结束后策略能产生预期的信号或“空仓”信号下单接口连通性信号产生后系统能在预设时间内成功提交订单成交回报回写订单状态能从“已报”变成“已撤”或“已成”成交价和数量被正确回写持仓正确性系统记录的持仓数量与实际账户持仓一致日志完整性每笔信号、订单、成交都有记录且能按日期回放异常恢复能力手动杀死进程后重启系统能从断点恢复不重复下单不丢状态在这个阶段订单没有真实资金风险所以你可以大胆测试边界条件断网、断电、接口超时、错误订单、涨跌停无法成交等。我见过有人在模拟盘阶段发现自己的下单脚本按错键差点把仓位翻十倍买进去——如果在实盘发生这种错误冲击成本巨大的同时心态基本就崩了。4.2 最小资金实盘阶段用小钱换真实盘感模拟盘跑通了你验证的其实是“系统按设计工作”但还没有验证“系统在真实市场下的摩擦成本”。模拟盘里你随便一个限价单都能成交但实盘里不是模拟盘里没有滑点实盘里有。所以第二阶段我会用最小可交易单位、占总资金比例很低的一笔钱去实盘。这笔钱的目的不是赚钱而是采集真实的滑点、成交速度、接口稳定性数据。我自己的第一批实盘单每笔金额小到手续费占比都吓人但恰恰是那段时间让我真正理解了什么叫“成本和摩擦”。比如我发现某种标的盘中流动性不足信号出来以后限价单挂了很久都不成交等撤单再追时价格已经走远——这些体验模拟盘根本给不了你。4.3 实盘验收的核心指标不是收益是“可持续执行”在最小资金实盘结束时我会看四类指标注意它们都不是收益率信号执行偏差理论信号价和实际成交价的误差有多大是否在预设范围内。系统故障率一个月内发生了几次接口断连、数据缺失、进程崩溃每次恢复花了多久。风控触发次数熔断条件有没有被误触发有没有该触发却没触发的情况。运营耗时每天需要多少人工盯盘和检查理想情况下应该趋近于0。如果这四类指标都能让人接受再考虑把资金逐步放大。放大的节奏不要“一步到位”而是按每周1.5到2倍的速度慢慢加上去每加一次都观察一段时间系统的表现。这种方式虽然慢但能保证你不会因为一次系统边界条件的翻车把之前所有的盈利都赔回去。5. 实盘路上最容易翻车的三个技术细节最后聊聊实盘中最容易翻车的三个技术细节都是我反复踩过、也被别的朋友反复踩过的坑。这些内容不写在教科书里但恰恰是决定你能不能在实盘里活下来的关键。5.1 日期、时间和结算规则跨天逻辑是隐藏的定时炸弹量化系统里最容易出bug的地方就是日期边界。A股每天15点收盘但收盘不等于当天交易结束你还需要处理盘后的结算、持仓市值更新、资金变动。如果你的策略是日线级别收盘后计算信号、第二天开盘执行那你要非常小心“那句代码到底在哪一天执行”。我出过的一个真实事故是跨年夜的时候数据源提供了特殊的非交易日文件我的数据库没有忽略它结果策略以为多出一个交易日连续运行了两天仓位和信号全部错乱。后来我在数据入库层面强制校验“只接受正常的交易日历”并单独维护一张节假日表才把这个隐患彻底解决。日期边界的东西慢一点、冗余一点不算坏事。5.2 API超时和重复请求不做幂等处理的太容易翻车实盘下单接口本质上是一个远程调用只要涉及网络就可能超时。超时后你怎么办很多人第一反应是重试。但重试可能造成重复下单第一次请求其实已经成功只是响应包丢了你又发了一次一模一样的订单结果买了双倍仓位。我处理这个问题的方式很朴素每笔策略信号生成一个唯一的订单编号下单前先记录到本地数据库状态为“待提交”收到接口回调后再把状态更新为“已提交”或“已成交”。重试循环里任何情况下都不改变这个编号只查询状态。如果状态卡在“待提交”但接口其实已经收到过订单那就先查持仓、对账再决定要不要重新下单。这套“先记录、后执行、状态驱动”的玩法是从支付系统里借鉴的幂等设计大家做交易系统一定不要省这一步。5.3 分红送股、除权除息数据断层会让策略误判历史前面在数据层提过除权除息这里我想把它单独拿出来强调一次。很多人只看日线复权数据没注意复权数据也有两种前复权和后复权。而且你在做历史回测时用的复权基准和实盘时看到的实时价格可能是不同口径的。这会导致一个具体问题你的历史数据回测规则在某一根K线上觉得“形态有效”而实盘数据在你眼前显示的却是一个除权后的大缺口。如果你没做复权对齐策略会在除权日当天误判“暴跌”或“暴涨”触发错误的止损或追单。我的做法是在历史数据中除了用复权数据做回测还要额外存一份未复权数据专门用来识别和标记除权除息事件。策略运行时遇到这些事件直接跳过信号或者在风控层做特殊处理。多花一倍的存储空间换少一个隐形大坑这笔账怎么算都划算。另外还有一个领域相关的小提醒如果你做的标的池包含ETF要注意ETF的现金分红方式有的走现金分红有的走份额折算它同样会引起价格断层而且比个股的除权除息更难察觉。写在最后跑通实盘这件事对程序员来说真正的门槛从来不是写策略代码而是构建一套能对抗真实世界不确定性的系统。我个人做了这几年最大的体会是量化投资磨炼的不是赚钱技术而是你对规则的敬畏和对不确定性的接受能力。最后再分享一个小技巧也是我的习惯每次对策略或系统做任何改动之前先给系统加一个“全局开关”——一个环境变量或配置文件里最显眼的开关一旦实盘出现任何意料之外的情况你可以一键停止所有自动化交易回到手动状态去排查。这个看起来简单的开关在关键时刻能救你一命。希望这套三步法能帮你少走几段弯路早一点看到一个真正稳定运转的实盘系统出现在你自己的电脑上。