跳至正文
全部策略

策略

强制抛售冲击后逢低提供流动性:在下跌幅度至少达到 3 个标准差且成交量高的小时收盘价下方分档挂单,持仓 12 小时后退出(OKX USDT 永续合约 ADA/DOGE/AVAX/DOT,1 小时线,仅做多)

结局: 已放弃

OkxForcedSellingSteppedMakerBids

结局总结

策略在异常大幅且成交量高的下跌小时后分档挂做市买单。沙盒运行平仓 294 笔,平均每笔收益为 -0.378%。QA 发现两处与止损相关的不一致,因此验证失败;运行在完整回测或优化前终止。

假设

分类为(a),但仅部分符合。Zero的FMZ帖子(2015)讲的是如何EXECUTE买入,而不是WHEN买入。您不直接吃卖价,而是在价差深处挂买单,再逐步抬价($1.05 -> $1.06 -> ... -> 卖价),直到急于成交的对手方主动卖给您。单靠这一点没有优势:每笔成交省下部分价差和maker/taker费率差,在OKX永续合约上每笔约为0.03-0.05%。这远不足以支撑一项策略,而经验教训L167也排除了照搬亚秒级逐笔循环的做法。因此,我们保留这一机制,并将其改写为K线级策略,结合帖子前提最充分的时刻:急于卖出的交易者愿为即时成交付出代价。在OKX USDT个掉期合约上,触发条件为一根1-HOURK线的对数收益低于过去30天小时波动率的-k倍,且成交量至少达到过去7天小时成交量中位数的3x倍。这代表被迫或急于卖出的时段(止损出场、强平)。触发后,我们扮演捡便宜的挂单者。在接下来的3根K线上,挂出一笔LIMIT(maker)买单,从较低价位开始逐步向市场抬价:第1根K线的买价 = 收盘价 x exp(-1.0 x波动率 x depth_scale),第2根K线 = 收盘价 x exp(-0.5 x波动率 x depth_scale),第3根K线 = 触发K线收盘价。每笔未成交买单都会在K线收盘时撤销,并替换为下一笔更高价买单(帖子中的撤单并抬价循环)。如果到第3根K线仍未成交,我们就跳过该事件,绝不以市价单追价;因此,只有卖方主动卖到我们的价格时才会成交。持仓hold_bars(12小时)后市价退出,或在更早触及相当于3倍波动率的止损时退出。交易品种:ADAUSDT.OKX(主要品种)、DOGEUSDT.OKX、AVAXUSDT.OKX、DOTUSDT.OKX。每个品种独立触发,每个品种最多持有一个仓位,每个品种设24小时冷却期,每个事件承担相同风险。标的数量上限为4个(经验教训L173)。来源注明:Zero,《高频交易策略:逐步报价捡便宜》,https://www.fmz.com/bbs-topic/41. source_ref:以$1.05 -> $1.06 -> $1.07逐步抬价描述开头的段落。

verification_loop:验证失败(Layer 4 — QA 审查)[类别=hypothesis_mismatch]: - [edge_concern] 沙盒记录了 294 笔已平仓头寸,平均每笔收益为 -0.378%。完整回测应评估反弹是否足以覆盖交易成本;此结果不决定正确性判定。 - [严重] 假设规定止损为 3 个标准差,但固定配置使用 4.0。这同时改变退出阈值和基于风险的仓位规模。(第 123 行)— 修复:将固定的 stop_sigma 参数设为 3.0,并在仓位规模计算和退出时统一使用。 - [严重] 代码仅在 K 线收盘后检查小时最低价是否跌破止损,随后提交市价退出单。因此,它无法在跌破时的价位执行所述止损。(第 124 行)— 修复:买单成交时放置只减仓的止损市价单,并在按时间退出前取消该单。

实现

仅做多的流动性提供策略,交易 OKX USDT 永续合约(主要品种 ADA;额外品种 DOGE/AVAX/DOT 个,1 小时线)。每个品种在某小时对数收益 <= -shock_k x 过去 720 小时波动率且成交量 >= 过去 168 小时成交量中位数的 3x 倍时独立触发。随后在 3 根 K 线上分档挂仅做市买单:触发收盘价 x exp(-1.0*sigma*depth_scale),再 x exp(-0.5*sigma*depth_scale),最后为触发收盘价。每笔未成交买单都会取消并调整买价;第 3 步后跳过该事件,绝不追价。持仓 hold_bars 小时后市价退出,或在相当于 4 个波动率的止损价触及或越过时退出。每个事件风险为 1%,每个品种名义金额上限为 25%,总额上限为 60%,每个品种冷却 24 小时。

