博客
来自策略工厂的笔记

你回测里的美元其实是 USDC。3 月 11 日,它成交在 87 美分。
我们把权益曲线标成了美元。账户却是 USDC,那个周六,USDC 并不是一美元。
阅读文章 →
如何给回测预热,才不会把回看窗口算进业绩?
未完成的指标、裁掉曲线却留下仓位、给 8 小时特征做 30 天预热。能把它们抓住的重启检查。
阅读文章 →
我们在 Binance 上回测,在 Bybit 上模拟交易。优势原来是滞后。
我们在 Binance 上研究 BTC,在 Bybit 上模拟交易。回测并没有过于乐观。它只是在看一条更快的行情带。
阅读文章 →
让我们的回测交易成本翻倍的对冲
期权交易寥寥无几,对冲却在标的每次波动时都要交易。我们就这样找到了期权回测中被漏掉的成本。
阅读文章 →
回测里那笔空头正在赚钱。自动减仓还是把它平了。
强平发生在你自己的保证金耗尽时。ADL 发生在别人的保证金耗尽时——而当时赚钱的是你。
阅读文章 →
信号判断正确,但我们的期权回测买错了到期日。
信号指向看涨价差。回测却挑中了事后看来流动性最好的到期日。我们追查后发现,问题出在一个不起眼的日历联接上。
阅读文章 →
你的期权回测使用了一个从未成交过的中间价
中间价可以合理估算价值,却可能是糟糕的执行假设。下面介绍3种情况,说明两者的差异如何悄然虚增期权回测表现。
阅读文章 →
为什么我的回测总在替换期权数据?
同一个期权策略,在“同一份”历史数据上也可能得出不同结果。下面介绍如何判断归档中的市场数据是否发生了变化,以及要保存哪些内容,才能让下次运行的结果有据可查。
阅读文章 →
加入更多市场后,你的回测 Sharpe 可能更高
更广的市场范围看起来像是在分散风险。但在策略搜索中,它也可能意味着又增加了一批试验。下面介绍如何区分两者。
阅读文章 →
为什么我的回测在更频繁调仓时表现更好?
每日调仓能更快捕捉信号,也可能把优势消耗在交易成本上。下面介绍如何衡量额外交易是否值得。
阅读文章 →
数据变差时,你的策略夏普比率反而可能提高
可疑的逐笔数据可能是错误成交价,也可能是揭示策略脆弱性的关键观测。数据清洗需要留存审计记录,而不只是让权益曲线更漂亮。
阅读文章 →
数据供应商更改历史数据后,我们重建了回测
六周后,用相同的策略代码和日期范围跑出的权益曲线变了。我们追查后发现,变化来自修订过的市场数据;随后重建了实验,以便弄清楚究竟发生了什么变化。
阅读文章 →
你的策略跑了 240 次试验。你真正做了多少次回测?
你尝试了 240 组参数,并选出了胜者。它的 Sharpe 是 2.1。关键问题是,你给了噪声多少次机会,让它看起来像是优势。
阅读文章 →
这套策略在我们开始计入期货移仓成本之前一直表现良好
我们的日历价差看起来毫无问题,直到近月合约到期。随后,回测却在一个根本无法成交的价格上为头寸移了仓。
阅读文章 →
这次调仓看起来成本很低,直到我们算上价差
回测计入的手续费是 4 个基点。价差和市场冲击却让调仓成本超过了 20。我们来看看是如何发现这笔漏算成本的。
阅读文章 →
如何回测基于日线信号的策略?
日线 bar 提供了价格和日期,却不会告诉你策略何时得知收盘价。下面介绍如何回测日线信号,避免假设不可能实现的成交价。
阅读文章 →
我们让 AI 研究智能体优化策略,结果日志没那么亮眼
智能体找到了一套 Sharpe 为 4.1 的策略。接着我们统计了尝试次数,冻结搜索,再看着结果缩水到真正可以评估的程度。
阅读文章 →
你的 AI 研究智能体已经看过测试集:分数被污染的 3 种方式
一旦测试集结果左右了下一次实验,它就不再是测试集。下面介绍研究智能体悄悄从中学习的 3 种方式,以及如何让评分保持公正。
阅读文章 →
如何检验策略优势能否经受更高的交易成本?
别只问策略能否承受“现实的成本”。要衡量它能吸收多少成本、哪些假设最关键,以及优势会在哪里消失。
阅读文章 →
为什么你的回测需要一份退市台账
如果一家公司从回测中消失,它的最终收益也可能随之消失。3种常见的捷径,会让已倒下的股票变成看不见的赢家。
阅读文章 →
回测发现了 20% 的优势,其中有多少来自一个错误的时间戳?
20% 的回测优势可能来自当时无人知晓的一个数字。我们来看看如何判断修订、延迟发布或供应商回填是否在替你交易。
阅读文章 →
我们拆解了一次买错合约的预测市场回测
回测买入了“法案会通过吗?”但究竟是哪项法案、截止日期是什么时候,又由谁来裁定结果?我们剖析合约身份识别中的问题,看看它们如何把一场整洁的预测市场重放变成另一笔赌注。
阅读文章 →
让盈利的永续合约交易亏钱的资金费支付
一笔 BTC 永续合约交易方向做对了,最终仍然亏钱。下面我们按每笔支付逐项梳理账目,并通过核算检查解释原因。
阅读文章 →
如何判断策略的优势能否经受不同市场环境的考验?
策略的平均收益可能掩盖了它与某一种市场之间脆弱的默契。下面介绍如何判断它的优势能否在不同市场环境中延续。
阅读文章 →
更好的回测,可能让策略研究变得更糟
回测可以帮你否决一个糟糕的想法。可要是用它从 500 个想法里挑出最好的,胜出的可能只是运气最好。下面介绍如何让研究过程保持严谨。
阅读文章 →
为什么市场从未触及我的限价单,回测却显示成交?
限价出现在柱线区间内,于是回测就标记为成交。这只能说明价格触及了限价,并不能证明你实际成交。
阅读文章 →
策略通过了滚动验证,为什么模拟交易结果出现偏差?
策略通过了滚动验证,随后模拟交易结果却出现偏差。首先该怀疑的可能是研究到执行的衔接,而不是市场。
阅读文章 →
为什么我的回测成交价是市场从未显示过的价格?
如果模拟成交价优于K线中的所有价格,问题可能出在执行假设,而不是信号。下面介绍如何追溯这个价格的来源。
阅读文章 →
回测显示年换手率为 12%,账户实际交易了 38%。
回测可能显示年换手率为 12%,账户却交易了 38%。差距往往始于代码里“换手率”的定义。
阅读文章 →
如何防止 AI 策略智能体把明天的信息泄露到今天?
策略可能通过所有语法检查,却仍然“预知未来”。下面介绍研究智能体悄悄泄露信息的常见方式,以及能发现这些问题的检查方法。
阅读文章 →
如何回测围绕市场停牌交易的策略?
停牌不是一根成交量为零的 K 线。它会改变市场允许策略采取的操作,而复牌集合竞价还可能改写你原以为自己正在交易的价格。
阅读文章 →
费率等级变更后,你的优势消失了。是策略出了问题,还是账户?
策略的毛交易表现没有变化,但账户交易量改变了费率等级。下面介绍如何判断变化的是策略优势,还是账户状态。
阅读文章 →
卖掉明日赢家的再平衡:换手率拆解
排名表还不是交易策略,直到你把它转成订单。跟随一次月度再平衡,从目标权重到换手率、费用,以及那些可能让回测显得过于漂亮的假设。
阅读文章 →
你的回测偏爱表现最好的时段。换时后还能交易吗?
你的策略在第一个小时盈利——直到这个小时挪了位置。本指南将介绍如何跨夏令时切换和交易场所日程,实测日内季节性。
阅读文章 →
你的回测把同一笔现金花了两次:投资组合会计指南
一个仓位账面上可能盈利,却仍让你的下一笔订单无钱可用。3种常见的会计简化,解释了回测如何悄悄把同一笔现金花两次。
阅读文章 →
你的纸面策略重启后持仓变了:一封关于状态恢复的信
你重启了进程,但策略也恢复了吗?下面介绍如何确认策略对持仓、待处理订单和信号的记忆是否与纸面账户一致。
阅读文章 →
回测通过了,纸面策略却漏掉了 37% 的订单
我们的纸面策略提交了 100 笔订单,成交了 63 笔。回测却计为 91 笔。差距源于订单状态、时序和假设,这些问题无法从 Sharpe 比率中看出来。
阅读文章 →
我们尝试复现一项策略的回测,结果发现数字从这里开始偏离。
我们重新运行了一项已保存的策略,得到的权益曲线却不一样。几天里,我们沿着数据修订、依赖版本和一个出乎意料的小默认设置,追查了偏差来源。
阅读文章 →
如何判断回测使用的市场数据当时是否真的可交易?
价格正确,不代表回测就可靠。检查每条观测何时可用、代表哪个市场,以及策略当时能否据此采取行动。
阅读文章 →
我们在重启后重放了一次模拟策略,订单变了。
我们在持仓期间重启了一个模拟策略,结果得到了一组不同的订单序列。信号没问题,问题出在它的记忆上。
阅读文章 →
期权回测在到期时究竟会做什么?
到期时,期权的最后报价往往是盈亏计算中最没用的数字。下面介绍如何对结算、行权和交割建模,而不凭空假设成交。
阅读文章 →
你的连续期货图表对应着一个无人能交易的合约
2020 年 4 月 20 日,两份 WTI 合约的结算价相差 58.06 美元。若草率地把它们拼接起来,回测就会记入一笔没有任何持仓赚到的 58,060 美元。
阅读文章 →
在回测中途重启策略。它还记得自己持有什么吗?
策略可能在数据集中的每个行情里都安然无恙,却在进程重启时出错。把回放停在中途,看看它忘了什么。
阅读文章 →
你的模拟账户为何拒绝了回测成交:一封关于交易所过滤规则的信
你在回测中算对了订单规模,模拟交易平台却拒绝了订单。下面介绍如何把精度规则纳入策略的执行模型。
阅读文章 →
Tick 数据救不了你的回测——对大多数策略来说,反而会让结果更糟
分辨率更高,不代表结果更真实。对大多数策略来说,使用 Tick 数据解决了一个真实问题——成交和成本假设不准确——却换来了一个虚构的问题:误以为数据粒度越细,回测就越真实。
阅读文章 →
吞噬信号的再平衡:策略首次走进真实市场
信号对方向的判断没错。可到了再平衡时,投资组合还是一点点失去了优势:一次是因为盘口浅,一次是因为订单过大。
阅读文章 →
如何在不混淆 BTC 和美元的情况下回测反向永续合约?
一笔交易赚了 10,000 美元。账户增加了 15,000 美元。两个数字都是对的。你的回测需要解释那消失的 5,000 美元去哪了。
阅读文章 →
你的股票回测找到了做空机会。你真的借得到股票吗?
你的缺口回落策略会做空每一个选中的标的。可你的经纪商能提供的股票没那么多。入场前,先给那笔缺失的交易写封信。
阅读文章 →
你的回测滑点模型,故意设错才更诚实
滑点模型的目标不是猜测你本来能获得怎样的成交价,而是判断:面对那些无法从历史 K 线中得知、但合理可能出现的成交情况,你的策略能否经受住考验。
阅读文章 →
你的宏观回测交易了修订后的就业报告数据
你正确下载了历史就业数据序列,但策略依然交易了当时还不存在、两个月后才会公布的数字。下面介绍如何重建策略当时的信息集。
阅读文章 →
回测中该加入多少延迟?我们测量了自己的每一毫秒
中位数 195 ms。第 99 百分位 2,970 ms。信号实际触发的那些分钟里,中位数为 840 ms。只有其中一个数字值得关注。
阅读文章 →
5 条仓位规则,一个信号:回测真正起作用的部分
回测结果的大部分差异,来自持仓规模,而非入场时机。下面展示同一信号在 6 条仓位规则下的表现,包括手续费账单,以及报告漏报的峰值杠杆。
阅读文章 →
同样的代码、同样的数据,两个不同的 Sharpe:回测需要做的非确定性审计
11,205 根 bar 完全一致,随后排序出现并列,最终 Sharpe 相差 0.15。如果你不知道自己回测的抖动区间,就无法判断表现最好的参数组合究竟有没有胜出。
阅读文章 →
你的夏普比率通过了所有检验,但仍可能只是巧合
尝试1,000次之后,夏普比率达到2看起来可能非同寻常。真正令人意外的是,你为达到这个结果尝试了多少种方法。
阅读文章 →
为什么回测中的波动率目标无法控制它声称要控制的风险
10% 的波动率目标是仓位指令,不是风险保证。拆解一项 BTC 永续合约策略,看看这个数字何时不再能说明账户可能承受的损失。
阅读文章 →
资金费率看起来很划算,持仓却仍在亏损。
一笔永续合约每 8 小时支付 0.01% 的资金费。交易最终仍然亏损。回测中看似诱人的套利收益究竟去了哪里?
阅读文章 →
期权回测建立其上的那一行:逐字段拆解一张 Deribit BTC 看涨期权
这条行情大约有二十个字段。其中两个是没人以之成交的价格,三个的单位很可能被你的回测误读,而扼杀大多数期权策略的那个数字根本不在行情数据里。
阅读文章 →
你每笔回测下单 $2,000,现在想下 $50,000:一封关于容量的信
你的每笔交易毛优势为 22 bps。下 $2,000 时,冲击成本约 2 bps;下 $50,000 时则是 11 bps。接下来的计算将决定你拥有的是一套策略,还是一张截图。
阅读文章 →
你的回测从未被强平:保证金、标记价格,以及你忽略的杠杆边界
4 月权益曲线下跌了 63%,到 6 月又恢复了。在交易平台上,账户第 41 天就被平仓,已经没有任何资金可供恢复。
阅读文章 →
止损和止盈都落在同一根 K 线里。你的回测选了哪一个?
K线的低点低于你的止损,高点又高于你的止盈。其中一个先发生,但 K线没说是哪一个,而你的代码里总有一处替你做了决定。
阅读文章 →
不存在的那些分钟:OHLCV 历史数据中的缺口、停牌与零成交量 K 线
缺失的 K 线不会随机散落在历史数据里。它们恰好聚集在策略最关心的分钟,而常见的修补方法会让问题悄无声息地藏起来。
阅读文章 →
你的限价单没有成交:关于排队位置、做市回测,以及你虚构出来的 Sharpe
你的成交规则只有一行:如果这根 bar 的最低价不高于我的限价,我就成交。这一行发挥的作用比你的全部 alpha 还大,而且它做错了。
阅读文章 →
拆解拆股调整数据:NVDA 的 10 拆 1 如何影响背后的每一行
这行数据写着收盘价是 $120.8781。当天的市场成交价是 $1,208.88。两者相差 6 列,而大多数回测至少误读了其中 3 列。
阅读文章 →
回测预测市场时会遇到什么问题:八天实录
合约会到期,只在一个你无法掌控的日期支付1美元或一无所获。基于收益率的回测器里几乎每个固有假设在这里都不成立,而我们发现问题的顺序是这样的。
阅读文章 →
回测需要多少笔交易,夏普比率才有意义?
年化夏普比率的标准误大约等于 1 除以数据年数的平方根。所有令人不舒服的结论,都由这一行公式推导而来。
阅读文章 →
你搭建了一个只在 UTC 00:00 交易的策略——一封关于资金费结算时间伪影的信
你的 Sharpe 是 2.9,而且每一美元的收益都出现在资金费结算前后四分钟内。我见过这种一模一样的结果大概十几次。下面说说怎么查清你遇到的是哪一种。
阅读文章 →
为什么你的回测会把波动率飙升当成新市场状态
波动率目标管理听起来很灵活。但滞后的估算、不合理的下限或隐藏的再平衡规则,都可能让一周的艰难行情变成数月的敞口不足。下面介绍如何发现这些问题。
阅读文章 →
你的标的池是一台时间机器:加密永续合约回测中的幸存者偏差
你今天调用了一次 exchangeInfo,再按 status == TRADING 筛选,借此构建标的池。就这一行代码,悄无声息地删掉了所有已经消亡的币种。
阅读文章 →
一根 1 分钟 K 线的解剖:OHLCV 没告诉你的全部信息
一个 JSON 数组中的十二个值。其中至少四个值的含义,和你的成交引擎假设的并不一样。下面就是完整的一根 K 线,我们把它彻底拆开来看。
阅读文章 →
你的回测有 100 笔交易,为什么平均成交价还是个猜测?
100 笔交易、0.04% 费用,再加上 0.02% 的滑点假设,看起来可能很精确。但在弄清市场能承接多大规模之前,成交价仍然只是猜测。
阅读文章 →
为什么我的回测交易次数比模拟策略更多?
信号可能只发出一次“买入”指令,订单系统却尝试了 3 次并成交了 2 次。下面介绍如何模拟回测交易记录与模拟账户订单历史之间的差异。
阅读文章 →
即使每个时间戳都正确,你的回测仍有时钟问题
行情报价和信号可能拥有相同的时间戳,却以不同顺序到达。这一点微小的歧义,就可能决定你的策略是否实际成交。
阅读文章 →
为什么回测中的未成交订单需要时钟
限价单的存续时间可能超过创建它的信号。本文介绍回测常见的 3 种未成交订单追踪问题,以及一种让订单模拟更可靠的实用模型。
阅读文章 →
为什么你的回测会错误处理股息
股息可能看起来像突然的亏损、白得的收益,或是策略从未收到的现金余额。3种常见建模错误说明了原因。
阅读文章 →
三种让你在不知不觉中搞砸滚动前推优化的方式
滚动前推测试常被当作过拟合的解药。但如果做得随意,它不过是手续更齐全的过拟合。三种失效模式,以及各自的破绽。
阅读文章 →
一个 AI 智能体团队如何把一句话的交易想法做到模拟盘
十个智能体、一条流水线、一个专为淘汰想法而设计的漏斗。带你走一遍从"资金费率动量"到实盘模拟节点之间真正发生的事。
阅读文章 →
模拟盘是你的回测唯一要交代的基准
我们每天把每个模拟盘策略的时间窗重新跑一遍回测引擎,然后逐笔比对成交。这套例行动作反复捞出了什么,来看看。
阅读文章 →
九家交易场所上,一次完整往返到底要花多少钱
费率页面是营销材料。这里是那道决定你的策略究竟是一门生意还是一次捐款的双边算术题,逐个场所算给你看。
阅读文章 →
为什么大多数回测在撒谎,以及修正它们的四项成本
一个回测年化 +40%、实盘却亏钱的策略并不是运气差,而是从一开始就量错了。四项成本决定了这两个数字的差距。
阅读文章 →