← 返回教程库

「保护」机制:把停手写进策略里

最后更新 2026-08-19
📚 量化与 AI 投研 📖 仓库导览 ⏱ 约 18 分钟 R2 · 注意风险
你将学到
  • 说得出「暂停交易」在系统里为什么不是一个开关,而是一条有对象、有期限、有理由、会自己到期的记录
  • 分得清止损和保护这两层风控各自管什么——一个管单笔、看价格、动作是平掉;一个管一段时间、看已完成交易的统计、动作是不许开新的
  • 说得出这套规则为什么住在策略里而不是配置里,以及这个位置决定了回测必须带着它一起跑

你在本子上写过这么一句:「最近不太顺,先停几天。」

写的时候特别清醒,也特别有道理。问题是这句话第二天就开始漏气——停几天?从哪天算起?停的是所有东西,还是只停我在那个亏得最惨的品种上的动作?我手上还拿着的那几笔,算不算「停」的一部分?还有最要命的一个:三天之后我怎么知道自己该回来了,是靠翻本子,还是靠那天早上的心情?

这些问题你不回答,那句话就只是一句情绪。而如果你要让一台机器执行它,你就必须一个一个回答,一个都躲不掉。

这篇要看的,就是一个开源交易框架把这件事做成了什么样子。看的不是它提供了哪几种停手规则——那个话题在 连着亏了几次,该怎么办一个策略什么时候该停掉 里已经从「你该怎么判断」的角度拆过了。这篇换一个视角:这套东西在系统里被放在哪一层、旁边挨着谁、为什么不能放在别处。 位置这件事,往往比功能本身更能说明设计者是怎么想的。

先把「我要停手」这句话拆开

假设你要把这句话交给一个完全不会揣摩你意思的助理去执行。他会立刻问你三个问题:

停谁? 是所有品种都不许碰,还是只有那一个?(品种就是你交易的那个具体对象,一只标的、一个合约、一个币对,都算。)

停到什么时候? 必须给一个时刻,不能给一个感觉。「等我缓过来」这种说法他没法执行。

停手期间,手上已经买了的那些怎么办? 这一问最关键,也是绝大多数人写在本子上时压根没想过的。

这三个问题就是一整套设计的骨架。你会发现真实系统给出的答案,跟你本子上那句话的差别,全在这三处。

停手在系统里是一张条子,不是一个开关

先说生活里的类比。

小区门口贴过一张纸:某某单元电梯检修,停用,至几月几日几点,落款是物业。这张纸上有四样东西——停的是哪部电梯、停到哪一刻、为什么停、谁贴的。少了任何一样,这张纸就会变成一场纠纷:住户要么不知道该不该走楼梯,要么等到第八天还在等一个没人负责解除的状态。

有意思的是,这张纸最重要的属性不是「停」,而是它自己会到期。到了那个时刻,不需要谁再来揭一次,它就失效了。

到了投资上,这个差别就变得很贵。人脑子里的「停手」是一个状态,不是一张条子:它没有明确的开始,没有到期日,没有写下来的理由。于是它有两种烂法——要么第二天早上你就忘了自己在停手期,看到一个顺眼的机会就进去了;要么正好相反,你停了大半年不敢动,早就过了当初想停的那个理由,只剩下一个说不清的怕。

到了系统里,这件事被做成了一个很朴素的结构:一次保护被触发之后,它产生的不是「停止交易」这个动作,而是一条记录。 这条记录里写着锁的是哪个品种(也可以是一个代表「全部」的通配符)、锁的是哪个方向(做多还是做空,还是两边都锁)、锁到哪一刻、以及因为什么被锁。它被存进数据库的一张表里,跟你的成交记录躺在同一个地方。

这里有两处值得停下来想想。

第一,它是一条数据,不是一个内存里的布尔值。 这意味着程序重启之后,锁还在。翻译成人话:你的停手期不该因为你关了一次软件、出差了三天、或者换了台电脑,就悄悄失效。 人的停手期恰恰最容易在这种缝隙里失效——不是你决定复出,是你就那么自然而然地又开始了。

第二,它带一个「为什么」的字段,而且这个理由会被原样打印在日志里。 系统告诉你的不是「暂停中」,而是「这个品种因为某某原因被锁到某时某刻」。这一栏看起来是个小事,但它决定了你三天后能不能对着这条记录做复盘。没有理由栏的停手,事后是无法复盘的——你只知道自己停过,不知道停的是不是同一件事又发生了一次。

如果你要把这套结构搬到纸上,那就意味着你的那张纸条得有四栏:停哪个、停到几号几点、因为什么、到期后按什么流程复查。不是形式主义,是这四栏少一栏,条子就执行不下去。

它只挡新开的仓,不碰你手上已有的

