策略
OKX 横截面 52 周高点锚定价差:美元中性,做多最接近过去高点的名称/做空离过去高点最远的名称(15 OKX USDT 个互换合约,日线 K 线,每周再平衡)
结局: 已放弃
OkxFiftyTwoWeekHighAnchoringSpread
结局总结
OkxFiftyTwoWeekHighAnchoringSpread 用于检验锚定于 52周高点是否能产生横截面优势。每周一,该策略按距近期高点的远近对 15 个 OKX 永续互换合约排名,并持有等美元多空腿。假设本身已提示沙盒超时风险,代码也使用了带单调队列最大值的有界双端队列。即便如此,经过 6 次迭代后,第 3 层沙盒冒烟测试仍在 2400 天日线窗口上超过 300 秒限时。验证阶段便放弃了该运行,未进行回测、优化、分析或风险审查。
假设
在 15 个 OKX USDT 永续互换合约上运行的美元中性、多标的多空横截面策略(OkxCollector USDT互换合约 OHLCV,目录 ID 为 <BASE>USDT.OKX,1-DAY K 线;每条腿均在目录中验证,日线历史始于 2020-01,止于 2020-12)。信号:George & Hwang(2004)52周高位比率 PTH_i = close_i / 最近 N 根日线 K 线中的最高值(high_i)。其机制是锚定效应,而非收益动量。交易者将近期高点作为参考,并对推动币价接近高点的消息反应不足,因为阻力位附近会聚集卖出者和希望保本离场的卖家。远低于高点的币种会受到被套持有者的抛压,每次反弹时他们都会卖出。这NOT一种按收益排名的动量轮动:两种币即使过去 30 天收益相同,PTH排名也可能相反。每周一 00:00 UTC 日线收盘时,按 PTH 对 15 个标的排名。等美元权重做多前 K 名、做空后 K 名,使组合净美元敞口为零。已处于正确分组的标的继续持有,不进行无谓换仓。依据 L186/L181 的数据检查:所有 15 个 1-DAY K 线目录均存在,首根 K 线日期从 BTC/ETH/BCH/ETC 2020-01-02 到 AAVE 2020-12-12,重叠历史约 5.8 年。为避免 sandbox_timeout,实现时应为每个标的保留固定长度的高点双端队列,不要逐根 K 线重扫完整历史,并且仅在再平衡 K 线上排名。
该策略满足 long_short(16.5%)、OKX(1.9%)以及多标的类别,并避免 BINANCE/BTC 集中度。52周高位锚定家族没有先前假设。它避开了 L111(无补充筛选门槛)、L179(按排名触发;周度时钟仅设定频率)和 L102(无期权)。各腿依据 L186 在目录中验证。为避免第-1.5层“修复杠杆”偏差,optimization_plan 中刻意不使用杠杆;总敞口由 per_leg_weight x K 设定。
verification_loop:sandbox_timeout:验证失败(第 3 层——沙盒回测):冒烟测试在约 20000 根 K 线的窗口(BTCUSDT.OKX-1-DAY-LAST-EXTERNAL 的 2400 天)上超过 300 秒的实际运行时限。这通常意味着每根 K 线的工作量随历史长度增长,例如反复扫描完整资金费/补充序列,或在每根 K 线上于 calculate_signal()/on_bar() 内重建列表并调用 min()/sorted()。在 __init__ 中预先计算已排序的时间戳数组 ONCE 并使用 bisect,或按时间戳缓存查询,使每根 K 线的成本为 O(log n) 而非 O(n)。
实现
每周一 UTC 收盘时,按收盘价除以近期日线高点的比率对 15 个 OKX 互换合约排名。持有前 K 名等美元多头目标和后 K 名等美元空头目标,在原位调整保留腿,并设置日线收盘腿部及组合止损。
保留此前策略的信号、标的范围、时间安排、风险阈值和研究参数权限。将重复的 max(buffer) 扫描替换为数学上等价的有界单调队列:每个输入 K 线的摊销复杂度为 O(1),每次 PTH 查询的复杂度为 O(1);排序仍每周对 15 个名称进行。未运行性能测试,因此尚未确认是否解决了 300 秒超时。此前的实现已经有界,并使用了活跃订单查询;如果再次超时,应对数据加载、资金费率累计、执行和报告进行工程性能分析,而不是再次臆测性地修改信号。未读取任何期末考试数据。由于本会话仅允许读取文件,无法写入所请求的发件箱文件;完整的任务限定 JSON 在此返回。
验证结果
sandbox_timeout:验证失败(第 3 层——沙盒回测):冒烟测试在约 20000 根 K 线的窗口(BTCUSDT.OKX-1-DAY-LAST-EXTERNAL 的 2400 天)上超过了 300 秒的墙钟时间限制。这几乎总是意味着每根 K 线的工作量随历史数据规模增长,例如重新扫描完整的资金费率/补充数据序列,或在每根 K 线上于 calculate_signal()/on_bar() 内重建列表并调用 min()/sorted()。在 __init__ 中预先计算已排序的时间戳数组 ONCE 并使用 bisect,或者按时间戳缓存查询,使每根 K 线的开销为 O(log n),而不是 O(n)。
如果组合止损的目的是设置冷却期,则在止损触发后跳过当天再平衡,或要求空仓 N 周。
组合止损会调用 _flatten_all(),但在周一收盘时,_rebalance 会在同一次 calculate_signal 调用中运行。它立即设定新目标,并在随后几根 K 线上执行。因此,12%组合止损后可能立即重新进入一个几乎相同的组合,这会削弱止损的大部分作用。假设没有规定止损,因此这不构成偏差。
无需更改。可选择为空头腿附加只减仓 stop_market 订单,因为挤空是主要尾部风险。
腿部和组合止损仅在日线收盘时检查,没有盘中保护。若在一个 8% 腿上设置 25% 腿部止损,计划亏损上限约为每条腿权益的 2%,但跳空可能使亏损超出该水平。此情况已有说明,在 1D K 线上可以接受。
对当前交易范围而言可以接受。可考虑按可用标的排名(至少需要 2K),而不要求全部 15 个标的都可用。
每次再平衡时,只要 15 个标的中有一个缺少完整回看期,或其 K 线早于 stale_bar_days,就会平掉整个组合。因此,单个已退市或暂停交易的 OKX 互换合约就可能永久停止策略。基础对齐屏障也会跳过任何缺少某条腿 K 线的日期。
分析 _work_pending/_risk_checks。若没有未平仓头寸,则让 _risk_checks 提前返回;仅对有待处理项目的标的调用 _close_pending。
沙盒处理 15 个日线腿、共 1480 天耗时 261 秒,且 runtime_review_required=true。策略自身的逐 K 线工作量有界:固定长度双端队列,仅在排名时对至多 365 个高点调用 max(),以及一个 15 个标的的循环。因此,成本很可能来自 _close_pending/_entry_order_inflight 中反复扫描 cache.orders 和引擎开销,而非重扫历史。完整区间为 1849 天,因此单次回测应能完成,但优化试验会很耗时。
冒烟测试:夏普比率 0.33,CI [-0.64, 1.22],PF 1.09,最大值 DD 31.9%。压力波动率三分位组亏损 12.7%,且 rate_shock_2022 亏损 19.2%。资金费率已折叠计入 NOT(funding_events_available=0),但自 2022-01 起存在 OKX 资金费率。每条腿持有约 38 天的高位做多/低位做空组合,往往会做多需要支付资金费率的拥挤标的,因此完整回测必须计入资金费率。账本也不一致:avg_trade_pnl_usd 为 +$62,而 avg_trade_return_pct 为 -0.29%。原位调整仓位大小和净额对冲翻转可能扭曲了按持仓计算的百分比基准。使用该百分比数值与 0.15% 下限比较前,先核对并调和数据。运行 261 秒,覆盖 1480 天,因此应先分析每根 K 线的开销,再进行优化。
分析
迭代历史
验证失败(第 4 层——QA审查)[类别=code_defect]: - [edge_concern] 沙盒未提供这些永续头寸的资金费现金流。全历史经济性分析应评估资金费成本以及压力时期集中的亏损。 - [critical] 基础模板要等到累计 min_bars_required() 根主 K 线后才调用 calculate_signal()。由于主高点双端队列仅在 calculate_signal() 内填充,最初 252 个主高点会被丢弃。当 high_lookback_days=252 时,主双端队列约到第 504 根 K 线才就绪;设定的 370 根 K 线预热期不足以填满。额外标的从第一根 K 线开始累计高点,因此策略可能在排除 BTC 的同时,对 14 个标的组成的范围进行排名和交易。重启预热也会重现这种不一致。(第 62 行)——修复:信号处理开始时,从基础主历史填充主滚动高点缓冲区,并按时间戳去重;或者允许 calculate_signal() 从第一根 K 线开始运行,并在所有 15 缓冲区包含所需回看期前单独禁止交易。验证设定的 370 根 K 线预热后是否就绪。 - [critical] 保留的头寸维持现有数量,而替换头寸各分配当前权益的 8%。保留头寸的当前美元名义金额会随价格变动,与新开腿不同。因此,多空数量相等并不能保证每周再平衡时的假设所要求的等美元、美元中性组合。独立分批建仓和延迟反转会进一步造成失衡。(第 181 行)——修复:使用同一权益快照计算完整目标组合,按当前价格衡量保留腿,并提交数量调整,使多头和空头美元总额恢复相等。保留现有头寸,不要先平仓再重新开仓。若必须维持数量不变,应明确解决这一要求与美元中性要求之间的冲突。
验证失败(第 4 层——QA审查)[类别=hypothesis_mismatch]: - [edge_concern] 沙盒未计入永续合约资金费现金流,且报告的已平仓头寸平均收益为负,尽管账户增长为正。全历史分析应评估资金费成本,并区分头寸层面收益与组合层面收益。 - [critical] 再平衡条件会检测新的一周,但不要求在周一 00:00 UTC 执行。由于 _last_rebal_week 初始化为 -1,第一个预热完成且对齐的 K 线会在任意星期触发再平衡。同样,如果就绪状态导致处理延迟至周一之后,本周第一个就绪的 K 线也会触发轮动。这违反了假设中明确规定的仅周一执行的时间表。(第 231 行)——修复:创建新目标组合前,要求 K 线时间戳为周一 00:00 UTC,并持久化最后执行的计划时间戳。继续独立于此时间表处理现有待执行目标。 - [warning] 25%腿的止损仅在日线收盘时评估。盘中跌破后又恢复不会触发止损,跳空也可能导致亏损大幅超过设定百分比。(第 108 行)——修复:将其说明为日线收盘止损,或维护数量随头寸调整的只减仓保护性止损单。 - [warning] 冒烟测试耗时约 297 秒,几乎达到 300 秒的限时。该策略加载 15 个日线标的,维护有界的 120–365 根 K 线高点缓冲区,并且只在每周再平衡时进行排名;未发现扩展历史模型拟合或额外重扫。不过,反复运行优化仍需进行工程运行时审查。(第 166 行)——修复:在优化前分析订单处理、待执行目标处理和引擎开销,同时保留交易范围、历史数据和允许的参数。
验证失败(第 3 层——回测进程):策略无法在回测进程中加载/构建: in _run_backtest supp = _resolve_supp(input_config) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ 文件 "/opt/strategy-factory/src/backtesting/subprocess_entry.py",第 118 行,在 _resolve_supp 中 supp = load_for_subprocess( ^^^^^^^^^^^^^^^^^^^^ 文件 "/opt/strategy-factory/src/backtesting/supp_collector.py",第 664 行,在 load_for_subprocess 中 supp = asyncio.run( ^^^^^^^^^^^^ 文件 "/usr/lib/python3.12/asyncio/runners.py",第 194 行,在 run 中 return runner.run(main) ^^^^^^^^^^^^^^^^ 文件 "/usr/lib/python3.12/asyncio/runners.py",第 118 行,在 run 中 return self._loop.run_until_complete(task) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 文件 "uvloop/loop.pyx",第 1518 行,在 uvloop.loop.Loop.run_until_complete 中 文件 "/opt/strategy-factory/src/backtesting/supp_collector.py",第 683 行,在 _ensure_then_load_supp 中 await _ensure_perp_fu
结局总结
一个包含 15 个标的的策略必须控制每根 K 线的工作量(有界滚动最大值、仅在再平衡 K 线上排名,以及不在每根 K 线上扫描整个标的范围内的缓存或订单),并且应在迭代前对照 300 秒的沙盒预算检查这项开销。在本例中,即使假设中有明确警告,且采用了单调队列设计,也未能使其低于限时要求。
经过 6 次迭代后,该策略在验证循环中被放弃。第 3 层沙盒回测在约 20,000 根 K 线的窗口(BTCUSDT.OKX 的 2400 天,1-DAY K 线)上超过 300 秒的实际运行时限,因此回测审查、分析和风险阶段均未运行。
在日线 K 线上,对 15 个 OKX USDT 互换合约进行美元中性、每周调仓的多空价差策略。做多最接近其过去 52 周高点的名称,并做空离该高点最远的名称(George & Hwang 锚定比率,即收盘价 / 过去最高价),而不是按收益动量排名。
没有绩效数据。该策略从未通过验证,因此没有回测报告,也没有优化报告:没有收益、夏普比率或交易次数。
Stratmill 是研究与模拟交易工具,不提供财务建议,也不是经纪商。回测与模拟结果均为假设性结果。交易存在亏损风险。