回测里那条漂亮的资金曲线,不是实盘的预言,只是实盘的上限。
你大概有过这样一刻。
参数调了好几轮,回测的资金曲线终于又陡又顺,回撤小得不像话。你截了图,心里盘算着这次稳了。
然后你把它搬上实盘,挂了一周。曲线没崩,但也没飞——它被磨平了,磨得让你怀疑自己是不是抄错了一行代码。
代码没抄错。错的是你以为回测等于实盘。
这一篇,咱们不写新代码。咱们把前八篇辛辛苦苦搭起来的那套向量化回测,和真实交易之间隔着的那条沟,一个坑一个坑地数给你看。
不是劝退。是让你在掉进去之前,先看清坑长什么样。
回顾一下我们这一季干了什么。
我们用 pandas 把 K 线捋顺,用向量化几行算完所有指标,把规则写成信号,再让信号和收益相乘——一整条历史,刷地一下就跑完了。
快,是它最大的优点。也是它最大的谎言。
因为向量化回测,本质上是站在"全知"的位置往回看。它手里攥着整段历史,每一根 K 线的收盘价都是已知的、确定的、随叫随到的。
# 第⑤篇我们写过的核心:信号 × 下一根的收益ret = close.pct_change().shift(-1)strategy_ret = signal * ret
这两行的意思是:今天给出信号,就按"下一根的真实涨跌"结算收益。
听起来很合理。但它偷偷假设了一件事——你能不多不少、不偏不倚地,以那个价格成交。
实盘里,这个假设几乎从不成立。
回测是上帝视角,实盘是肉身视角。上帝知道收盘价,你不知道。
🕳️ 把沟里的坑,一个个数清楚
这条鸿沟不是一道悬崖,而是谷底排着一串坑。每个坑都从你的实盘收益里咬走一口。
1️⃣ 成本与滑点——最容易被忽略,也最致命。
向量化回测里,买卖是"免费"的。但实盘每一笔都要付点差、手续费,还有滑点——你想要的价和真正成交的价,总差那么一点点。
一笔差一点点,听着不疼。但高频策略一天成交几十上百次,这"一点点"会被乘成一座山。
这正是第四季《回测的科学》⑦讲过的"成本与滑点"。下一篇,我们就要在 Python 里把它们一个个加回回测——预告第八篇(成本建模)。
2️⃣ 成交假设——回测假设"全部成交",实盘会拒单。
向量化回测默认:你想买,就一定按收盘价、按你要的数量买到。
实盘没这么客气。市场有撮合、有排队,有时拒单,有时只成交一部分。你以为满仓了,其实只进去一半。
信号和成交,是两件事。 回测把它们当成一件事了。
这也是第八篇 walk-forward 那一节的延伸——再诚实的回测,也只是回测。
3️⃣ 延迟——从信号到下单,有时滞。
回测里,信号一出,同一根 K 线就结算了,仿佛瞬移。
实盘里,你的程序要算指标、发请求、等服务器回应、等撮合……这中间隔着几十到几百毫秒。对慢策略无所谓,对快策略,这点延迟足以让你追在别人后面。
4️⃣ 数据口径——回测的 K 线,不是实盘的 tick。
回测喂给你的是规整的 K 线:开高低收,干干净净。
实盘面对的是一笔一笔跳动的 tick:买一卖一来回闪,价格在 K 线内部翻江倒海。你回测里那个"收盘价",在实盘那一刻可能根本不存在。
# 回测:一根 K 线一个收盘价,确定bar_close = df['close']# 实盘:同一时刻,买价卖价是两个数,还在跳
口径不一致,回测再精确,也是在另一个世界里精确。
5️⃣ 容量与冲击——单子一大,就推动价格。
回测里你下一手还是下一千手,成交价不变。
实盘里,你的单子本身就是市场的一部分。单子一大,还没成交,价格就被你自己推走了。 小资金感觉不到,资金一上量,这口被咬得最狠。
🔬 所以,Python 回测到底该用来干嘛
数完这五个坑,你可能有点泄气:那这套 Python 回测还有什么用?
有用。只是要把它放回它该在的位置。
Python 向量化回测,是研究和筛选工具,不是实盘执行工具。
它擅长的是:在成百上千个想法、参数、品种里,快速刷一遍,把明显不行的淘汰掉,把有点苗头的留下来。这活儿它做得又快又好。
它不擅长的是:精确还原"你这一单到底能不能成、成在什么价、慢了多少毫秒"。这些要靠事件驱动回测,或者干脆回到真实环境去验证。
真正下单,多数人最后还是回到 MT5、券商 API、或事件驱动的回测引擎。这正是第二季《动手写一个EA》在 MQL5 里做的事——那是"执行",这一季的 Python 是"研究"。
研究归研究,执行归执行。把一把研究的尺,硬当成执行的秤,量出来的当然不准。
那怎么落地?还是那句老话——回扣 0.01手 内核:
- • 回测好,只是必要不充分。它能否决一个坏策略,却不能保证一个好策略真能赚。
- • 别从回测直接跳满仓。先用最小手数上实盘,让真实的成本、滑点、拒单替你把回测里那些乐观的假设,一条条修正过来。
- • 0.01 手实盘跑出来的一周数据,比回测里一万根 K 线更诚实。因为它是肉身视角,不是上帝视角。
先活着把这条沟趟过去,再谈曲线好不好看。
📌 小结
- • 向量化回测是上帝视角:它默认你能以确定的收盘价、不偏不倚地全部成交——实盘几乎从不满足这个假设。
- • 沟里有五个坑:成本与滑点、成交假设(拒单/部分成交)、延迟、数据口径(K 线≠tick)、容量与冲击。每一个都从实盘收益里咬走一口。
- • Python 回测是研究/筛选工具,不是执行工具:用它快速淘汰坏想法,真正下单回到 MT5、券商 API 或事件驱动引擎。
- • 回测好是必要不充分:先用 0.01 手小仓实盘验证,让真实环境替你修正回测里乐观的假设——这是趟过鸿沟唯一靠谱的桥。
【下一篇预告】数完了坑,下一篇我们收个尾——把这一季的数据、信号、回测、绩效全拼起来,亲手搭一个最小可用的量化框架。不求大而全,只求一个能从头跑到尾、明天就能往里加策略的骨架。这一季的终点,也是你自己量化系统的起点。
如果这一篇让你对"回测好≠能赚钱"多了一分清醒,点个赞、关个注,留言区聊聊你第一次实盘缩水时的心情——咱们都从那条沟里爬过。
本文仅为个人学习记录与编程笔记,所涉代码与方法均为技术科普,非交易建议,不构成任何操作建议。市场有风险,据此操作风险自负。