Eugen Soloviov
Trading-systems engineer
Trading-systems engineer building bots since 2017: cross-exchange arbitrage (connected up to 30 venues), cointegration-based pairs arbitrage across spot and futures, scalping, news and sentiment-driven strategies, trend algorithms, and portfolio management and balancing algorithms. Also builds sub-millisecond order execution, big-data warehouses, backtesting engines, AI agents, and trading interfaces (incl. open-source profitmaker.cc). Stack: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, architecture.
Articles
诚实的负面结果:数万次回测、五大主流币,没有稳健优势
搜索与过拟合这条主线的收官之作,以一个负面结果收尾——而这正是正确的结果。ETHUSDT 上的单品种双时间框架搜索找到了一个样本外 +16.35%、未触碰留出窗口 +2.62% 的配置;Deflated Sharpe Ratio 在计入约 37,000 次试验后把它折损到 0.00。对五个主流币(ETH/BTC/SOL/BNB/XRP,每个约 1.18M 根 1 分钟 K 线)按样本外中位数选择的跨品种检验则彻底终结了它:双时间框架 DSR 0.24 / PBO 0.264,三时间框架 DSR 0.14 / PBO 0.327——两者都没过闸门。冠军只在 5 个品种中的 1 个上盈利,其余全部为负。这正是反过拟合装置存在的意义:阻止你把噪声中的最优当成 alpha 拿去上线。
证明多时间框架回测中没有look-ahead:扰动未来,证明过去看不到它
多时间框架回测会通过一根仍在形成中、尚不存在最终收盘价的高时间框架K线泄露未来信息。仅靠代码审查无法建立信心——必须实际测试。我们精确复现了实盘机器人的closed-bar规则,然后用一个“未来偏移探针”证明没有信息泄露:扰动每一根未来K线,并断言每一个过去的信号和交易都逐位不变。25/25项一致性检查全部通过,而且这个探针确实有效(并非一个永远不会失败的空测试)。
GPU 何时才划算:参数扫描的屋顶线,一个 167x 头条其实是 27x 算法 × 6.2x 硬件
GPU 相对 CPU 的领先幅度随批量大小增长——在我们的多时间框架指标预计算上,从每次调用一个组合时的 54.5x 一路升到 61 个组合时的 359.6x——因为一次小规模扫描无法摊薄内核启动和传输开销。我们把一个 167x 的头条数字拆解为一个同样惠及 CPU 的 27x 算法收益,乘以一个 6.2x 的硬件收益,指出 GPU 相对最佳 CPU 的真实领先在单时间框架下只有 3.2x、在多时间框架下只有 6.2x,并给出一份决策指南:一次扫描要宽到什么程度,才值得为 GPU 掏钱。
GPU 精度陷阱:Apple Metal 上的 fp32 回测如何悄无声息地返回垃圾结果
Apple 的 Metal GPU 没有 float64。把一个向量化回测天真地移植过去,那个诱人的前缀和 WMA 就会在 fp32 下溢出——最大相对误差 211 倍——但它依然能跑完全程,还返回看起来说得过去的数字。修复的办法不是提高精度,而是换一种公式:直接的窗口卷积,fp32 下精度可达 8×10⁻⁷,比单线程 numba 快 55.9 倍。这篇文章讲清楚陷阱本身、背后的算术,以及如何证明自己没有掉进去。
保真度关卡:由粗到细的回测会更快地愚弄你——除非廉价代理的排序方式与昂贵评估一致
下钻式/多保真度搜索(ASHA、逐次减半、Hyperband)以低成本方式筛选成千上万个配置,只将存活者提升到昂贵的完整评估阶段。这是一种真实的加速——但如果低保真度的排序与高保真度的排序不一致,它就会悄无声息地崩溃。我们测量了折数-排序相关性:在只用一折时,Spearman ρ 可能低至 0.03(排序几乎是随机的),随着折数累积,逐步升高到 0.43、0.67、0.78、0.91。修复方法是设置一道强制性关卡——先测量 ρ(廉价, 完整),并自动将最低保真度提升到 ρ ≥ 0.5 的第一个档位。
随机搜索 vs 智能搜索:交叉点在评估成本,而非算法本身
当单次回测很便宜时,简单的打乱 Sobol 序列在原始吞吐量上碾压所有"智能"采样器——TPE、CMA-ES、ASHA 要缴纳 Python ask/tell 税,导致速度下降 20 倍,在相同墙钟时间内评估的点数远远更少,因而落败。让每次评估变得昂贵(多时间框架 + walk-forward 折)之后,交叉点就翻转了。我们测量了这两种情形,以及为什么折叠排名保真度(ρ@1 从 0.03 升至 0.43)是剪枝能否奏效的前提条件。
双轴参数空间:为什么你的大部分参数扫描几乎是免费的
并非所有参数的搜索成本都相同。一个策略的参数会分裂为一条昂贵轴(指标——需要在整个序列上重新计算)和一条廉价轴(决策阈值——对预计算信号做一次 O(n) 遍历)。由于指标对阈值不变,你只需计算一次,就能以约 5,600 cfg/s 的速度扫描数千种阈值配置——比每种配置都重新计算大约便宜 1,600 倍。这是对维度灾难的一次重新定价。
框架税:当你的回测库比手写的 pandas 循环还慢
我们在同一个参数扫描任务上对八个回测引擎进行了基准测试——15万根K线、80个HMA交叉组合、交易笔数严格锁定在2707笔。两个最受欢迎的事件驱动框架的速度居然比手写的 pandas 循环还慢,而一个向量化/编译型引擎完成同样的工作快了约13000倍。这是一篇关于主流库从未被设计用来摊销的逐K线开销的研究。
回测过拟合概率(PBO):你的搜索跑赢抛硬币了吗?
Deflated Sharpe Ratio 给获胜策略定价;PBO 给挑出它的那次搜索定价。组合对称交叉验证(Combinatorially Symmetric Cross-Validation)在一个 1000x200 的表现矩阵上跑 C(16,8) = 12,870 次训练/测试切分,问的是:样本内赢家会不会落入样本外的后一半?几乎每个人都会看错的地方——PBO 的零假设值是 0.5,不是 1。在 200 个零优势策略上,最佳样本内年化夏普比率 1.98 在样本外坍缩到 0.06,PBO = 0.476:如同抛硬币,彻底过拟合。植入一个真实优势(年化夏普比率 2.38),PBO 降到 0.001,样本内的 3.73 在样本外仍保住 2.34。在纯随机游走上跑移动平均线网格,同样没有任何样本外的技巧——60 个矩阵平均 PBO 0.463,在统计上和零假设无法区分——而在其中一个具有代表性的矩阵上,这场海市蜃楼十分鲜明:最佳样本内夏普比率 2.33 坍缩到样本外中位数 -0.22,PBO 0.573,63% 的概率会亏钱。
IPC 税:把回测引擎放到 socket 背后会损失 13%——而这几乎与 socket 无关
我们把一个 numba 回测内核逐行移植到 Rust,并以四种方式跨进程边界调用它,用等价性校验确认到最后一笔交易都完全一致的 PnL。把整条 1.2 MB 的价格序列通过 Unix socket 传输一次,成本约 2 毫秒——约占整个任务耗时的 0.1%。对同一份数据做 JSON 编码,成本是原始字节的 1348 倍;健谈式的逐组合调用把数据重复传输了 80 次;逐 bar 调用模式会在一个 2.0 秒的任务上白白付出 2.1 秒的纯 IPC 开销。边界本身很便宜,税出在你如何跨越它。
Deflated Sharpe Ratio:你回测里的'赢家',有多少能扛过多重检验?
参数搜索是一台制造运气的机器。在纯噪声上——1,000 个真实优势为零的策略——最佳年化夏普比率平均达到 1.63,朴素显著性检验 100% 的时候都会宣布发现。我们构建受控的真实基准,证明 Deflated Sharpe Ratio、Harvey-Liu 折价法与 White's Reality Check 能够恢复诚实:假发现率从 1.000 降到 0.001-0.057,噪声上限之上的真实优势仍以接近 1 的功效被保留——还有一个真实的陷阱(相关网格),在那里原始 DSR 会过度折损,其结论必须放在一整条有效试验数估计的区间上通读,而不是只看一个数字。
目标函数设计:你优化的那个指标,正悄悄替你选好了策略
要搜索'最好'的策略,你必须先定义什么是'最好'——而那个标量,会悄悄替你选出赢家。在带有已知优势的合成数据上(600 个种子,T=2000,80 个候选阈值),朴素的逐笔(per-trade)夏普比率会加冕一张彩票:它在 56% 的种子上选出曝光率低于 5% 的赢家,在 57% 的种子上发生退化——在最极端的那个种子上,8 笔交易的样本内夏普比率高达 21.09,样本外却崩塌到 0.13。诚实的修复几乎平淡无奇:在整条时间线上测量,它从不退化(样本外 1.71)。交易笔数(conf_k)收缩与曝光率下限可以给逐笔指标打补丁,但即便完全修复,它们也只能追平整条时间线夏普比率(1.70 对 1.71)——永远无法超过它。古德哈特定律,在回测里,配上受控的真实基准。