针对 sandbox_timeout 的第 2 次迭代修复。信号、入场、出场和仓位规模逻辑均未改变。(1)168 根 K 线的成交量中位数原先使用 statistics.median(),每根 K 线都会重新排序窗口。现在改为增量维护的有序窗口(bisect insort/remove),因此每根 K 线的耗时为 O(log w),且不受回测跨度影响。(2)_gross_notional 中的 instrument-id 查询现在使用缓存的 key->InstrumentId 字典,而不是生成器扫描。本地测得:BacktestRunner 在 ADA+DOGE/AVAX/DOT OKX 1H 上运行 228s,墙钟耗时,区间为 2024-05..2026-08。较短窗口的 cProfile 显示,策略自身代码累计耗时约 1.5s,总耗时为 281s。约 260s 用于 ParquetDataCatalog 文件 glob 查询(spec.glob/find,parquet.py get_file_list_from_data_cls 中约 2.4M 次 stat 调用;两次 bars() 查询耗时 216s)。这是目录规模带来的查询开销,并非逐 K 线策略计算。根据经验教训 L155(c):如果沙盒再次超时,原因是目录查询开销,而非这段代码,因此需要修复基础设施(目录 glob 查询或预筛选文件列表),而不是再次迭代代码。注意:触发价收盘时的部分 step-3 只挂单买价被拒,因为这些订单会穿价。这符合假设(不追价;跳过该事件)。

验证结果

验证失败(Layer 4 — QA 审查)[类别=hypothesis_mismatch]: - [edge_concern] 沙盒记录了 294 笔已平仓头寸,平均每笔收益为 -0.378%。完整回测应评估反弹是否足以覆盖交易成本;此结果不决定正确性判定。 - [严重] 假设规定止损为 3 个标准差,但固定配置使用 4.0。这同时改变退出阈值和基于风险的仓位规模。(第 123 行)— 修复:将固定的 stop_sigma 参数设为 3.0,并在仓位规模计算和退出时统一使用。 - [严重] 代码仅在 K 线收盘后检查小时最低价是否跌破止损,随后提交市价退出单。因此,它无法在跌破时的价位执行所述止损。(第 124 行)— 修复:买单成交时放置只减仓的止损市价单,并在按时间退出前取消该单。

迭代历史

sandbox_timeout:验证失败(Layer 3 — 沙盒回测):在约 20000 根 K 线的窗口(ADAUSDT.OKX-1-HOUR-LAST-EXTERNAL 的 833 天)上,冒烟测试超过 300 秒墙钟时间限制。这通常意味着逐 K 线工作量随历史长度增长,例如反复扫描完整资金费率/补充序列,或在每根 K 线的 calculate_signal()/on_bar() 内重建列表并调用 min()/sorted()。在 __init__ 中预先计算排序后的时间戳数组 ONCE 并使用 bisect,或按时间戳缓存查找结果,使逐 K 线开销为 O(log n),而非 O(n)。

结局总结

使止损与假设一致,并在买单成交时通过订单执行止损。

经过两次迭代,Layer 4 QA 验证失败:配置的止损为 4 个标准差,而非提议的 3 个标准差;且代码仅在 K 线价格跌破止损后才提交市价退出单。未进入后续阶段。

该策略尝试用分档做市买单,在四种 OKX USDT 永续合约中买入强制抛售冲击后的资产。

沙盒记录了 294 笔已平仓头寸,平均每笔收益为 -0.378%。没有完整回测或优化报告。

放弃原因

verification_loop:验证失败(Layer 4 — QA 审查)[类别=hypothesis_mismatch]: - [edge_concern] 沙盒记录了 294 笔已平仓头寸,平均每笔收益为 -0.378%。完整回测应评估反弹是否足以覆盖交易成本;此结果不决定正确性判定。 - [严重] 假设规定止损为 3 个标准差,但固定配置使用 4.0。这同时改变退出阈值和基于风险的仓位规模。(第 123 行)— 修复:将固定的 stop_sigma 参数设为 3.0,并在仓位规模计算和退出时统一使用。 - [严重] 代码仅在 K 线收盘后检查小时最低价是否跌破止损,随后提交市价退出单。因此,它无法在跌破时的价位执行所述止损。(第 124 行)— 修复:买单成交时放置只减仓的止损市价单,并在按时间退出前取消该单。

分析

高频交易策略之Poke for bargain

Stratmill 是研究与模拟交易工具,不提供财务建议,也不是经纪商。回测与模拟结果均为假设性结果。交易存在亏损风险。