
去年有个朋友拿着跑了大半年的策略来找我回测曲线漂亮得像教科书插图实盘三个月的净值却是一条缓慢下坡的斜线。逻辑没改、参数没动问题出在他中途换了个量化工具——新工具默认按次日开盘价成交、默认不扣印花税、默认每次调仓全额换手。他原策略是周频调仓这三条默认设置叠加起来等于在回测里凭空送了他每年十几个点的成本豁免。这件事让我意识到个人做量化选工具时最先要问的不是“回测跑得多快”“指标全不全”而是它对持有周期和换仓方式这两件事做了什么隐含假设。量化软件的差异八成体现在这两个词上剩下的两成才是界面和数据。下面聊的三款工具我用甲、乙、丙代指不点具体品牌——同类产品迭代太快今年叫这个名字明年换套皮看定位比记名字有用得多。内容全部围绕工具的使用逻辑、调仓节奏的配置和实盘执行的细节展开不涉及任何标的推荐也不构成投资建议只是把我自己踩过的坑和验证过的流程摊开讲。1. 换仓节奏错配一次实盘跑输回测的完整复盘1.1 那条下坡曲线背后的三个默认值朋友那个策略逻辑其实不复杂20日动量排序取前10只波动率倒数加权按周调仓。回测年化28%最大回撤12%。实盘三个月跑出-6%同期回测还在创新高。我让他把交易明细导出来一条条对问题很快浮出水面。第一处工具甲的默认成交价是“信号日收盘价”。他的因子是用当天收盘价算的然后又在当天收盘价成交这是标准的未来函数——等于你知道了收盘结果再去收盘那一刻下单。真实情况是你至少要等到收盘后才有完整数据算因子最早也只能次日开盘下单。单这一条在动量类策略上就能虚增五到八个点的年化。第二处默认手续费只扣了佣金印花税那一栏是空的。A股卖出单边印花税目前是千分之零点五加上佣金双边各万分之二点五左右再算上滑点一次完整的全仓换手卖光再买满实际成本大约在千分之二到千分之三之间。他周频调仓、每次全仓换手一年52次光成本就是13%上下。回测里这笔钱一分没扣。第三处更隐蔽工具默认调仓是“清仓再重建”而不是“增量调整”。他前十名里可能只换掉两只但工具把十只全卖了再全买回来。换手率被放大到100%而真实操作只需要换20%。这三条加起来回测和实盘之间隔着一道十几厘米厚的墙。1.2 持有周期的下限是被成本顶住的很多人定持有周期靠感觉——“我觉得一周差不多”“月频比较稳”。从业者的做法是算出来的。先看信号端。任何因子的预测能力都有半衰期你可以用滚动IC信息系数来量化把因子值和未来1日、3日、5日、10日、20日的收益分别做截面相关性画出衰减曲线。假设某动量因子1日IC是0.055日掉到0.03510日只剩0.01220日基本在0附近晃——那这个信号的“有效保质期”就是5到10个交易日持有周期定在周频合理定在月频就是拿过期的信号在做决策。再看成本端。设单次完整换手的成本率为 c双边佣金印花税滑点约0.2%~0.3%年调仓次数为 n则年化成本损耗约等于 c × n。策略要跑赢必须满足单次调仓带来的预期超额收益 单次换手成本 × 安全系数我个人用2倍举例一次全仓换手的成本0.25%那这次调仓至少要能带来0.5%以上的预期超额才值得动手。如果你的信号在周频上只能贡献0.3%的边际超额那周频就是亏本买卖应该拉长到月频让每次调仓累积更多信号。还有一个被忽略的约束是账户规模。佣金最低5元这条对小资金杀伤力极大。5万块的账户一次买入2.5万按万分之二点五算佣金是6.25元勉强过线如果分成三批建仓每批8000块佣金按最低5元收实际费率飙到万分之六以上是名义费率的两倍多。所以小资金反而不该做太细的分批这是个反直觉的结论。1.3 换仓方式的四种基本型决定了工具需要的功能调仓不是只有“到期全换”一种。实际常用的有四类对工具能力的要求完全不同换仓方式触发条件适合周期对工具的核心要求日历定期轮动固定日期月末、周一月频、季频交易日历处理、节假日顺延阈值带宽再平衡权重偏离超过X%月频、季频权重监控、单券偏离计算排序替换排名跌出前N名才卖周频、月频持仓与排名的增量比对风险预算再平衡组合波动偏离目标周频、月频实时波动率估算、协方差更新这四类里第三类“排序替换”是最省成本的做法也是最容易被工具默认行为破坏的——很多平台只提供“全量重建”模式你想做增量替换得自己写逻辑。选工具时这一条必须提前确认它支不支持“只交易变动部分”。如果不支持你的换手率永远是100%任何短周期策略都会被成本吃干净。2. 甲、乙、丙三款工具的能力边界谁适合什么周期2.1 工具甲脚本型本地回测框架自由度换工程量甲这类工具的特征是本地运行、代码驱动、数据源自己接。它的回测引擎通常是事件驱动的你写策略逻辑它按时间轴逐根推送行情撮合规则由你自己定义。优点是几乎没有任何隐含假设——成交价、手续费、滑点、涨跌停约束全都写在你的代码里你不写它就不加绝不自作主张。这个特性对短周期策略是刚需。我做日内到周频的策略时只敢用甲因为只有它能让我精确控制“信号在T日收盘后生成、T1日开盘集合竞价成交、涨停板上的买单直接判定失败”这一整套流程。别的工具要么不给你这个粒度要么给了但默认关着。代价是工程量大。数据清洗、复权处理、成分股调整、退市股票处理全得自己搞定。我最早搭的一套环境光是把前复权因子和真实成交价对上就花了两周。还有个隐形成本甲类工具不提供交易通道回测跑完要落地实盘你得自己接券商接口中间那层委托管理、状态同步、异常重试又是一摊活。2.2 工具乙可视化低代码平台快但接受它的撮合简化乙这类是网页端拖拽式的内置因子库、内置股票池、内置回测引擎点几下就能出净值曲线。它的核心价值是“把想法变成曲线的时间从两天压缩到两小时”特别适合做因子初筛和思路验证。但它的撮合模型一定是简化的这是产品定位决定的——要快就不能做太细的逐笔模拟。常见的简化包括按收盘价或次日开盘价统一成交、不考虑涨跌停无法成交、滑点用固定比例而非按成交额建模、不支持部分成交。用它做月频、季频的宽基轮动误差可以接受用它做周频以下的策略误差会大到让结论反转。我自己的用法是乙只做“这个因子有没有单调性”的判断一旦确认有效立刻把逻辑搬到甲里重跑一遍完整版回测。两边结果差得离谱的说明因子对成交假设极度敏感实盘大概率跑不出来直接放弃。这个交叉验证的习惯帮我避开了不少看着漂亮实则脆弱的策略。2.3 工具丙行情终端内置的策略模块离交易最近丙这类是行情软件里带的策略功能优势在于行情和交易是同一套系统——你看到的盘口就是你要下单的盘口委托直接进券商通道中间没有数据延迟和接口转换。用它做执行和监控体验是甲乙都比不了的。它的短板在回测。丙的回测模块通常比较薄历史数据深度有限、撮合规则固定且不透明、不支持自定义成本模型。我基本不用它做策略研究只用它做两件事一是盘中监控持仓的实时偏离二是执行甲算出来的调仓清单。三者的定位可以用一张表说清楚维度工具甲工具乙工具丙数据自主性完全自主需自建平台内置不可替换平台内置实时性好撮合精度自定义可做到逐笔简化统一价成交弱规则不透明交易对接需自行开发一般不支持原生支持适合持有周期1日到数月月频到季频日内到周内执行主要风险工程量大、易写错过度乐观的回测结果回测不可信3. 短持有周期路线工具甲把细节交给你也把坑交给你3.1 撮合模型的默认假设会把收益凭空做高用甲类工具第一件事是检查它的默认撮合配置。很多框架开箱即用时默认是“信号生成当根K线收盘价成交”这就是未来函数。正确的写法应该是信号在T日收盘后确认订单在T1日执行。A股还有一层特殊性T1交收制度意味着当天买入的股票当天不能卖出。如果你的策略逻辑里存在“早盘买入、尾盘卖出”这种日内往返回测必须显式禁止否则会跑出一个现实中根本不存在的收益曲线。我在早期版本里就犯过这个错一个均值回归策略回测年化40%实盘一上就跑不动查了三天才发现是日内回转被制度卡住了。涨跌停的处理同样不能省。一字涨停的股票买不进一字跌停的股票卖不出这在回测里必须写成硬约束如果次日开盘价等于涨停价且全天封死买单判定失败。简化一点的做法是判断“次日开盘涨幅超过9.8%则放弃买入”虽然粗糙但比完全不处理强得多。停牌也得管。停牌期间无法交易复牌后往往有跳空如果回测直接把停牌期的价格用前一日收盘价填充等于免费获得了一个无波动的避风港会显著低估回撤。正确做法是标记停牌、冻结该标的的调仓、复牌首日按真实价格重新计算。3.2 滑点建模三种粗糙做法和它们的偏差方向滑点是最容易拍脑袋的参数。我见过三种常见做法偏差方向完全不同第一种固定金额滑点比如每笔扣0.01元。这种做法对小盘股严重低估、对大盘股略微高估而且完全不随成交量变化属于最省事也最不靠谱的。第二种固定比例滑点比如成交额的千分之一。比第一种好但仍然忽略了一个关键事实滑点跟你下的单占当日成交量的比例强相关。同样买100万买一只日成交10亿的票和买一只日成交2000万的票冲击成本差十倍。第三种按参与率建模。这是我目前用的方式假设你的委托量不超过该股当日成交量的V%比如5%则滑点约为一个基础值超过则按超出比例线性放大。写成公式大致是滑点率 基础滑点 冲击系数 × max(0, 委托量/日均成交量 - 参与率上限)基础滑点取万分之五冲击系数取0.1参与率上限取5%。这套参数不是精确解但方向对了能有效拦住那些“容量极小、一放大就失效”的策略。我用它筛掉过好几个回测年化很高、但实际只能容纳几十万资金的策略。对应的代码片段大致长这样def calc_slippage(order_amount, adv, base0.0005, impact0.1, cap0.05): ratio order_amount / max(adv, 1) extra max(0.0, ratio - cap) return base impact * extra # 买入时按滑点上浮卖出时按滑点下调 buy_price raw_price * (1 calc_slippage(amount, adv)) sell_price raw_price * (1 - calc_slippage(amount, adv))3.3 短周期策略必须自己算一遍换手率短周期不等于高换手这个区别很多人没分清。一个持仓5天、但每次只替换20%仓位的策略年换手率可能是500%一个持仓20天、但每次全仓清空重建的策略年换手率是1200%。后者成本反而更高。所以调仓规则里我固定加一条只交易变动部分。具体实现是把目标权重和当前权重做差只有偏离超过阈值的标的才生成订单其余持仓不动。阈值取多少我的经验是偏离0.5%以内不动手因为一次交易的成本大约0.25%偏离小于成本阈值的调仓是纯亏。这条规则还有个副作用是降低了对调仓日期的敏感度。全量重建的策略调仓日选月末还是月初结果能差出三五个点增量调整的策略对这个不敏感因为它本来就只在必要的时候动手。4. 中长周期路线工具乙的再平衡陷阱与成本测算4.1 定期调仓的日期选择影响比你想的大月频轮动听起来很简单——每月固定一天调仓。但选哪一天结果差异不小。月末最后一天和次月第一个交易日中间隔着月末效应周一和周五隔着一个周末的情绪累积。我做过一次对比同一套因子、同样的持仓数量只把调仓日从“每月最后一个交易日”改成“每月第15个自然日”五年回测的年化差了近两个点。这个差异不是策略本身的alpha而是日期带来的噪声。处理方式有两种一是把调仓日固定下来后不做优化接受这个噪声二是把调仓拆成几个批次比如在月末前后三个交易日内分批完成用时间分散掉单日噪声。我个人倾向前者因为后者会增加交易次数和成本而且本质上是拿成本去买平滑不划算。还有个细节是节假日顺延。如果调仓日正好落在长假前一天市场流动性会明显变差此时大额换仓的冲击成本更高。工具乙一般会自动顺延到下一个交易日但顺延后可能撞上一堆资金同时调仓的日子反而更挤。我的做法是提前判断如果调仓日临近长假就提前一到两天完成。4.2 把换手成本摊到桌面上算一遍这是我认为最值得花十分钟做的事。拿一张表把不同调仓频率下的年化成本损耗算清楚调仓频率年调仓次数单次换手率年换手率年成本损耗按0.25%/次完整换手日频全换250100%25000%约62.5%周频全换52100%5200%约13%月频全换12100%1200%约3%月频换40%1240%480%约1.2%季频换50%450%200%约0.5%看到这张表就明白为什么个人做日频全换几乎必死——不是策略不行是成本结构不允许。真正可行的短周期策略必然是低换手率的持仓分散、每次只换一小部分、靠信号衰减而非强制轮动来驱动调仓。工具乙在这件事上的短板是成本模型不可调。它的回测默认按固定费率扣你没法告诉它“我的账户佣金是万二点五、最低5元、滑点按参与率算”。所以用它跑出来的净值成本项永远是偏乐观的。我的处理办法是跑完之后手动把年化收益减去估算的成本差额用这个修正值做决策——粗糙但比不加修正强。4.3 因子失效的监控要比调仓更频繁月频调仓意味着你一个月才动一次手但因子失效可能发生在月中。如果完全不监控等下次调仓才发现已经晚了。所以我一般会在工具乙里挂几个监控指标每周看一次滚动IC是否跌破阈值、多空分组的单调性是否还在、行业暴露是否漂移过大。工具乙在这方面的便利是内置了分组回测和IC计算点一下就能出图。我设的警戒线是滚动20日IC连续三周为负且绝对值超过0.03就认为因子进入失效观察期暂停新开仓只做减仓不做加仓。这条规则没有严格的理论依据纯粹是我自己踩坑踩出来的经验值——它能过滤掉大部分“因子短期失灵但长期还在”的误判又不至于太灵敏导致频繁空仓。5. 执行层工具丙补上从信号到成交的那一段5.1 分批换仓的节奏设计信号生成到全部成交之间隔着一段路。一笔百万级的订单一次性砸进去冲击成本可能吃掉几个基点的收益拆成五笔在一天内打完又可能被行情变化稀释掉信号。这中间的平衡点我摸索出来大概是“按日成交量的3%到5%作为单笔上限分2到3个交易日完成”。工具丙在这件事上有天然优势因为它能看到实时盘口和逐笔成交你可以根据当下的流动性动态调整每笔的挂单量。我的操作习惯是调仓清单在开盘前由甲生成导入丙后先看集合竞价的委托量如果流动性足够就在开盘后半小时内分两笔完成如果盘口薄就拉长到全天用时间加权的方式摊。有个细节值得注意分批换仓会带来“部分持仓”的中间状态这个状态下的组合风险和你的目标组合是不一样的。如果调仓期间市场大幅波动中间状态可能吃亏。缓解办法是让换仓方向跟市场趋势一致——买入时如果当天上涨可以加快节奏下跌时放慢避免在恐慌中砸盘。这听起来有点像择时但实际操作中它就是执行层面的micro-timing属于交易成本管理的范畴。5.2 委托方式的取舍限价单和市价单的选择在量化执行里是个实打实的成本项。限价单省钱但可能不成交市价单必成交但可能滑点大。我的分层规则是高流动性标的日成交额10亿以上直接用市价单滑点损失可以忽略省下的时间成本更重要。中等流动性1亿到10亿限价单挂对手价允许2个跳动单位的让价成交概率大概八成剩下的用市价单补齐。低流动性1亿以下只用限价单上午挂一轮下午两点后如果还没成交评估是否放弃这笔调仓。放弃调仓这个选项很多人不敢用觉得清单上有就得执行完。其实不是。一次调仓的预期收益可能只有0.5%为了强行成交多付0.3%的冲击成本这笔交易本身就是负期望。宁可留到下一个调仓周期也不要为了“执行完毕”而亏钱。5.3 实盘账户和回测账户的每日对账这一步最枯燥但回报最高。我每天收盘后会做三件事核对持仓数量、核对现金余额、核对当日净值变动。三项都要和“如果按回测逻辑执行应该是什么样”做比对偏差超过千分之一就要找原因。常见的偏差来源就那几个成交价和预期价不符滑点估小了、有笔委托没成交流动性估高了、分红除权导致持仓成本和净值计算错位复权处理有问题、佣金最低5元的实际影响账户规模算错了。工具丙的成交回报能把这些细节全部露出来这是它相对于甲乙最大的价值——它让你知道你的成本假设到底准不准。我用这套对账流程发现过一个问题某个策略回测里假设的滑点是万分之五实盘统计下来平均是万分之十一差了整整一倍。原因是策略选出来的一批票日均成交额只有三千万左右我的建仓量占了当日成交的8%。后来把参与率上限设到5%重跑回测年化直接砍掉六个点。这个数字只有对账才能拿到。6. 回测实盘不一致时的排查顺序以及我常用的参数配置6.1 按固定顺序查别跳步偏差出现后最忌讳的是东查一下西查一下。我固定按这个顺序走四步之内基本能定位步骤检查项常见问题定位方法第一步数据复权方式不一致、停牌期价格填充、退市股未剔除对比同一只票的前复权价和实际成交价第二步撮合未来函数、成交价假设过于乐观、未处理涨跌停打印信号时间与成交时间的时间戳第三步成本印花税漏扣、佣金最低5元未建模、滑点偏小用实盘成交明细反算实际费率第四步执行委托未成交、分批未完成、资金不足逐笔对比委托单和成交单顺序不能乱。数据错了后面三项白查撮合错了成本算得再准也没意义。我见过最离谱的情况是有人直接跳到第四步查执行花了两周才发现根子上是前复权因子在除权日之后重算了历史价格导致整段回测的买入价全部偏移。三款工具在这四步上的表现也不一样甲类的问题几乎全在前两步因为它不替你做任何假设写错了就是写错了乙类的问题集中在第二步和第三步撮合简化成本简化丙类的问题主要在第四步回测本身不可信反而执行环节最真实。6.2 我目前在用的一组参数这套配置是我自己反复调出来的不保证普适但作为一个起点比从零开始强调仓频率月频第15个自然日之后的第一个交易日换仓方式增量替换单券权重偏离超过0.5%才动手每次换手控制在40%以内持仓数量15到25只单券上限8%行业上限25%成本假设佣金双边万二点五最低5元印花税卖出千分之零点五滑点按参与率模型基础万分之五参与率上限5%超过则折算滑点现金缓冲常留3%到5%应对调仓时的资金调度单券上限8%这个数字来自一个很朴素的考虑如果我判断错了某一只票8%的仓位跌30%对组合的影响是2.4%还在我能承受的范围内。行业上限25%是为了防止因子在某些行业上的暴露过度集中——我做过分组统计行业集中度高的组合回撤幅度明显更大。最后分享两个我觉得最值钱的习惯。一个是新策略上线前先用小资金跑三个月不要相信任何回测结果包括自己写的工具跑出来的。三个月能覆盖一次完整调仓周期足够暴露出成交、成本、执行上的大部分问题。另一个是每个月固定花半天重新算一遍成本因为佣金费率会变、市场流动性会变、你的账户规模也会变去年成立的参数今年可能就不成立了。我自己就吃过一次亏账户规模翻倍之后原先按5%参与率设计的建仓方案变成了8%滑点直接超预算四成。这套东西没有多高深核心就是一句话把工具替你做的假设一条条挖出来用自己的数据重新填一遍。做到这一点你会发现策略好不好是第二位的能不能被正确执行才是第一位的。