← 返回教程库

回测按贵宾价算账,实盘按你的真实价算账

最后更新 2026-08-19
📚 量化与 AI 投研 📖 回测与实盘为什么对不上 ⏱ 约 21 分钟 R2 · 注意风险
你将学到
  • 说得出回测框架为什么倾向于用最优惠的那一档费率,以及这个默认值本来就不是为你个人准备的
  • 会算「每次往返的费率误差 × 一年往返次数」这个乘法,判断一份报告的失真量级和它的换手频率是什么关系
  • 知道最低佣金和印花税这两件事,怎么让同一份回测在不同资金规模、不同市场的人手里得出不同结论

朋友转给你一份策略业绩报告,说这套东西他跑了三年历史数据,年化二十几个点,回撤也不吓人。你把逻辑问了一遍,他讲得挺清楚,你也挑不出毛病。

这时候你其实还漏了一句话没问,而且这句话跟策略逻辑一点关系都没有:这份报告在算账的时候,是按谁的价钱收的手续费?

听上去像抠细节。但这一格里填的数字,决定了那条曲线到底是这套规则的成绩,还是"这套规则 + 某个特定身份的人"的成绩。它是整份报告里唯一一个跟策略无关、只跟人有关的输入,也是最容易被整份报告悄悄跳过的一格。

回测好看实盘亏,差的到底是哪三件事 已经把这件事点名了,这一篇专门把它挖到底。至于手续费本身由哪几笔构成、印花税怎么单边收、一次往返到底扣多少,手续费与印花税 那篇已经拆得很细了,这里不重讲费用结构,只讲一件事:回测那一格里的数,和你实际要交的数,差在哪,以及这个差会被什么放大。

那个年化数字,一半属于策略,一半属于人

先打个比方

设想你在一家连锁超市上班,员工买东西打八折。有个朋友做小生意,问你某样东西倒手能不能赚。你回家拿计算器一算:进价这么多、卖价这么多,一件赚三块,能做。

朋友照着你的账去做了,做完发现每件亏一块。

哪一步错了?逻辑没错,价格没错,商品没错。错的是你算账用的是员工价,他掏的是外部价。八折那一层,从头到尾没出现在你写给他的那张纸上——因为对你来说那是背景,是默认的,是你根本不会特意写出来的东西。

一份回测报告里的费率,就是那个八折。

这对你的判断意味着什么

先接受一个有点别扭的结论:年化收益不是策略的属性,是"策略 + 执行人"这个组合的属性。

同一段历史行情,对所有人都一样——你看到的那根 K 线和写报告那个人看到的完全相同,这是公共信息。但费率不是公共信息,它是身份信息:跟你的交易量、你的开户渠道、你签的合同、你所在的市场都有关系。

于是在一份回测报告的全部输入里,出现了一个很微妙的错位:

  • 行情数据是公共的,可以直接搬。
  • 策略逻辑是公共的,也可以直接搬。
  • 费率是私有的,搬过来就是错的。

所以当你看到一条曲线,正确的读法不是"这套规则能做到年化 X",而是"这套规则在报告作者那个费率下能做到年化 X"。这两句话的差别,在低频策略上可以忽略不计,在高频策略上足以颠倒结论。后面那个乘法会让你看清楚差多少。

再进一步,还有一个大部分人从来没想过的推论:你的费率会变,但报告里的费率是一个常数。 你的交易量档位可能升降,券商的费率政策可能调整,市场层面的税费本身也是政策变量。回测拿一个固定的数字盖住了三年,而你未来三年要交的,是一条会动的曲线。这不是精度问题,是回测把一个变量当成了常数

为什么会是这样

框架的作者不是懒,也不是想骗你,他们面对的是一个没有正确答案的问题:默认值该填谁的数?

软件里的默认值有一个天然职责——让系统能跑起来,而且对所有用户都说得通。作者不知道你是谁、你交易量多大、你签的什么合同,所以他必须填一个"普适"的值。而在费率这件事上,最普适、最不需要额外信息、最容易从交易场所公开页面上直接读到的那个数,恰好就是面向所有人的基础报价,也就是最优惠或者说门槛最低的那一档

