个人股票量化软件这个话题我在几个圈子里被问过不下二十次问法都差不多有没有一款装上去就能跑、跑完就能出结果的东西。真正值得掰扯的其实是后半句——同一套信号逻辑持有周期从5个交易日拉到30个交易日或者换仓方式从“到期全换”改成“排名跌出去才换”回测曲线能差出一大截实盘的对账结果更是两码事。这篇就按我自己的路子把三款定位完全不同的个人股票量化软件拆开讲一款本地回测型、一款在线托管型、一款信号提醒型分别适配什么样的持有周期、换仓节奏该怎么配、参数怎么算、坑埋在哪。文中不点具体产品名只讲能力边界和配置思路工具A/B/C是代号你按这个画像去套手里正在用的那款就行。适合刚把数据跑通、正准备把策略从笔记本搬到每天固定流程里的朋友也适合已经跑了大半年、发现实盘和回测对不上的老哥。先把话说在前面下面所有数字都是参数演示不构成任何操作建议市场怎么走谁也说不准工具只负责把你想的规则忠实执行。1. 先立框架三个约束条件决定一切在挑软件之前有三个东西已经把你的选择范围框死了只是很多人没意识到。这三个条件不是软件功能而是你自己的处境先想明白再谈工具能省掉大量试错成本。我把它们分别叫作时间约束、成本约束和执行约束下面一条条拆。1.1 时间约束你每天能坐在电脑前多久时间约束是最容易被低估的一条。持有周期本质上是“你需要多频繁地做决策”而每次决策都要占用注意力。一个日频换仓的策略意味着每个交易日收盘后你要更新数据、跑信号、核对持仓、生成订单、第二天开盘处理成交回报中间任何一环断了当天就等于裸奔。我见过不少人一开始雄心勃勃选了5天持有期的短周期轮动跑了两周就撑不住了——不是策略不行是每天下班回家还要盯一遍流程第三周开始漏跑第五周干脆放弃。所以选持有周期之前先诚实回答工作日晚上能稳定拿出多少分钟能接受连续多少天不间断按我的经验可以粗分成三档每天能拿出30分钟以上、且能保证不间断的才有资格碰10天以内的短周期每周只能集中处理一次的老老实实做20到60天的中周期一个月才想起来看一次的直接上季度级别的低频或者干脆做指数层面的配置调整。这个自我评估比任何回测都重要因为它决定了策略能不能活下去。1.2 成本约束换手是有价格的第二条约束是硬成本很多人算收益的时候特别精细算成本的时候一笔带过。一次完整的换仓卖掉一只、买入另一只要付的钱包括买入佣金、卖出佣金、卖出环节的印花税、以及最容易被忽略的滑点。这四项加起来在常规设置下大约是千分之二上下看着不多但乘上换手次数就吓人了。我在第3节会给出完整的倒推计算这里先给个结论持有周期越短成本占预期收益的比例越离谱。5天持有期的年化成本能吃掉十几个点20天降到两三个点60天不到一个点。这意味着短周期策略必须靠极强的信号强度去覆盖成本而强信号往往意味着更脆弱、更容易失效。成本约束和信号稳定性之间是负相关关系这是短周期策略最难跨过去的坎。1.3 执行约束你的手比你的代码更容易出错第三条是执行精度。软件算出来的目标持仓和真实账户里的持仓中间隔着一个“执行”。自动下单的执行误差小人工执行误差大。人工执行的问题不在于你不会操作而在于忘记、犹豫、改价改多了、看到盘中跳水临时放弃、看到拉升追进去这些都会让实际持仓偏离目标偏离累积起来策略的回测就不再代表你的实盘。所以换仓方式和工具形态必须匹配。高频换仓必须配自动执行或半自动执行低频换仓才适合人工介入。这条听起来像废话但我见过太多人用信号提醒工具跑周频轮动三周之后持仓已经和信号差了七八只还以为是策略失效。2. 三款工具的能力画像与适配边界接下来说三款工具。我不点名字只描述画像你对照手里的软件看它属于哪一类就能知道它能承载多高的换仓频率。这个分类维度不是按功能多少分的而是按“谁负责计算、谁负责执行、谁负责运维”分的因为这三件事的归属直接决定了策略的上限。2.1 工具A本地回测型研究的放大镜工具A的形态是装在自己电脑上的回测框架数据要自己接策略要自己写参数自己存。它的最大价值是完全可控调仓逻辑精确到某一天的开盘价还是收盘价成交、手续费按万分之几扣、涨停板能不能买入、停牌怎么处理全都是你说了算。做研究、验证想法、扫参数它是唯一能给你足够自由度的东西。代价是它只管算不管跑。回测跑完实盘要你自己每天把当日数据推进去生成信号然后手动或者半自动去执行。它的“持有周期”能力理论上是无限的日频、周频、月频都能做但能不能长期跑下去取决于你有没有精力维护那条每日流水线。我在工具A上跑过5天持有期的均值回归回测效果不错实盘坚持了六周最后败在数据更新和异常处理上——某天数据源延迟信号算出来是空的人工补跑又漏了两只从那之后我就把短周期策略从工具A上撤了。工具A适配的持有周期20天以上最舒服10天以内要配套极强的自动化脚本否则不建议。2.2 工具B在线托管型把运维成本外包工具B的形态是网页端或客户端里的策略托管环境数据、计算、调度、下单通道都给你准备好了你只需要把逻辑写进去设好运行时间剩下的它来。它解决的核心痛点是运维不用自己搭数据管道不用每天手动触发不用担心电脑关机定时任务到点自己跑。但工具B有一层隐形的限制调度粒度决定了你的换仓方式上限。多数在线环境是按日调度的也就是每天固定时间算一次算完的信号只能在下一个成交时点执行。这就带来一个必须想清楚的问题你的信号是用什么价格的数据算的又用什么价格成交的如果拿当日收盘价算信号、又在当日收盘价成交这就是典型的未来函数回测会漂亮得不像话。工具B的另一个特点是参数配置通常被封装好了你改不了太底层的成交假设比如滑点只能填一个固定值不能按标的市值分档。这对短周期策略是致命的因为短周期的收益对滑点极其敏感。工具B适配的持有周期20天到60天的中周期最稳调度粒度和成交假设都够用10天以内要确认它对成交时点的处理方式否则回测结论不可信。2.3 工具C信号提醒型人工执行的折中方案工具C的形态更轻它不负责完整回测也不负责托管运行主要功能是按你设定的规则盯盘、算排名、在条件触发时给你推送提醒。你收到提醒自己去下单。它的优势是门槛低、上手快不需要写太多代码适合已经有自己一套选股逻辑、只是缺一个“什么时候该动”的提示的人。它的短板同样明显执行精度完全依赖你本人。人工下单的滑点比程序化高出不少尤其在开盘那几分钟而且人会有情绪信号说卖你看它当天走势不错就多拿了半天这半天可能就把策略的边际收益吃掉了。所以工具C天然只适合低频一个月动一两次人工误差被摊薄影响可控一周动三次误差累积的速度会超过策略本身的收益。工具C适配的持有周期40天以上或者干脆做成季度级别的定期调整。越频繁它的价值衰减越快。2.4 三款工具横向对照维度工具A 本地回测型工具B 在线托管型工具C 信号提醒型计算自由度最高成交假设可细调中等参数多为预设低只算信号不下单运维负担全部自己扛平台承担几乎为零执行精度取决于自建脚本较好自动执行依赖人工误差最大适合持有周期20天以上20-60天40天以上换仓方式上限任意含分批滚动定期阈值触发定期为主主要风险流水线断掉、数据出错成交假设不符、滑点失真执行偏离、情绪干扰这张表我建议你打印出来贴在显示器旁边。选工具不是选“最强”是选和你时间、成本、执行能力最匹配的那一个。很多人一开始就上工具A觉得自由度高结果发现自己真正缺的是运维三个月后转投工具B白白浪费一季度的学习时间。3. 持有周期怎么定用换手成本倒推这部分是全文的核心。持有周期不是一个凭感觉拍的数字它可以被算出来。算法很简单先算出一次完整换仓的成本率再看你预期能拿到多少超额收益两者一比就能得出“持有期至少要多长才不亏”。3.1 一次完整换仓到底花多少钱把一次“卖旧买新”的所有费用列出来。以下是我自己常用的参数你可以按自己账户的实际费率替换买入佣金万分之三即 0.03%卖出佣金万分之三即 0.03%卖出环节税费万分之五即 0.05%双边滑点按成交价与决策价的偏离估算各万分之五合计 0.1%过户费等零碎合计约 0.002%可忽略一次完整换手的成本率 卖出端0.03% 0.05% 0.05% 买入端0.03% 0.05% 0.13% 0.08% 0.21%。这个数字就是你每次“换一只股票”要交的过路费。注意这是单只标的的换手成本不是组合层面的两者区别我在3.3节讲。3.2 用年换手次数把成本摊到年化如果策略平均持有 N 个交易日且每次到期全额换掉那么一年大约换 250/N 次按每年250个交易日粗算。年化成本率 (250/N) × 0.21%。平均持有期 N年换手次数年化成本率日均需覆盖的收益5 天50 次10.50%0.042%10 天25 次5.25%0.021%20 天12.5 次2.63%0.011%40 天6.25 次1.31%0.005%60 天4.2 次0.88%0.004%120 天2.1 次0.44%0.002%最后那列“日均需覆盖的收益”是最有说服力的持有5天的策略你每天平均要多赚0.042%才能打平成本持有20天只需要0.011%。看起来差距不大但放到“超额收益本来就稀薄”的现实里0.042%的日均要求意味着年化十几个点而且必须是稳定的、扣费前就存在的超额这个难度和0.011%完全不是一个量级。我的判断标准是这样的如果成本占预期年化超额的比例超过30%这个持有周期就偏短了除非你有非常硬的证据证明信号强度足够。按年化超额15%估算N20时成本占比17.5%可以接受N10时占比35%已经在警戒线上N5时占比70%基本没戏除非你把各项费率压到极低、且信号强到离谱。3.3 个股持有周期和组合换手率不是一回事这里有个特别容易混淆的地方我当年也栽过。上面算的是“个股平均持有N天、到期全换”的情形。但实际操作中组合里往往同时持有10到20只标的每次调仓只换掉其中一部分这时候组合层面的换手率会远低于“250/N”。举个具体例子组合持有20只标的每5个交易日调一次仓每次换掉其中的5只即25%那么单只标的的平均持有期其实是 5 × (20/5) 20 个交易日而不是5天。组合年换手率 (250/5) × 25% 12.5次组合级换仓等效于每年换12.5遍全仓成本还是2.63%和“20天持有期全额换”是一样的。这个换算关系非常重要因为它给了你一个调优杠杆你可以通过“提高调仓频率 降低单次换手比例”来实现相同的成本但获得更平滑的持仓结构。每5天换25%比每20天换100%对市场风格的适应更快单次冲击更小缺点是操作次数多了对执行的要求更高。这就是4.2节要讲的分批滚动换仓的由来。3.4 用“成本占比”做最终取舍把上面几条汇成一句操作口诀先定你能接受的年化成本占比我一般设20%到30%为上限再反推持有周期最后看这个周期和你的时间约束是否冲突。如果冲突要么降低预期收益目标要么提高信号质量没有第三条路。还有一个经常被忽略的点成本里的滑点是可以优化的。同一套策略用限价单在流动性好的时段分批建仓滑点能压到万分之一到万分之二用市价单在开盘瞬间冲进去滑点可能到万分之十。这中间的差距在短周期策略上足以决定生死。所以如果你的持有周期偏短先把滑点控制这件事做到位再谈别的。4. 换仓方式的四种实现与配置细节持有周期定了“多久动一次”换仓方式定“动的时候具体怎么换”。这两件事是正交的同样的20天持有期可以配四种完全不同的换仓逻辑换手率能差出一倍。下面四种是我实际用过的按换手率从高到低排。4.1 到期全额轮动最直白也最贵规则很简单持有满N天全部卖出按当期排名重新买入前K只。优点是逻辑干净、回测好写、不会产生“持仓越来越像指数”的漂移缺点是每次都是全仓换手成本最高而且对调仓日的选择极其敏感——万一那天正好赶上市场大跌或者流动性枯竭你的成交价会非常难看。这种方式的适用场景是标的池很小、排名变化剧烈的策略比如只有二三十只标的的行业轮动。如果你池子有几百只全额轮动的换手率会高到没必要这时候应该看4.3节的缓冲带。配置上有一个细节必须处理新旧持仓的重叠部分不要卖掉再买回。全额轮动时如果新排名里仍有原来持有的标的正确做法是保留不动只处理差异部分。有些回测框架如果不做这个优化会凭空多算一轮买卖成本回测结果会无端变差——这个坑我踩过查了两天才发现是框架默认行为。4.2 分批滚动换仓把冲击摊平把一次全换拆成多次小换。比如持有20只、目标持有期20天可以设成每5天换掉1/4四轮换完一遍。这样做的好处有三个单次成交金额小冲击成本低持仓始终处于不同“年龄”不会因为某一天的市场异常导致整体组合同时受伤调仓日的选择压力被分散不用纠结“月末还是月初”。代价是操作频次变成原来的四倍对执行的要求提高。用工具B做这套比较舒服因为调度是自动的用工具C做四倍的提醒意味着四倍的人工操作除非你能保证每次都按时执行否则不建议。参数上有个经验值单次换手比例控制在20%到30%之间低于20%换仓效率太低高于30%就接近全额轮动了分批的意义不大。另外要注意分批换仓时每次的买入名单要基于当期最新排名不能沿用上一轮的名单否则会买进已经掉出前列的标的。4.3 排名缓冲带触发换手率的最优解这是我认为性价比最高的一种方式核心思路是给买入和卖出设两个不同的门槛。假设标的池60只目标持有10只买入条件是排名进入前10卖出条件是排名跌出前25。中间那15个名次就是缓冲带标的在这段区间里波动时不动手。这个设计的精妙之处在于它把“排名小幅波动”这种噪音过滤掉了。没有缓冲带的话第10名和第11名之间来回跳一次你就得换一次仓纯粹给券商送钱。加了缓冲带之后换手率通常能降30%到50%而收益几乎不受影响因为被过滤掉的都是边际信号。缓冲带宽度怎么定我的经验是按目标持仓数的1.5到2.5倍来设卖出阈值。持有10只卖出阈值设在15到25名之间持有20只设在30到50名之间。设得太窄起不到降换手的作用设得太宽会导致持仓老化、信号衰减。用工具A实现这个最灵活几行判断就能写工具B一般也支持需要在策略参数里找到“调仓阈值”之类的设置项工具C如果只支持“排名前N”的简单规则可能做不了双阈值那就得靠人工在收到提醒时自己判断可靠性会打折。4.4 信号触发加冷却期防止来回打脸前三种都是基于排名的这一种是基于信号的。规则是当某个标的的信号强度超过买入阈值时买入跌破卖出阈值时卖出同时给每只标的设一个冷却期——卖出后M个交易日内不允许重新买入。冷却期解决的是一个很实际的问题震荡行情里信号可能在阈值附近反复穿越导致你卖了又买、买了又卖。加了冷却期之后短期内不会重复操作同一只标的换手率显著下降。冷却期长度怎么设我一般取平均持有期的三分之一到二分之一。比如目标持有30天冷却期设10到15天。设太短没效果设太长会错过真正的二次机会。这种方式的麻烦之处在于它对参数极度敏感阈值和冷却期两个参数一组合很容易调出“回测完美、实盘崩坏”的结果。所以用它的时候必须做样本外验证别拿全样本最优参数直接上。4.5 四种方式在三种工具上的落地差异换仓方式工具A工具B工具C到期全额轮动完全支持可精确控制成交价支持注意重叠持仓优化支持但人工执行误差大分批滚动换仓支持需自建调度支持调度自动不推荐操作频次过高排名缓冲带支持最灵活多数支持需找对参数项部分支持可能要人工判断信号冷却期支持逻辑自己写支持度看平台不推荐阈值难以及时传达这张表的用法是反过来的先确定你想用哪种换仓方式再看你手里的工具能不能承载。承载不了就换方式别硬上。我见过有人用只能做简单排名的工具去实现信号冷却最后靠 Excel 手工记录卖出日期坚持了两个月就乱了。5. 实操从数据落地到每日跑批前面讲的是设计这一节讲落地。很多人卡在这一步道理都懂真跑起来各种报错。我把自己现在用的流程完整走一遍你可以照着搭。5.1 数据准备复权处理是最容易出错的地方回测和实盘都必须用复权价算信号这一点没有争议但细节上分歧很大。我的做法是信号计算用后复权价保证历史序列连续不会因为分红除权产生假跳空成交金额和费用计算用不复权的真实价格因为你的账户里扣的是真金白银。为什么不能统统一把梭用后复权因为后复权价格是经过比例缩放的早期价格可能被放大很多倍用它算“买100股要多少钱”会得出荒谬的结果。这个错误非常隐蔽回测收益率看着正常但资金曲线和实际投入对不上查起来很费劲。另外两个数据细节一是停牌处理停牌期间不能用最后成交价填充否则回测会把停牌期的价格当成真实可交易价格产生虚假收益二是新股和退市标的的处理池子里如果包含已经退市的标的而你没有对应数据会产生幸存者偏差回测收益会系统性偏高。这两点在任何一本量化教材里都会提但真正做的时候十有八九会漏。5.2 调仓日怎么选避开三个时间点调仓日的选择看着是小事实测对结果影响不小。我一般避开三类时间点第一类是长假前的最后两个交易日。这几天资金面通常偏紧成交量萎缩买卖冲击成本明显高于平常同样的单子可能多滑好几个点。第二类是重要数据密集披露的窗口。这个不用展开总之那几天的价格波动里有很多非理性成分用它做决策容易被带偏。第三类是标的池集中调整的时间。如果池子里有标的因为各种原因被临时调入调出那天的排名会失真。具体选哪天月末最后一个交易日和次月第一个交易日是两个常见选项我倾向后者因为月末那天经常有资金面的扰动。但这也取决于你的数据和执行时间没有绝对优劣关键是固定下来不要每次临时改。调仓日一旦开始随机化回测就没法复现了。5.3 参数扫描与样本外验证别只看最优点参数扫描这一步几乎所有人都会犯同一个错把收益最高的那组参数拿来用。问题是收益最高的那组往往是过拟合最严重的那组。我的做法是看“参数平原”而不是“参数尖峰”。具体说把持有周期、缓冲带宽度、持仓数量这几个参数做成网格跑完之后不找单点最优而是找一片连续的高收益区域取区域中心作为参数。这样选出来的参数在样本外的表现通常更稳。样本外验证的做法是留出最近一到两年的数据完全不参与调参等参数定死之后再跑一遍。如果样本外收益只有样本内的一半以下说明过拟合严重参数得重新想。更严格一点可以做滚动窗口验证用前三年调参、第四年测试然后窗口往后滚一年重复若干次看各窗口的表现是否稳定。这套流程麻烦但能过滤掉大部分自欺欺人的策略。5.4 每日运行流程一张固定的清单工具A和工具B的日常流程我合并成一张清单按顺序执行任何一步失败就停下来查不要跳过数据更新确认当日行情数据完整标的数量和预期一致缺数据的标的单独标记。信号计算跑当期排名或信号值输出到一个带日期的文件里方便回溯。目标持仓生成结合当前持仓、缓冲带规则、冷却期算出需要买入和卖出的清单。约束检查检查单只标的权重上限、行业集中度、可用资金、涨跌停和停牌状态剔除不可交易项。订单生成与执行按清单下单记录每笔的决策价和成交价。对账收盘后比对目标持仓与实际持仓差异超过阈值就标记出来第二天开盘处理。第6步的对账最容易被省略但它是发现问题的唯一手段。我现在的习惯是每天记录四个字段日期、标的、目标权重、实际权重。连续几天出现同一只标的偏离就说明执行环节有系统性问题得停下来查。5.5 成交假设怎么设才接近真实回测里的成交价假设直接决定了回测和实盘的差距。我的设置原则是“宁可保守”信号用当日收盘价计算成交假设为次日开盘价而不是当日收盘价。这一条能过滤掉绝大多数未来函数。次日开盘如果涨停对买入而言或跌停对卖出而言视为无法成交顺延到下一个交易日。滑点按标的分档流动性好的设万分之五流动性差的设万分之十到万分之十五。手续费按账户实际费率填不要用默认值。按这套设置跑出来的回测收益通常比“理想假设”低不少但这个数字更接近你能拿到的东西。我宁可要一个难看的真实数字也不要一个漂亮的假数字因为后者会让你在实盘里用真金白银去补差价。6. 常见问题与排查实录这一节是我这几年积累的问题清单按出现频率排序。每一条都对应过真实的时间和金钱成本希望你能少走一遍。6.1 回测漂亮实盘拉胯的五个原因原因一未来函数。最典型的是用当日收盘价算信号、又用当日收盘价成交。检查方法很简单把成交价改成次日开盘价再跑一遍如果收益腰斩说明原回测严重依赖未来信息。原因二幸存者偏差。池子只包含现在还活着的标的退市的、被并购的都没算进去。修正方法是使用包含退市标的的历史成分数据或者至少在做行业轮动时用当期真实成分而不是用今天的成分回推历史。原因三滑点低估。回测里填万分之二实盘里小市值标的实际滑点可能是万分之十。修正方法是在回测里按市值分档设滑点小市值档位设高一些看看策略还成不成立。原因四涨跌停和停牌没处理。回测里假设所有信号都能成交实盘里涨停买不进、跌停卖不掉。修正方法是在下单逻辑里加可交易性判断不满足条件的顺延。原因五参数过拟合。这个前面说过不再展开只提醒一句任何一组参数如果它在相邻参数上的表现断崖式下跌那它就是过拟合的别用。6.2 换仓执行环节的高频故障现象可能原因排查方法处理方式目标持仓和实际持仓差好几只下单漏执行或部分成交逐笔核对当日订单状态次日开盘补齐记录漏单原因某只标的反复买卖缓冲带太窄或冷却期缺失查该标的近期排名波动加宽卖出阈值或加冷却期实际成本远高于回测滑点设置过低或交易时段不佳对比决策价与成交价偏离改分批下单避开开盘瞬时信号算出来是空的数据源缺数据或字段变更检查当日数据完整性和字段名加数据校验异常时告警停止组合权重偏离目标单只标的大涨大跌后未再平衡对比权重偏离度设偏离阈值超过就触发再平衡调仓日收益异常撞上长假前或数据披露窗口查当日成交量和波动调整调仓日固定避开这些时点这张表我建议你存一份出问题的时候先查表比从头推理快得多。6.3 几条不太好写进文档的经验第一条先跑三个月模拟再动真钱。模拟盘不是为了验证收益是为了验证流程。流程跑顺了收益才有意义流程跑不顺收益再高也是运气。第二条把换手率当成一个独立的监控指标。很多人只盯收益和回撤不盯换手。换手率突然翻倍往往意味着信号在震荡市里失效了或者缓冲带被突破了这时候该停下来看而不是继续跑。第三条持有周期不要中途改。策略跑着跑着觉得持有期太长改成短的过两天又觉得太短改回去。这种反复调整会让策略永远处于“未验证”状态你根本不知道赚的钱是策略的还是运气的。要改就停下来重新做样本外验证通过了再上。第四条成本参数用真实成交回单反推。回测里填的费率是估的跑一段时间之后拿真实的成交回单算一遍实际成本率如果显著高于估计值把回测参数改过来重跑别让误差一直存在。7. 我个人在选型和配置上的几点体会最后说点散的。三款工具我目前是这么配的工具A用来做研究和参数验证所有新想法先在这里跑通样本外验证不过关就不往下走工具B用来跑最终上线的中周期策略持有期设在20到40天之间换仓用排名缓冲带调度自动我每周看一次日志工具C只当一个提醒器用来盯几只长期跟踪的标的一个月动一次纯人工执行。这个组合不是最优解但是它和我的时间、精力、执行能力是匹配的。如果只能给一条建议我会说先把持有周期和换仓方式写在纸上写清楚“我多少天动一次、动的时候换多少、什么条件下换、什么条件下不换”把这四条定死了再去挑工具。反过来做先挑一个功能最全的工具再回头想策略大概率会陷在功能里出不来。工具的复杂度是用来匹配策略复杂度的不是用来炫技的。还有一个很小但很实用的技巧给每天的运行日志加一行“今日是否按计划执行”就一个是和否。连续记一个月如果“否”超过三次说明你的流程设计有问题要么持有周期太短要么换仓方式太复杂要么工具不合适。这个自检比任何回测指标都诚实。