这是整套设计里最值得记住的一处,也是最容易被想反的一处。

源码里对锁的说明写得很直白:被锁住的品种不参与分析,并且被阻止开出新的交易。注意它说的是「开出新的」。你手上已经持有的那些,一根手指都没碰。

生活层的对应物是医院的急诊分诊。当一家急诊室人满了,它挂出的牌子是「暂停接诊新病人」,而不是「把在院的病人请出去」。这两件事不但不一样,方向甚至相反——正因为暂时不再接新的,在院的那些才能被照顾得更好。停止进新的,是为了把有限的注意力留给已经在手上的。

到了投资上,这个区分能救不少人。多数人心里的「停手」是一个含混的团块,一旦决定停,执行出来的动作往往是一次性把手上全清掉。可这是两个完全独立的决定:

  • 「我最近状态不好,暂时不该再开新的」——这个判断依据是你最近一段时间的整体成绩。
  • 「我手上这一笔该不该走」——这个判断依据是这一笔自己的情况,它可能好好的,也可能早就该按规则退出了。

把这两个决定绑在一起,结果通常是在最难受的那天做了一个最大的动作。而系统给出的做法是:保护只负责关上入口,出口那边该怎么走还是怎么走。

再往下看一层,这个分工在执行顺序上也是对上的。这个框架每一轮循环的动作顺序是固定的——先料理已有的持仓和委托,最后才去找新机会(这个顺序在 交易机器人开机之后,它一整天到底在忙什么 里拆得很细)。而全局的锁,恰好是拦在「去找新机会」那一步的最前面:一旦发现存在一把管全部品种的锁,这一整轮的找新机会就直接跳过了,日志里留下一句「锁到某时某刻,原因是什么」。

保护插在流程的哪一步,就说明了它管的是哪件事。 它站在入口,所以它管的永远是入口。

它和止损是两层,谁也替不了谁

很多人第一次看到这套机制会有个疑问:我已经有止损了,为什么还要这个?

先打个比方。你家里有两样管电的东西:一样是每个插座上的保险装置,某个电器出问题就把那一路切掉;另一样是总闸,一旦发现整体电流不对劲就整户断电。你不会觉得有了保险装置就不需要总闸——它俩看的东西根本不一样,一个看单个设备,一个看整体。

止损和保护就是这么两层。把它们并排放着看,四个维度全都不同:

管的范围不同。 止损管的是一笔单子;保护管的是一个品种、甚至整个账户在一段时间内的行为。

触发的依据不同。 止损看的是价格——现在这个价碰到了我设的那条线没有;保护看的是已经结束的那些交易的统计结果——最近这段时间里有几笔是被止损打出去的、这段时间的回撤(账户从高点往下缩水的幅度)有多深。

动作不同。 止损的动作是把这一笔平掉;保护的动作是不许开新的。前者处理存量,后者处理增量。

时间性质不同,这一条最要命:止损是即时的,保护是滞后的。保护要等交易结束了才能把它算进统计里,所以它天生看的是后视镜。

最后这一条得说透,因为它划出了这套机制能力的边界:保护救不了你正在亏的那一笔。 它不是预警,它是一个「刚才那几下不对劲,接下来先别动」的刹车。指望它替你避开下一次大跌,是把它的位置放错了。真正管单笔最大损失的是止损那一层,而止损自己在系统里也远比一个价格复杂——它其实是「一个不断被重算的价格 + 一条判定碰到了没有的规则 + 一笔真要去市场上成交的订单」三样东西,各自都会跑偏,止损:从心理问题变成数学问题 把这三处拆开过。

两层各管各的,缺哪一层都会露出一个大洞:只有止损没有保护,你会在一段明显不对劲的行情里反复被同一种方式割;只有保护没有止损,你单笔的亏损深度就完全没有上限——等保护统计到「最近几笔亏得很惨」的时候,那几笔已经惨完了。

为什么这套规则住在策略里,而不是配置里

这是本篇最想让你记住的一处,也是一个只有从「导览」视角才看得见的设计判断。

在这个框架里,一套软件通常有两个存放「你的意愿」的地方:一个是配置文件,一个是策略文件。配置放的是环境性的东西——连哪个交易所、日志怎么打、界面开不开。策略放的是你这套做法本身——什么条件进、什么条件出、每笔投多少。

保护规则被放在了策略那边。 它是策略对象上的一个属性,机器人启动的时候就把它一起带上了。更能说明态度的是另一件事:如果你把它写在配置文件里,这个框架不是给你一个警告然后凑合跑,而是直接拒绝启动,并明确告诉你这种写法已经被废弃

这个「拒绝」的力度值得琢磨一下。软件里废弃一个旧写法,最常见的做法是留一条警告、继续兼容个几年。而这里选择了让它硬失败——说明设计者认为,写在配置里这件事本身就是一个概念上的错误,不是一个风格问题。

