策略
Hummingbot PMM V1(纯做市,由 hummingbot 开发)——忠实移植至 BTCUSDT.BINANCE_SPOT,1 个买入 + 1 个卖出限价档位,位于中间价 ±1%;每 30 秒刷新,成交后延迟 60 秒,库存偏斜 OFF(源代码默认值)
结局: 已放弃
HummingbotPmmV1BtcSpot
结局总结
本假设尝试将 Hummingbot 的 PMM V1 对称限价单做市商移植到 Binance 现货 BTCUSDT。平台改动仅限于强制适配:数量固定为初始权益的 25%,每根 1 分钟K线刷新一次,并检查现货余额。策略始终未能完成编码:迭代 3 次后,运行因“coding_stuck_3_timeouts”而中止。最终未生成回测、优化或分析师结论。
假设
针对第 2 层故障的第 2 次修复。合成测试使用的模拟缓存没有 orders_inflight() 或 account_for_venue() 方法。现在代码使用 getattr 查找这两个方法,并在方法缺失时跳过调用。真实的 NautilusTrader 缓存具有这两个方法,因此回测和模拟交易行为不变。没有更改其他内容。平台适配与之前相同:以K线收盘价代替订单簿中间价,刷新和成交延迟按K线时钟运行,固定基础订单数量根据权益设定,每一侧都受现货余额限制。边际风险在于:价差为 1%,每笔成交支付 0.10% 的挂单手续费,因此只有当 BTC 在约 2% 的区间内来回波动时,策略才会盈利。在单边趋势中,策略会在一侧持有 BTC 或现金。
coding_stuck_3_timeouts
实现
忠实移植 Hummingbot PMM V1(纯做市)至 BTCUSDT 现货市场,使用 1 分钟K线收盘价作为中间价。维持一笔买入限价单 GTC,价格为中间价 × (1 − 1%);另维持一笔卖出限价单 GTC,价格为中间价 × (1 + 1%)。每根K线都会撤销尚未成交的报价并重新下单,因为 30 秒的刷新间隔短于一根K线。成交后,该侧须等待 60 秒才会再次报价。订单数量为固定基础数量,在启动时设定:以初始权益的 25% 除以首根收盘价。库存偏斜已关闭,价格区间已禁用,与源代码一致。只有可用 USDT 足够时才会下买单,只有持有足够 BTC 时才会下卖单。
迭代历史
验证失败(第 2 层——合成情景): 使用的参数:['buy_spread', 'price_floor', 'sell_spread', 'price_ceiling', 'filled_order_delay', 'order_refresh_time', 'quote_balance_buffer', 'order_amount_equity_frac'] 请检查 __init__ 是否设置了 self.parameters.get() 返回的所有属性。 - steady_uptrend:AttributeError:'_MockCache' 对象没有属性 'orders_inflight'(K线时间戳:1735689660000) - steady_downtrend:AttributeError:'_MockCache' 对象没有属性 'orders_inflight'(K线时间戳:1735689660000) - flat_ranging:AttributeError:'_MockCache' 对象没有属性 'orders_inflight'(K线时间戳:1735689660000) - volatility_spike:AttributeError:'_MockCache' 对象没有属性 'orders_inflight'(K线时间戳:1735689660000) - zero_volume:AttributeError:'_MockCache' 对象没有属性 'orders_inflight'(K线时间戳:1735689660000) - price_gap:AttributeError:'_MockCache' 对象没有属性 'orders_inflight'(K线时间戳:1735689660000)
sandbox_timeout:验证失败(第 3 层——沙盒回测):冒烟测试在约 20000 根K线的窗口(BTCUSDT.BINANCE_SPOT-1-MINUTE-LAST-EXTERNAL 的 30 天)上超过了 300 秒墙钟时间限制。这几乎总是意味着每根K线的工作量会随历史数据增长,例如反复扫描完整的资金费率/补充序列,或在每根K线上于 calculate_signal()/on_bar() 内重建列表并调用 min()/sorted()。在 __init__ 中预先计算已排序的时间戳数组 ONCE 并使用 bisect,或按时间戳缓存查询结果,使每根K线的开销为 O(log n) 而非 O(n)。
结局总结
订单管理繁重的移植版本(每根K线都撤单并重新报价、等待撤单确认、检查现货余额)复杂到足以导致编码阶段超时,因此今后尝试时应从更简单、更精简的实现开始,以便在编码时限内完成。
运行在编码阶段因“coding_stuck_3_timeouts”而中止,此前已迭代 3 次,因此未进行验证、回测审查、优化、分析师审查或风险审查。
忠实移植 Hummingbot 的 PMM V1 纯做市策略,运行于 BTCUSDT.BINANCE_SPOT 的 1 分钟K线上,在中间价 ±1% 处各挂一笔买入和卖出限价单,每根K线刷新,成交后等待 60 秒再报价;关闭库存偏斜,不设止损、止盈或时间退出。
没有绩效数据:回测报告为空,也不存在优化报告,因此未记录收益、夏普比率或交易笔数。
分析
PMMV1
Stratmill 是研究与模拟交易工具,不提供财务建议,也不是经纪商。回测与模拟结果均为假设性结果。交易存在亏损风险。