查出毛病之后,怎么把它变成一条真能执行的规矩
- 用四个特征逐条判断自己写下的一句话到底算不算规矩,而不是靠「听起来挺像回事」
- 把「我要更有耐心」这类愿望改写成有触发条件、有唯一动作、有解除时点、有记录的语句
- 用交易流水按标签分组的办法,算出自己对某条规矩的执行率,并知道为什么执行率要先于效果去看
你已经知道自己的毛病了。
流水拉出来看过一遍,赚钱的单子平均持有三天、亏钱的单子平均持有三十天;反事实那一遍也算过了,如果当初真的按计划走了,曲线是另一个样子;甚至连「赚一点就跑」这个习惯有多大,都量出了一个具体的数。
然后你在本子上写下三行字:以后要更有耐心。不追高。亏了要认。
三个月后翻到这一页,你会发现一件很扎心的事——这三行字,一次都没被执行过。不是你意志力不够,是这三行字根本没法执行。它们看着像规矩,其实一条都不是。
诊断这件事,前三篇已经做完了。这一篇只管最后一步,也是最难的一步:从「我知道我哪儿有问题」到「下次这个问题真的不会再发生」,中间要跨的那道坎。
先把「规矩」和「决心」分开
生活里你早就见过这两种东西
小区门口有两种管法。
一种是保安贴张纸:请大家自觉,不要占用消防通道。另一种是装一根道闸,车牌不在白名单里就是抬不起来。
第一种是决心——它需要每一个当事人在每一个具体时刻,重新做一次判断:我今天这么停算不算占用?就停五分钟应该没事吧?前面那辆车不也停着吗?
第二种是规矩——它不需要任何人判断。杆子抬不抬起来,跟你今天心情好不好、有没有急事、别人怎么做,全都无关。
再换个更贴身的例子。「晚上少吃点」和「晚上十点以后厨房关灯锁门,钥匙在另一个人手里」,这两句话不是同一个量级的东西。前者是你每天晚上要重新赢一次的战斗,后者是你只需要赢一次的战斗。
规矩的全部价值,在于它把「每次都要做的判断」压缩成「只做一次的设定」。
对你的账户意味着什么
交易里最贵的判断,全都发生在你最不适合判断的时刻。
价格跌破你原本想好的位置——这一刻你手上有浮亏(还没卖、账面上先亏着的那部分),心跳偏快,脑子里正在自动生成十条「再等等」的理由。你在这个时刻做的判断,质量一定低于你在一个安静的周末下午做的判断。
写规矩的本质,是让安静时候的你,替慌乱时候的你做决定。而这件事能不能成立,取决于你留下的那句话,慌乱时候的你能不能原样接住。「以后要更有耐心」这句话接不住,因为它需要慌乱的你自己解释什么叫耐心——而慌乱的你会解释成「再扛一天也是耐心」。
这也是量化系统里那些「保护性规则」为什么长成那副样子的原因。它们不是为了聪明,是为了在最糟的时刻不需要任何人聪明。
一条好规矩的四个特征
我把它拆成四条。四条全中,才叫规矩;缺一条,那句话在关键时刻就会漏。
特征一:触发条件是客观的
生活层。 医院分诊台不会问你「你觉得自己烧得厉害吗」,它给你一支体温计。体温计的意义不在于精确,在于你和护士看到的是同一个数。凡是需要「我觉得」才能判断的条件,都不是条件。
投资层。 检验一个触发条件够不够客观,有个特别好用的土办法:把这句话交给一个完全不认识你、也不懂你想法的人,他能不能在不问你任何问题的前提下,判断出今天到底触没触发。
「不追高」过不了这一关——多高算高?「买入价高于最近某个可计算的参考位」能过关,因为对方拿着你的流水就能自己算。
注意这里发生了什么:你并没有变得更自律,你只是把一个形容词换成了一个可以被第三方复核的量。这就是量化对普通投资者最实在的贡献,跟会不会写代码没关系。
机制层。 开源交易框架 freqtrade 里有一组叫 protections 的东西,直译是「保护」,作用是在特定情况出现时暂时禁止开新仓。它们的配置长什么样,比它们做什么更值得看——每一条的参数都是具名字段:往回看多长一段时间、这段时间里够几笔才算数、要求的盈亏比例是多少、锁多久。
文档里给的一个例子是这样的意思:过去若干根 K 线之内,如果止损被触发的次数达到了某个数,就全线停手若干根 K 线。(K 线就是把一段时间的价格压成一根柱子,一根代表一段固定时长。文档里写的那几个数是举例用的,不是推荐值,你要用得按自己的情况定。)
我要你看的不是那几个数,是这句话里没有什么:没有「如果最近状态不好」,没有「视情况」,没有「适当」。每一个词都能被机器读懂——而能被机器读懂,等价于能被第三方复核。
特征二:触发之后只有一个动作
生活层。 消防喷淋头感温之后不会弹出一个菜单让你选「喷水/报警/再观察一下」。它只会喷水。一个动作的系统,坏起来也是可预测的坏。
投资层。 很多人写的「规矩」在动作那一格是空的,或者是散的:「如果连亏三笔,就要注意控制风险。」注意控制风险是什么动作?减半仓是动作,停手一周是动作,只做一个品种是动作,「注意」不是。
更隐蔽的一种是给了两个动作:「如果跌破那个位置,就止损,或者补仓摊低成本。」这句话看着比前一句具体多了,其实更糟——它把最难的那个判断原封不动地留在了最慌的那一刻,还给自己发了一张「我是有规矩的人」的证书。
一条规矩允许有几种动作,等于这条规矩不存在。
机制层。 freqtrade 里每一条 protection 被触发时,返回的是一个结构固定的东西,只有三个字段:锁不锁、锁到什么时候、因为什么锁。冷却期那一条的实现更干脆——它整个类干的事就是找到这个品种最近一笔已经了结的交易(买了又卖掉、仓位已经不在手上的那种),算出解锁时刻,返回一个锁。没有分支,没有「视情况」,没有第二种可能的输出。
止损那一层也是同一个道理。系统里的止损价有一条硬规矩:只许往上抬,不许往下挪,因为源码里压根没提供往下挪的入口——这一段的完整机制在 止损:从心理问题变成数学问题 里拆得更细。把一个选项从流程里删掉,比要求自己不去选它,可靠一个数量级。
特征三:不需要临场判断——尤其是「什么时候恢复」
这一条是四条里最容易漏的,我见过的自制规矩十有八九栽在这儿。
生活层。 罚站十分钟和罚站到「你什么时候认识到错误」,是两种完全不同的惩罚。后者听起来更讲道理,实际上把结束权交给了当时的情绪:心情好了三分钟就算认识到了,心情不好半天都不算。
投资层。 绝大多数人写规矩,只写「什么时候停」,不写「什么时候恢复」。
「连亏三笔就停手」——停到什么时候?你不写,答案就是「停到我觉得可以了」。而「我觉得可以了」这个时刻,通常出现在你看到一个特别想抓的机会的那一秒钟。你以为你设了一道闸,其实你设的是一道随时可以被冲动开启的闸。
一条规矩要能落地,解除条件必须和触发条件一样客观:停到某个日历时刻,停满某个自然周期,或者停到某个可计算的状态恢复。三种都行,共同点是它们都不需要问你的意见。
机制层。 这件事在源码里被处理得相当讲究。锁的结束时间有两种算法:一种是从最后一笔交易了结的时刻往后推一段固定时长;另一种更有意思,配置里可以直接写一个「HH:MM」格式的钟点,意思是锁到当天的那个时刻,如果那个时刻已经过了就顺延到第二天。
解除权被交给了钟表,不是交给了操作者。
文档里还有一句我很喜欢的说明:所有保护规则的结束时刻,都会向上取整到下一根 K 线,理由是避免在 K 线中间突然、意外地买入。这个细节的讲究之处在于——它连「解禁的那一瞬间要不要顺手做点什么」这种小口子都堵上了。规矩不光要有明确的结束时间,结束的方式也要平淡无奇,不能自带一个「刚解禁快抓紧」的心理暗示。
特征四:留下记录
生活层。 健身房的打卡记录和「我觉得我最近挺勤的」,是两种性质的东西。前者能被翻出来数,后者只能被回忆——而回忆是会自动美化的。
投资层。 一条没有记录的规矩,三个月后你根本无从判断它到底有没有在起作用。你只会有一个模糊的印象:好像执行了吧,大部分时候。
记录要记的不只是「我做了什么」,更关键的是**「我为什么做」**。同样是卖出,因为触发了预设条件而卖,和因为看到一条消息心里发毛而卖,在账户余额上完全一样,在流水表上如果不加标记也完全一样——但它们是两件事,而且是你最需要分开统计的两件事。
机制层。 系统在这件事上做得很彻底,有两层。
第一层,每一次规则生效都被写进一张专门的表。这张表的字段是:哪个品种、因为什么、从什么时候锁、锁到什么时候、现在还生不生效。「因为什么」是一个必须填的栏位,而不是可选的备注。
第二层,每一笔交易记录上都挂着两个标签:为什么进(enter_tag)和为什么出(exit_reason)。出场原因还不是随便写的自由文本,它背后是一张封闭的清单——止损、追踪止损、交易所侧止损、达到收益目标、离场信号、强制离场、紧急离场、自定义离场、部分离场、被强平。
这张清单里没有「说不清」这一项。
还有个细节挺说明问题:这两个标签字段在写库之前会被检查长度,超了直接截断。也就是说,系统默认一个进出场的理由应该是短的、可归类的。一个需要写三百字才能说清楚的理由,多半不是理由,是事后叙事。
「我要更有耐心」为什么一条都不占
拿四条标准去卡开头那三行字,一眼就能看出问题出在哪:
| 触发条件客观 | 动作唯一 | 不需临场判断 | 有记录 | |
|---|---|---|---|---|
| 以后要更有耐心 | 没有触发条件 | 没有动作 | 全靠临场 | 无从记录 |
| 不追高 | 「高」没有定义 | 「不追」不是动作 | 全靠临场 | 无从记录 |
| 亏了要认 | 亏多少算 | 「认」不是动作 | 全靠临场 | 无从记录 |
这三行字的共同点是:它们全都是对自己的评价,不是对情况的描述加上对动作的指定。评价没法执行,因为评价的对象是你这个人,而你这个人在下一次那个时刻会自动变成另一个人。
怎么把愿望翻译成规矩
翻译的路子是固定的四步:先把形容词换成可计算的量,再指定唯一动作,再补上解除条件,最后想好这件事发生了怎么在流水上留痕。
拿「亏了要认」走一遍:
- 形容词「亏了」换成量——在下单之前就写死一个离场条件,条件本身要能被第三方拿着你的流水复核。
- 动作唯一——触发之后只有一个动作:清掉这一笔。不是「减一半再看」,不是「换个更长的周期再看」。
- 解除条件——这一笔了结之后,同一个品种进入一段固定长度的冷却期,冷却期怎么算写死在纸上,不看当天的行情,也不看你的心情。
- 留痕——这笔交易在你的记录里标一个固定的出场原因标签,比如「按预设条件离场」,而不是写一句「跌太多了先出来」。
再拿「赚一点就跑」走一遍。这个毛病的量化画像是上一篇的活,这里只管改写:把「跑」的条件从「浮盈让我心里踏实了」换成一个事先写死的、可以被复核的离场条件,触发之前不允许有任何离场动作。这里面的取舍——固定目标、分批、按波动率——各自在放弃什么,止盈 那篇拆得比这里细。
注意我全程没有给任何一个具体的数。 这不是回避,是因为那些数根本不该由别人给:它取决于你做的品种平时晃多大、你的资金规模、你能盯盘的频率、你打算持有多久。想把「愿意亏多少钱」和「该买多少」的换算关系拿捏清楚,可以用 止损计算器 自己试几组,看看不同的止损距离会把仓位推到什么量级。这里能给你的只有句式,不是数值。
规矩不止一条的时候,会打架
规矩写到第四条第五条,麻烦就来了:两条规矩在同一时刻给出相反的指令。一条说「连亏之后停手」,另一条说「跌到这个位置该加」,那一刻你听谁的?
如果你没有事先回答这个问题,那一刻你会听那个更符合你当下情绪的那一条——于是你所有的规矩加起来,效果等于没有规矩。
系统对这件事的处理简单到有点无趣:多条保护规则按照它们被写下来的顺序依次评估。谁写在前面谁先说话。这个方案谈不上多聪明,但它有一个不可替代的好处——它是确定的。你事后永远能解释清楚当时为什么是那个结果。
还有一处设计我认为对个人特别有借鉴意义:每一条保护规则都必须提供一句自我描述,这句描述用在启动时的提示消息里。也就是说,程序开跑之前,会先把此刻生效的所有规矩念一遍给你听。
个人版本的对应做法,是把你的规矩控制在能一口气念完的数量,并且在每次开始交易之前真的念一遍。念不完的规矩体系,等于没有规矩体系——因为你在需要它的那一刻想不起它有哪几条。
怎么查自己到底执行了没有
到这一步,你手上有几条像模像样的规矩了。接下来是本篇最值钱的部分:过一段时间,怎么客观地知道自己到底照做了没有。
先说清楚这一步在查什么
这里查的不是「这条规矩有没有用」。「如果当初真的执行了会怎样」是上一篇反事实回测的活,那一篇讲的是效果估算。
这一步查的是更前面的一件事:我到底有没有执行。 这两件事必须分开,而且顺序不能反。原因很直白——执行率不够的情况下,任何关于「这条规矩有没有用」的结论都是无效的,因为你实际跑的从来不是这条规矩,是一个掺了水的版本。你以为你在评价规矩,其实你在评价「规矩 + 你的临场发挥」这个混合物,而且你还不知道混合比例是多少。
具体怎么算
做法本身不难,难的是老实:
第一步,给每一笔已完成的交易补两个标签。 为什么进、为什么出。出场标签必须从一张你事先定好的封闭清单里选——比如:按预设条件离场、达到预设目标、按时间规则离场、临时改主意离场。清单可以短,但必须封闭。
第二步,数落进「临时改主意」那一格的比例。 这个数就是你的违规率。它不需要任何模型,就是数数。
第三步,反过来查漏。 找出那些明明应该触发某条规矩、但流水里没有对应动作的时刻。这一步比第二步麻烦,但更重要——因为没执行的规矩往往在流水上不留任何痕迹。你的账上只是安静地什么都没发生,而这个「什么都没发生」恰恰是最需要被数出来的东西。
**第四步,把三个数并排看:**触发了多少次、执行了多少次、执行的那些里有多少是原样执行的(没有打折、没有减半、没有推迟一天)。
这几个数比任何收益率都更能说明你现在处在什么阶段。收益率里混着运气,执行率里没有。
系统里长什么样
freqtrade 提供了一个专门的分析命令,能把回测产生的交易按标签分组统计:按进场标签分、按出场标签分、按进场和出场标签的组合分,也可以再叠上品种维度。实盘那边同样有按进场标签和按出场标签汇总业绩的查询。
这个功能的存在本身就说明了一件事:一份交易记录的真正价值,不在于它记了多少笔,而在于每一笔都被归到了某一个可命名的原因下面。 一堆没有标签的成交记录,能算出收益率,但回答不了「我到底是按什么在做交易」。
还有个细节我特别想让你知道:在回测里,那些保护规则默认是不生效的,必须显式加一个开关才会被算进去。
这句话有两个用处。对你自己:如果你要评估「加上这条规矩会怎样」,得确认规矩真的被打开了跑,否则你得到的是没有规矩的版本。对你看别人的报告:一份漂亮的成绩单如果没说清楚风控规则是开着跑的还是关着跑的,那份成绩单描述的可能是一个从不受约束的账户——这类需要追问的地方,回测好看实盘亏,差的到底是哪三件事 里列了完整的清单。
顺带一提,把执行率和收益放在一起看的时候,很容易滑进另一个坑:把「这段时间赚了」当成「我的规矩管用」。收益是从哪儿来的,得单独拆,业绩归因 讲的就是这件事。
别把「有规矩」当成「会赚钱」。 这四个特征保证的只有一件事:你下次遇到同样的情况时,做出的动作是可预测、可复核、可改进的。它不保证这个动作是对的,更不保证赚钱。一条设计良好、执行到位的规矩,完全可能在某一段行情里持续让你少赚或者多亏——这不是规矩坏了,这是规矩本来就有它的适用边界。规矩解决的是「你的行为随机」,不解决「市场不确定」。 这两个问题只有第一个在你手上。
几个把规矩用坏的常见方式
在亏损当天改规矩。 这是最常见也最致命的一种。改规矩本身没错,错在时机——在你最想改的那一刻改出来的东西,一定是为了让你当下能舒服一点。改规矩要有改规矩的规矩:只在固定的时间窗口改,改动要写明生效日期,生效之前的记录不许追溯修改。
规矩越写越多。 每被市场教育一次就加一条,半年后你有二十条互相冲突的规矩,实际效果是你可以从中挑出一条来支持你当下想做的任何事。规矩的数量应该是收敛的:加一条之前,先看看能不能改掉一条旧的。
照抄别人的参数。 别人那条规矩里的数字,是从他的品种、他的资金量、他的持仓周期里长出来的。同一个句式可以抄,里面的数不能抄。
只对亏损设规矩,不对盈利设规矩。 「亏了怎么办」大家都会想,「赚到什么程度该做什么」几乎没人写。而「赚一点就跑」这个毛病恰恰长在后一半,给这些习惯量个尺寸 量出来的就是它。
把规矩写在心里。 没写下来的规矩不存在。原因很简单:没写下来的东西,事后无法和流水比对,也就无法被证明违反过——一条永远无法被证伪的规矩,等于没有。
这一组四篇串起来是什么
回头看这一组的四步,它其实是一条完整的链子:
从流水里读出一份体检报告,知道自己哪儿有毛病;用反事实回测算一算,如果当初照做了会差多少;给那些习惯量出具体尺寸,让「我好像有点急」变成一个数;然后是这一篇——把量出来的东西变成下次真的会被执行的一句话,并且过一段时间回来数一数自己有没有照做。
前三步的产出都是认识,只有第四步的产出是行为改变。而认识不产生结果,行为才产生结果。很多人卡在第三步和第四步之间很多年,反复地诊断、反复地懊悔、反复地下决心,就是不肯把决心翻译成那种听起来一点都不励志、甚至有点笨的句子。
这一整套量化技术用在自己身上的最终产物,不是一份报告,是一句短到有点无聊、但慌乱时候的你也接得住的话。
本节讲的是行为纪律的建立方法,不构成任何投资建议、买卖信号或收益承诺。文中所有句式示范均不含具体数值,也不应被当作可直接套用的交易方案;任何参数都必须结合你自己的品种、资金规模与持有周期确定,并以你所在市场和你的券商规则为准。建立规矩不会提高胜率,它只会让你的结果变得可解释、可改进。 完整风险提示见 免责声明。
小结
- 决心和规矩是两种东西:决心需要你在每个具体时刻重新赢一次,规矩只需要你在安静的时候设定一次。写规矩的本质,是让安静时的你替慌乱时的你做决定。
- 一条好规矩有四个特征:触发条件客观(陌生人拿着你的流水就能判断触没触发)、动作唯一(触发之后没有第二个选项)、不需要临场判断(尤其是「什么时候恢复」也必须写死)、有记录(每次生效都留下时间和原因)。
- 「我要更有耐心」四条一条都不占,因为它是对自己的评价,不是对情况的描述加上对动作的指定。翻译的路子固定:形容词换成可计算的量 → 指定唯一动作 → 补上解除条件 → 想好怎么在流水上留痕。
- 规矩多起来会互相冲突,必须事先定死评估顺序;并且要控制在能一口气念完的数量——开始之前念不完的规矩体系,等于没有规矩体系。
- 查执行率的办法是给每笔交易补两个标签(为什么进、为什么出),出场标签必须来自一张封闭清单,然后数三个数:触发多少次、执行多少次、原样执行多少次。执行率不够,任何关于「这条规矩有没有用」的结论都无效,因为你评的是规矩和你的临场发挥的混合物。
- 最容易把规矩用坏的方式:亏损当天改规矩、规矩越写越多、照抄别人的参数、只对亏损设规矩、以及把规矩写在心里不写在纸上。
一句话说完这篇:光知道自己毛病在哪没用,得把它写成一句连你自己发慌的时候都没法赖掉的话,然后过阵子回头数一数,你到底有没有照做。
本文所引源码与文档均来自上述快照版本,是阅读代码与文档得出的机制说明,不是运行结果;具体行为请以你手上那个版本为准。回 量化与 AI 投研概念库 看各个概念分别在说什么;本站内容为投资教育,不构成任何投资建议,边界见 免责声明。
本文为投资教育整理,关键数据与结论请结合下列权威来源验证。
- freqtrade 文档 docs/includes/protections.md(本地仓库快照 commit b3404c9,2026-08-18 读取) ↗
- freqtrade 源码 freqtrade/plugins/protections/iprotection.py、freqtrade/plugins/protections/cooldown_period.py(同上快照) ↗
- freqtrade 源码 freqtrade/persistence/pairlock.py、freqtrade/persistence/trade_model.py、freqtrade/enums/exittype.py(同上快照) ↗
- freqtrade 文档 docs/advanced-backtesting.md(同上快照) ↗