跳至正文
全部策略

策略

SPY 牛市回调逆势策略(忠实移植 Farrell Aultman 的 pinkfish「ac-countertrend」)——仅做多、全仓,DAILY 根柱,SPY.USEQ

结局: 已放弃

SpyAcCountertrendPullback

结局总结

SpyAcCountertrendPullback 将 pinkfish「ac-countertrend」牛市回调买入策略移植到日线 SPY.USEQ,保留源代码的规则、默认值和回调计算中的反常之处。它经过 3 次迭代,并多次遭遇第 3 层沙盒超时(超过 300 秒限制)。最后一个版本已采用每根柱 O(1) 更新,开发者指出耗时似乎发生在策略代码之外。在验证循环中,团队放弃了该策略;运行未生成任何回测指标,因此该假设从未得到检验。

假设

由 Farrell Aultman 编写的 pinkfish 示例策略“ac-countertrend”的 MIT 许可逐行移植版(https://github.com/fja05680/pinkfish/blob/18a0d557ead25e0e82de3ece86bcab6c325a59ed/examples/strategies/ac-countertrend/strategy.py). 说明:该策略由 Farrell Aultman 编写。源策略在日线柱上交易 SPY。我们的平台将该标的列为 SPY.USEQ,提供数十年的拆股调整日线历史数据,佣金为零,往返点差加冲击约为 0.02-0.05%。因此无需适配交易场所或费用。这不是导致 FMZ 移植版失败的费用制度不匹配问题(教训 167)。机制:在上升趋势中(40 日 EMA 高于 80 日 EMA),当价格跌破 20 日最高收盘价时买入。价格反弹至 20 日 SMA 上方、触发止损、市场状态反转或达到 20 根柱的持仓时限时退出。仅做多,单一持仓,大多数时间为空仓。所有指标使用日线 CLOSE,并严格按照源代码计算:ema_fast = EMA(close,……展开收起

由 Farrell Aultman 编写的 pinkfish 示例策略“ac-countertrend”的 MIT 许可逐行移植版(https://github.com/fja05680/pinkfish/blob/18a0d557ead25e0e82de3ece86bcab6c325a59ed/examples/strategies/ac-countertrend/strategy.py). 说明:该策略由 Farrell Aultman 编写。源策略在日线柱上交易 SPY。我们的平台将该标的列为 SPY.USEQ,提供数十年的拆股调整日线历史数据,佣金为零,往返点差加冲击约为 0.02-0.05%。因此无需适配交易场所或费用。这不是导致 FMZ 移植版失败的费用制度不匹配问题(教训 167)。机制:在上升趋势中(40 日 EMA 高于 80 日 EMA),当价格跌破 20 日最高收盘价时买入。价格反弹至 20 日 SMA 上方、触发止损、市场状态反转或达到 20 根柱的持仓时限时退出。仅做多,单一持仓,大多数时间为空仓。所有指标使用日线 CLOSE,并严格按照源代码计算:ema_fast = EMA(close, 40);ema_slow = EMA(close, 80)(pinkfish.EMA 是 TA-Lib EMA,以首 N 个收盘价的 SMA 作为种子);bull = ema_fast > ema_slow;daily_std = close.pct_change() 的滚动 40 柱样本标准差(ddof=1,即 pandas 默认值);high_close = close INCLUDING 当前柱的滚动 20 柱最大值;pullback = (high_close - close) / daily_std;exit_ma = SMA(close, 20)。预热期:所有指标均非 NaN 前不交易(源代码会删除 NaN 行,约为 81 根柱)。DEFAULT PARAMETERS EXACTLY AS WRITTEN:std_period=40,high_period=20,ema_fast=40,ema_slow=80,hold_period=20,min_pullback=3.0,exit_ma=20,stop_loss_pct=0.15,exit_on_bear=True,保证金=1(无杠杆),use_adj=False。SOURCE QUIRK THE DEVELOPER MUST KEEP(不要“修正”):回撤指标将以 DOLLAR 计量的距离(high_close - close)除以无量纲的收益率标准差(SPY 约为 0.01),因此它NOT是真正的 z 分数。若 SPY 接近 $500,且 daily_std 接近 1%,则回撤 >= 3.0 只要求收盘价比 20 日最高收盘价低约 $0.03-0.15。实际上,只要市场处于牛市状态,收盘价几乎只要低于 20 日最高收盘价就会触发入场。移植版保留了原公式。单位正确的变体(除以 close*daily_std)属于另一种 SEPARATE 假设,并非此处的策略。仓位规模:全仓投入,即使用账户权益的 100%(pinkfish margin=1 → 杠杆 1.0),按整股计算:floor(equity / price)。费用:USEQ 不收佣金;我们的引擎会模拟点差和冲击。预计约有 55-70% 的交易日为空仓,因为策略在首次收盘价高于 SMA20 时退出。

第 3 次迭代修复了第二次 Layer-3 sandbox_timeout 超时问题。规则、指标和参数均未改变,信号输出与 v2 数值完全一致(在 3,000 根测试柱上的最大相对差异约为 3e-15)。经验教训 155(c) 的诊断:v2 的每根柱工作量已是 O(1)。窗口仅包含约 1,650 根日线柱,即使主机负载约为 50,策略代码的运行时间也不到 1 秒。因此,墙钟时间很可能耗在策略之外的目录/引擎工作中(与 Eth/Bnb v3 超时诊断结果相同)。尽管如此,每根柱的工作量现在进一步减少:收益的滚动标准差和退出 SMA 使用滚动求和,而不再逐柱复制列表并重新求和。滚动 20 收盘价最大值扫描固定的 20 槽双端队列;EMA 只初始化一次,之后递归更新。如果再次超时,原因将是沙盒运行环境或主机负载,而非策略代码。

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

实现

Stratmill 忠实移植 pinkfish「ac-countertrend」(Farrell Aultman,MIT),使用 SPY.USEQ 日线。在牛市状态下(TA-Lib 风格、以 EMA40 为种子的 SMA > EMA80),当回撤 =(含当前值的 20 日最高收盘价 - 收盘价)/ 40 根 K 线的 pct_change 样本标准差 >= 3.0 时全仓买入(整股,杠杆 1;保留源公式中金额与无量纲值混用的问题)。牛市状态反转、收盘价 > SMA20、收盘价 < 入场价*(1-0.15) 或持有 20 根 K 线时退出。

验证结果

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

结局总结

开发者已将每根柱的工作量降至 O(1),采用滚动求和和固定大小的双端队列;其记录指出耗时发生在策略代码之外(主机负载下的目录/引擎工作),因此对 USEQ 根日线柱反复发生的沙盒超时,应作为基础设施问题排查,而不应继续改写代码。

经过 3 次迭代后,该策略在验证循环中被放弃。决定性故障是第 3 层沙盒回测在约 20,000 根柱(2,400 天)的 SPY.USEQ 日线窗口上超过了 300 秒的墙钟时间限制。回测审查、优化、分析师审查和风险审查均未进行。

Farrell Aultman 的 pinkfish「ac-countertrend」策略忠实移植版,应用于日线 SPY.USEQ:仅做多、全仓;当 EMA(40) > EMA(80) 时,在收盘价低于 20 日最高收盘价处买入;收盘价高于 SMA(20)、触及 15% 止损、市场状态反转或持有 20 根柱后退出。源代码中以美元距离除以收益标准差的反常「pullback」计算方式有意保留。

没有任何绩效数据:回测报告为空,没有优化报告,也从未生成收益率、夏普比率或交易次数。

分析

ac-countertrend

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