这里可以看一眼开源框架的原话。freqtrade 是一个公开的自动交易框架,它的基础概念文档里有一小节专讲费用处理,说的是:所有收益计算都包含费用;回测、参数搜索和模拟盘这三种模式,用的是交易所的默认费率,并在括号里点明这是交易所上最低的那一档;只有真实下单的时候,才用交易所实际收你的那个费率,包括各种返还和折扣在内。

它的配置文档里那个费率参数的说明还多补了两句,直白得像在提醒你:这个参数是回测和模拟盘用的,正常情况下不建议你自己配,让框架回落到交易所默认值就行;并且明确写出,这笔费用每笔交易要收两次,买一次卖一次。

把这两段合起来读,你会读出一个非常清晰的设计意图:框架承认自己填的是一个"公用值",并且专门留了一个入口让你把它换成"你的值"。 一个入口的存在,本身就是在承认默认值不等于你的值。

那么第一个可操作的动作也就出来了:拿到任何一份回测报告,问一句"费率这一格填的是什么,来源是哪里"。答不上来,说明这一格是默认值;答得上来但填的是别人的档位,说明这条曲线不是给你看的。

顺便说一个容易被误解的细节,免得你把"默认值"想成铁板一块。同一个框架在取默认费率的时候,实际做的是把"主动吃单"和"挂单等成交"两种价格都拿到,然后取其中更贵的那个,日志里还老老实实写着这是"最坏情况"。

Using fee 0.1000% - worst case fee from exchange (lowest tier).

一行日志里同时出现了"最坏情况"和"最低档",看着矛盾,其实是两个维度:在订单类型这一维往贵了假设,在客户等级这一维往便宜了假设。 这两个维度分别是怎么回事、几套系统各自怎么建模,回测里的交易成本假设 那篇讲透了机制,这里你只要记住结论:看到"我们的默认值已经很保守了"这句话,要追问一句保守在哪一维。

差的不是那一点,是那一点乘以次数

先打个比方

家里有个龙头在滴水,一秒一滴。你去看一眼,觉得这能有多少,随手关上门。

一个月后水费单来了。

滴水这件事之所以反直觉,是因为你观察它的时间尺度和它累积的时间尺度不是同一个。你盯着看十秒,看到的是几乎为零;它按月工作,攒出来的是一个你要交钱的数。

费率误差是同一种东西。你看单笔,那点差额小到懒得算;你看一年,它已经变成了年化里明晃晃的几个点。

这对你的判断意味着什么

这里要做一个区分,很重要,别和上一篇文章里的乘法混了。

概念库里算过一个乘法:年成本 = 一次往返的成本 × 一年往返多少次。那算的是成本本身,答案是"你一年要交多少钱"。

这一篇要算的是另一个乘法:年误差 = 一次往返的费率差 × 一年往返多少次。算的是误差,答案是"这份报告在费用这一项上,一年虚报了多少"。

两个乘法长得一模一样,问的问题完全不同。前者是你的账,后者是报告的账。

下面这张表全是假设值,只为让你能拿计算器自己核对,不代表任何现行费率:

每次往返的费率差(假设) 年往返 4 次 年往返 20 次 年往返 100 次 年往返 250 次
0.05% 0.2% 1% 5% 12.5%
0.1% 0.4% 2% 10% 25%
0.2% 0.8% 4% 20% 50%

盯着第一列和最后一列的对比看三秒。

同样是"每次往返差万分之五"这么一个小到听着可笑的误差:一年调仓四次的方法,报告虚报了 0.2 个百分点,四舍五入等于没虚报;一年往返 250 次的方法,报告虚报了 12.5 个百分点——这个数字足以把一份"年化 15%"的报告,还原成"年化 2.5%"。

同一个误差,在两份报告里的破坏力差六十倍,区别只在换手次数。

由此得到一条判断规则,我认为它比任何具体数字都值钱:

一份回测报告的费率失真程度,和这套策略的换手频率成正比。

推论一:低频策略的报告,你在费率这一格上可以宽容一些;高频策略的报告,费率这一格不写清楚,整份报告就是不可读的。不是"参考价值打折",是不可读——因为你不知道那个年化里有多少是真的。