生活层的对应:一盒药的用法用量印在药盒上,而不是贴在你家药柜的门上。因为那句话是属于这盒药的,不是属于这个柜子的。 你换一盒药,用法就得跟着换;柜子上贴的那张纸,只会在你换药之后变成一句误导。

到了投资上,这句话可以翻译成:你的停手规则不是一个环境设置,它是这套方法的一部分。

一套靠少数几次大赢撑起总账的做法,连亏本来就是它的日常;一套靠高频小赢积累的做法,连亏几次就已经很不正常了。同一条停手规则套在这两套做法上,一条会让你不停地误杀,一条会让你一直赖着。规则和做法是配对的,不是通用的。 而至于你自己那条线到底该画在哪儿、正常范围有多宽,那是 一个策略什么时候该停掉 的地盘,这篇只管位置不管数值。

住在策略里还带来一个连锁后果:它有版本了。 策略是你会存档、会改、会拿去回测的那个东西;配置是你随手改改就重启的那个东西。把停手规则放进策略,等于宣布它跟入场条件、出场条件是同一个层级的公民——改它就是改策略,改了就得重新验证。

住在策略里,就意味着回测得带着它跑

顺着上一节往下,一个必然的结论出现了:既然它是策略的一部分,那么回测(用历史数据把这套规则跑一遍,看看假设中的表现)就必须把它一起算进去,否则你测的根本不是你要用的那套东西。

这个框架确实把它算进去了。回测的主循环在决定「这根 K 线上能不能开仓」的时候,会去查一次这个品种当下是不是被锁着——和实盘走的是同一套判断。而且这里有个细节:回测模式下,那些锁不会被写进数据库,而是维护在内存的一个列表里。为什么要专门做这么一层?因为回测要在几秒钟里模拟几年,每一把锁都往数据库里写一遍,慢得没法用。这层设计本身就说明,锁在回测里不是个摆设,它是真的被大量创建和查询的。

但有一个前提:这套保护在回测里默认不生效,你得用一个显式的开关把它打开(那个开关叫什么、怎么写,以你手上那个版本的文档为准)。这句话看着平淡,后果却相当大——如果你没打开它就跑了一遍,你拿到的那份成绩单,是一台从不停手的机器跑出来的。

而你实盘一定会停手。那么你手上那份报告和你未来的经历之间,就隔着一整条你自己会加上去的规则。它改的不只是总收益,还有回撤的形状:停手期里你会错过反弹,也会躲开下跌,你的收益曲线会长出一段一段的平台。这个差异不会出现在报告的任何一格里,因为报告根本不知道有这回事。

这是回测和实盘对不上的诸多机制性原因中的一条,而且是少数几条完全由你自己造成、也完全可以由你自己消除的。其余那些系统性的缝隙,回测好看实盘亏,差的到底是哪三件事回测偏差地图 分别从两个角度铺开过。

顺带说一句:既然保护规则也是策略的一部分,那它当然也可以被拿去做参数寻优——而这恰恰是个危险的地方。一旦你开始「优化」自己的停手规则,你极可能是在挑一组刚好躲过了历史上那几段坏日子的数字。这类错配的完整机制在 超参优化:一个天生和过拟合纠缠在一起的功能 里讲过,用在停手规则上只会更隐蔽,因为它披着「风控」的外衣。

三个小设计,各藏着一句人话

看完大结构,有三个不起眼的细节值得单拎出来,每一个都能直接搬到你的纸条上。

一,锁只能往长了加,不能往短了改。 源码注释里写得很清楚:锁的时间只能累加。也就是说,正常运转过程中,系统不给自己留一个「提前把自己放出来」的口子。框架里确实存在一个手动解锁的方法,但它的注释同样直白——框架自己不使用它,它是留给使用者手动操作的。

翻译成人话:系统给你留了后门,但它自己从不走后门。 而人的停手期,几乎全是从走后门那一刻开始失效的——你没有取消它,你只是「就这一次」。

二,锁的到期时刻会被向上取整到下一根 K 线。 文档给的理由很实在:避免在一根 K 线内部突然冒出一笔预期之外的买入。源码里还有一句更细的注解,说的是如果锁在某个整点结束,而新的一根 K 线两秒后才到,那这两秒就留下了一道缝——一个基于旧信号的委托可能刚好从这道缝里钻出去。

一个系统愿意为两秒钟的缝隙专门写一段处理,是因为它知道这道缝里出来的东西一定是过期的。这件事在人身上是放大版的:停手期一满,你最想立刻执行的那个动作,通常正是你停手之前那个念头的延续——而那个念头,恰恰是被你判定为需要暂停的那批念头之一。解禁的第一天,最该做的事是重新看一遍,不是接着做。

