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
TWAP、VWAP與POV對比:如何選擇執行基準(以及何時它們會對你撒謊)
TWAP、VWAP和POV本質上都是對成交量預測的一次押注。我們剖析每種調度演算法背後隱藏的假設,構建加密貨幣日內成交量曲線,並在回放的L2數據上對三者進行正面對比測試。
去掉玄乎其辭的 Almgren-Chriss:一個下午就能實現的最優執行模型
Almgren-Chriss 最優執行模型的完整推導:線性衝擊、sinh/cosh 交易軌跡、有效前沿,以及從 Binance L2 和成交資料校準 eta、gamma、sigma 的可執行 Python 程式碼。
誠實的負面結果:數萬次回測、五大主流幣,沒有穩健優勢
搜尋與過擬合這條主線的收官之作,以一個負面結果收尾——而這正是正確的結果。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 開銷。邊界本身很便宜,稅出在你如何跨越它。