推论二,也是更实用的一条:不要把不同频率的两份报告放在一起比。 一份年化 20% 的低频报告和一份年化 40% 的高频报告,如果两份都用默认费率算,那这个对比本身就是歪的——高频那份领到的美颜滤镜厚得多。你要么把两份都换成各自的真实费率重算,要么干脆别比。

想理解换手频率这个变量本身还牵动着什么,调仓频率 那篇专门讲它。要提醒一句,这里说的"换手频率"指的是你一年做多少笔买卖,跟"程序多久判断一次"是两码事——那是另一台机器上的问题,回测里你每根 K 线看一眼盘 那篇负责。

为什么会是这样

为什么框架作者敢用一个会被放大几十倍的默认值?

因为框架的设计初衷是验证逻辑,不是核算利润。你写一套规则,想知道它在历史上大致有没有捕捉到什么东西,这时候费率填得准不准,不影响"有没有"这个判断。默认值服务的是这个场景。

出问题的是另一个场景:有人把这个用于验证逻辑的工具跑出来的数字,当成了向别人展示的收益承诺。工具没变,用途变了,于是那个本来无伤大雅的默认值,摇身变成了一份财务预测里的核心假设。

所以真正的错不在框架,在把研究工具的输出当成理财产品说明书的那个环节。你作为看报告的人,位置恰好就在这个环节的下游。

报告里藏着一个从没写出来的数:作者有多少钱

先打个比方

你点外卖,看到某家店"满 30 减 15",觉得半价挺划算。真下单才发现,你一个人吃只要点 18 块的东西,凑不到 30,于是要么多买一份不想吃的,要么原价付。

同样一句"半价",对人多的办公室是真半价,对一个人吃饭的你根本不存在。优惠没骗人,是这条优惠里隐含了一个"你有几个人"的前提,而这个前提没写在广告上。

这对你的判断意味着什么

券商佣金通常带一条"按比例收,但不低于某个固定金额"的门槛。这条门槛对大单几乎不存在,对小单是实打实的加税。临界金额怎么算、小单的实际费率会飙到多高,手续费与印花税 那篇已经算过一遍,这里不重算。

我要你看的是另一层:这条门槛,让一份回测报告悄悄携带了一个"作者资金规模"的假设。

写报告那个人如果每笔下单几十万,最低佣金那条线对他等于不存在,他的实际费率就是比例档,干干净净。你拿几万块跟着做,为了分散又切成好几笔,每笔几千块——你可能每一笔都在踩门槛,实际费率是他的好几倍。

于是出现了一个很少有人明说的现象:同一份回测、同一套规则、甚至同一个费率档位,在两个资金规模不同的人手里,结果可以不一样。 差别不来自策略,来自你每笔单子的大小。

这还带来一个反直觉的推论。"把钱分散成很多小份、每份买一点",这在风险上是好习惯,但在费用结构上要额外交学费——分得越碎,踩最低门槛的笔数越多。分散不是免费的,你得知道自己为它付了多少,然后再决定分到什么程度。这不是叫你别分散,是叫你知情地分散

要命的是,绝大多数回测报告根本不会告诉你作者的单笔金额。所以第二个可操作的动作是:问一句"你这份回测的单笔下单金额大约多少"。 如果对方的量级比你大一个数量级以上,那份报告在费用这一项上对你的参考价值要再打一次折。

为什么会是这样

这条门槛在系统里建不建模,是引擎作者的一个选择题,而且两种选择都真实存在。

qlib 是一套面向 A 股研究的开源量化平台,它的交易所模块里就有一个"最低收费"参数,源码默认值是 5,同时给了开仓和平仓两个独立的费率参数。更能说明它认真的是现金约束那一段:它在算"这些现金最多能买多少"的时候,会先判断你的现金够不够付那个最低收费——不够的话,这笔单子直接买不了,能买的数量是零。够了以后还要分两种情形算,金额过了临界线按比例算,没过按固定值扣。(这些都是源码里的默认值和可配置项,你的实际值以你券商的合同为准。)

而另一类引擎,比如面向加密市场的那种,费用就是"成交额 × 费率"一行乘法,结构上压根没有"最低收费"这个概念——因为那个市场本来就没有这条规则。