三,工具只做形式校验,不做实质校验。 系统在加载你写的这几条保护规则时会检查一遍,但它检查的是格式上有没有互相打架——比如同一条规则里用两种互斥的方式指定了时长,或者时间格式写错了。它不会问「你设的这个次数合不合理」「这几条规则加起来会不会让你几乎永远处于停手状态」。

工具给的是格子,不是答案。 你在任何地方看到的一组具体数值,都只是别人填在自己格子里的东西,照抄没有意义——文档自己就写着,不是所有保护都适用于所有策略,参数需要按你自己的做法去调。

它明确不做的事

把边界说清楚,才算读懂了一个部件。

它不判断你该不该停。 什么条件算触发,全部来自你写进策略的那几个数。它对一组荒唐的数和一组深思熟虑的数,态度完全一样。

它不替你平仓。 停手期间你手上的仓位怎么处置,是止损和离场规则那一层的事,跟它没关系。

它救不了正在发生的亏损。 它看的是已经结束的交易,天生滞后。把它当成预警系统,是位置放错了。

它不评估几条规则之间的相互作用。 你叠三条上去,它就老老实实执行三条,哪怕这三条合起来让你一年到头有大半时间在停手期里。

它不能替代仓位。 一套会自动停手的机器,配上一个下得太重的仓位,仍然可以在触发保护之前就把你打到线以下——因为保护是靠已完成交易触发的,而单笔的深度归止损和仓位管。

说到底,这套机制交付的东西只有一样:把一句「我该停一停了」变成一条别人能查、会自己到期、且你不能在情绪上头时偷偷改掉的记录。 至于该不该停、什么时候停,它一个字都不替你想。

⚠️ 风险提示

本文是对开源项目源码与文档快照的概念性讲解,不构成任何投资建议、买卖信号、策略推荐、软件使用建议或收益承诺,也不推荐任何产品与平台。文中所有描述来自指定快照版本的阅读,不是运行结果,也未验证任何行为,具体表现以你手上那个版本的官方文档为准。文中不提供任何可照抄的阈值或参数。自动交易涉及程序缺陷、网络中断、数据异常、交易所故障等多种额外风险,任何自动停手机制都不能降低市场本身的风险,也不保证任何结果回测结果不等于实盘结果:一份未启用停手规则的回测报告,与你真实执行停手规则后的经历之间存在系统性差异,历史表现不预示未来收益。完整风险提示见 免责声明

小结

  • 「停手」在系统里不是一个开关,而是一条有对象、有方向、有到期时刻、有理由的记录,存在数据库里,重启不丢。你的纸条也该有这四栏。
  • 只挡新开的仓,不碰已有的仓。停止进新的和处理手上的,是两个独立决定,绑在一起做会让你在最难受的那天做最大的动作。
  • 它和止损是两层:止损管单笔、看价格、动作是平掉;保护管一段时间、看已完成交易的统计、动作是不许开新的。保护天生滞后,救不了你正在亏的那一笔
  • 它被放在策略里而不是配置里,写在配置里会被直接拒绝启动——因为停手规则属于这套方法本身,换一套做法就得换一条规则,它不是通用的环境设置。
  • 住在策略里的连锁后果是:回测必须带着它一起跑。默认不启用,你没打开就跑出来的那份成绩单,是一台从不停手的机器的成绩,而它改的不只是收益,还有回撤的形状。
  • 三个细节各值一句话:锁只能加长不能缩短(系统给你留了后门,自己却从不走);到期时刻向上取整到下一根 K 线(解禁后第一个动作最容易基于过期信息);系统只校验格式不校验合理性(它给的是格子,不是答案)。
  • 至于该停几次、停多久、什么条件下恢复,那是判断层的问题,见 连着亏了几次,该怎么办一个策略什么时候该停掉。这一层只负责让你的答案变成一件能被执行、且不能被临时反悔的事。

一句话说完这篇:所谓「保护」,就是把「我最近不太行,先别开新的了」这句话,写成一张贴在门上、写明了原因和期限、到点自己失效、而且中途撕不下来的条子——它不替你判断该不该贴,只保证贴上之后你赖不掉。

本文基于开源仓库的源码与文档快照做概念讲解,未实际运行该程序。想系统看这一卷的其他内容,回到量化与 AI 投研卷;这个仓库的整体定位与它坚决不做的那些事,见 这个开源交易框架,到底替你做了什么、又坚决不做什么

内容有错、看不懂、或想看下一篇?告诉我们 →

本文为投资教育整理,不构成任何投资建议;不荐个股/基金、不预测点位、不承诺收益。关键数据与结论请结合权威来源自行验证,并见风险免责声明