这两种建模都没错,各自忠实于各自的市场。错的是把一边的结果搬到另一边来看。这就引出下一节。

如果这份回测是给另一个市场写的,缺的可能不是数值,是一整项

先打个比方

你照着一份国外的菜谱做菜,把每一步都做对了,味道就是不对。回头一看,那份菜谱的配料表里压根没有你们这儿必放的那一味料——不是分量写少了,是这一行不存在

分量写错,你尝一口能调回来;整行缺失,你尝到最后也想不到该往哪儿加。

这对你的判断意味着什么

费用这件事,不同市场差的不只是数值,是项目本身

我翻了一个开源交易研究仓库的回测引擎目录,里面按市场分成了十几个文件:A 股、A 股期货、加密、外汇、港美股、印度股、韩国股,各是各的。同一个"算手续费"的函数,在不同文件里长成了完全不同的形状:

  • A 股那个:佣金按比例但设了最低门槛,过户费双边收,印花税只在卖出时收,源码里就是一个"如果不是开仓才加这一项"的判断。
  • 港股那个:佣金、印花税、监管征费、结算费,四项相加,而且印花税那一项是双边的
  • 美股那个:佣金直接是零。
  • 加密那个:区分吃单和挂单两种费率,一行乘法,没有最低收费,也没有任何形式的交易税

四个市场,四种结构。这不是精度差异,是账本的行数不一样

对你的意义非常直接:一份用境外或加密市场的工具跑出来的 A 股回测,在费用模型上可能从结构上就缺项,最典型的就是缺那笔只在卖出时收的税。这种缺失有个很坏的性质——它是系统性的,每一次卖出都少算,不会正负抵消,笔数越多缺口越大。而且它不会报错,曲线照样漂亮。

值得注意的是,市面上不少现成的开源回测框架诞生于加密市场,天生没有"交易税"这个概念。如果有人拿这类工具跑 A 股策略给你看,第三个可操作的动作就是问:"你这个回测引擎是给哪个市场写的?卖出那笔税建进去了吗?" 这句话不需要你懂代码,但对方的反应会告诉你很多。

为什么会是这样

因为费用规则是制度产物,不是市场产物。它由监管规则、交易所规则、券商合同三层叠出来,跨市场之间没有可比性也没有可移植性。写引擎的人只能一个市场一个市场地建模——那个仓库把十几个市场拆成十几个文件,本身就是在承认这件事不能通用。

一句可以带走的判断:关于费用,任何"大差不差"的跨市场类比都是不成立的。

费率一改,死掉的不是一点利润,是一批交易

先打个比方

一群人跳高,横杆放在某个高度,一百个人里过了六十个。现在把横杆抬高两厘米。

过杆人数会从六十变成五十八吗?不一定。如果这一百个人的实力大量集中在横杆附近,抬高两厘米可能一下子刷掉十几个人。抬杆的高度是线性的,被刷掉的人数不是。

这对你的判断意味着什么

策略的交易也是这样分布的。一套规则做出来的几百笔交易里,赚大钱的是少数,亏大钱的也是少数,中间挤着一大堆"小赚一点点"的交易。这批交易离盈亏线最近。

费率往上抬一点,最先出事的就是这批。它们不是"少赚了一点",而是整批从正翻到负。而且它们在笔数上往往是大头,一旦翻面,对总收益的影响远超过你按比例估算的那个数。

所以别用"费率提高 50%,收益就降 50%"这种线性直觉去估。费率和最终收益之间可能是一条陡峭的、带断崖的曲线,尤其是对那些单笔目标幅度本来就薄的策略。

这条推论直接给出一个更聪明的提问方式。与其问"你用的费率是多少"(对方随便报一个数你也验证不了),不如问:

"把费率翻倍再跑一遍,年化变成多少?翻三倍呢?"

这一问的高明之处在于,它要的不是一个数字,是一条响应曲线。而这条曲线会暴露一件报告作者自己可能都没意识到的事:

  • 曲线平缓 → 这套策略的收益来源和成本不在同一个量级,费率填错一点也不伤筋动骨,报告可信度高。
  • 曲线陡峭 → 这套策略的利润和成本处在同一个量级,本质上它赚的就是"成本没那么贵"这件事。这种策略不是风险高,是脆——它对一个你无法控制、还会随政策变动的外部变量高度敏感。

而且这一问对方赖不掉。改一个费率参数重跑,是任何回测工具都支持的最基础操作。答不上来,只有一种解释:从来没试过。

你不会写代码,也能做的三件事

一、把你自己的往返成本算出来,变成一个你随时能报出的数。 站内有个交易费用计算器,把你真实的单笔金额和费率填进去,看一次完整的买进卖出到底掉多少肉。这个数是你和任何一份报告对话的底气——没有它,你连"差多少"都问不出口。

二、拿这个数去做减法,而不是等对方给你结论。 把你的往返成本减去报告假设的往返成本,得到每次往返的差额;乘上这套策略一年的往返次数,你就有了这份报告在费用一项上的虚报量级。这个乘法你用手机计算器就能做完,不需要任何工具。

三、要一条曲线,不要一个数字。 让对方把费率翻倍、翻三倍各跑一遍,看年化怎么变。平缓说明策略结实,陡峭说明它赚的是成本的钱。

三件事都不要求你看得懂一行代码。它们要求的只是:在被那条漂亮曲线说服之前,先把"这条曲线是按谁的价格画的"问清楚。

顺便提醒一句,费用只是成本的一半。你成交的价格和你看到的价格之间还有一道缝,那部分叫滑点,它从来不出现在任何账单上,对较大的单子经常比手续费本身还贵。把两样一起算,才是完整的成本。

⚠️ 风险提示

本节讲的是回测报告中的费率假设与你的真实费率之间的差异,不构成任何投资建议、买卖信号或收益承诺。文中所有百分比与金额均为便于你自己核对的假设演算,不代表任何现行费率、佣金或税率——你的实际数值以你的券商合同、交易所规则与官方公告为准,且这些数值会随政策与合同变动。文中关于开源框架的描述来自本地源码与文档快照的阅读,不是运行程序得到的实测结果。还要强调一句:把费率这一格改对了,回测依然不等于实盘——它只是少了一处失真,并不会因此获得预测未来的能力。任何拿一条回测曲线向你承诺收益的人,都该被高度警惕。完整边界见免责声明

小结

  • 一份回测报告里,费率是唯一一个跟策略无关、只跟人有关的输入。行情和逻辑可以照搬,费率搬过来就是错的。年化不是策略的属性,是"策略 + 执行人"的属性。
  • 框架的默认费率倾向于用最优惠的那一档,是因为默认值的职责是让系统跑起来、对所有人都说得通,而不是替你个人算账。开源框架在文档里明说了这一点,还专门留了一个手动指定费率的入口——入口的存在,就是在承认默认值不是你的值。
  • 关键的乘法不是成本的乘法,是误差的乘法:年误差 = 每次往返的费率差 × 一年往返次数。同一个万分之五的误差,在低频报告里可以忽略,在一年往返 250 次的报告里能虚报十几个百分点。报告的失真程度和换手频率成正比。
  • 最低佣金那条门槛,让报告悄悄携带了一个从不写出来的"作者资金规模"假设。你的单笔金额比作者小一个数量级,实际费率就可能是他的几倍;分散成小份是有代价的,要知情地分散。
  • 费用规则是制度产物,跨市场不是数值差异,是账本行数差异:有的市场卖出单边收税,有的双边,有的零佣金,有的连最低收费的概念都没有。用境外或加密市场的工具跑 A 股,最容易缺掉的就是卖出那笔税,而且缺得系统性、不报错。
  • 费率抬高,最先死的是那批"小赚一点点"的边际交易,它们会整批翻负,所以费率和收益之间可能带断崖,不是线性关系
  • 最值钱的一问不是"你费率多少",而是"费率翻倍再跑一遍,年化变成多少"。要曲线,不要数字。
  • 三条机制的全景在回测好看实盘亏,费用结构本身在手续费与印花税,几套系统各自怎么建模在回测里的交易成本假设,整卷在量化与 AI 投研卷

一句话说完这篇:别人给你看的那条赚钱曲线,是用他的价钱算出来的;你要花的是你的钱,就得先问清楚,你这一档,还剩下多少。

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

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