跳至正文
全部策略

策略

金肯特纳(Raschke)通道突破策略,经斜率确认,多空双向,在价格重新穿越中线时退出;按4小时周期重述(ETHUSDT.BYBIT个4小时周期,纯OHLCV,采用作者的20/50默认值)

结局: 已放弃

EthBybitKingKeltnerBreakout4H

结局总结

EthBybitKingKeltnerBreakout4H 在ETHUSDT.BYBIT的4小时周期上重述了FMZ金肯特纳突破策略(由斜率确认的EMA中线配合ATR通道,支持做多和做空,并在价格重新穿越中线时退出)。预研究显示,选择4小时周期是因为1小时版本无法覆盖手续费。代码未能通过第3层沙盒验证:在约20,000根K线的窗口上,冒烟测试多次超过300秒时限。经过3轮迭代,包括将ATR重写为 O(1)滚动求和后,我们放弃了运行;未进行回测审查、优化、分析或风险审查,因此从未在策略工厂内测量其优势。

假设

来源:发明者量化-小小梦,《肯特纳通道升级:金肯特纳策略》,FMZ文集(https://www.fmz.com/digest-topic/4104),章节“升级版的金肯特纳”和“金肯特纳策略My语言”)。鸣谢作者。本文从基本原理重述机制,并未忠实移植(L167)。通道:典型价格TP=(H+L+C)/3。中线=EMA(TP, 20),这是文章文字所述的 Raschke EMA版本;文章的 My-language 代码使用SMA。带宽=SMA(TrueRange, 50),并按文章所述乘以1.0x倍数使用。上轨=中线+ATR50,下轨=中线-ATR50。方向规则:中线上行且收盘价高于上轨时做多;中线下行且收盘价低于下轨时做空。收盘价跌破中线时平多,收盘价升破中线时平空。没有其他门槛、过滤条件或补充数据源(L130)。ONE ADAPTATION:周期从文章的1小时改为4小时,因为我在研究前对BYBIT 1小时(7种山寨币/主流币,2021-2026,0.11% RT)进行的时点研究显示,1小时版本在所有标的上都无法覆盖手续费。每笔交易净收益为-0.14%至0.00%,在2,000-2,600笔交易中有PF 0.82-1.00。中线重新穿越退出会使交易在约1 ATR时结束;在1小时周期上,这相对于双边手续费而言过小。标的选择已披露(L122):我在BYBIT按4小时/12小时/1日筛选了SOL/XRP/LINK/DOGE/AVAX/ETH/BNB。我选择ETHUSDT 4小时,因为它是唯一同时满足以下条件的组合:(a) 生命周期内交易次数不少于500;(b) 多空收益对称(净收益:做多+0.38% / 做空+0.39%,因此并非伪装的多头贝塔);(c) 在6个日历年中的4年净收益为正,且没有任何单一年份占主导。若干1日/12小时组合的PF较高(SOL 1日 PF 2.6),但只有70-170笔交易,且集中在单一年份并由多头贡献,因此不符合L128/L170。交易场所:BYBIT线性永续合约(占语料份额0.8%,目标不低于5%)。触发信号仅基于价格,因此不受L160补充数据源限制影响。Bybit ETH有约5.5年的4小时历史数据(始于2021-03,约12,100根K线)。不采用BTC(集中度过高),也不采用 Hyperliquid(L168:历史数据较短)。策略工厂的其他ETH候选策略(OKX SuperTrend、成交量确认动量)采用不同的触发条件和退出方式。本策略以波动率带突破为信号,退出依据是移动中线,约33%的时间处于空仓。

第 3 次迭代修复了第 -3 层的 sandbox_timeout。策略可控的逐柱循环只有一个:每根柱上用于重建 ATR 的 50 柱真实波幅求和。现在改为滚动标量求和:加上最新的 TR,减去离开窗口的 TR,并在首根柱或出现数据缺口后进行一次 O(atr_len) 重新播种。这样逐柱成本为 O(1)。EMA 中线此前已采用增量计算,因此没有历史重扫,也没有补充数据源。入场、退出、信号和仓位规模逻辑逐字节保持不变,因此第 1 层和第 2 层仍然通过。每根柱此前约有 50 次浮点运算,针对约 12k 根柱;因此,如果超时再次出现,可能原因是测试框架或引擎负载,而非策略计算。

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

实现

在ETHUSDT.BYBIT 4小时周期上的金肯特纳(Raschke)通道突破策略。中线=EMA(典型价格, 20);通道带宽=+/--1.0 x SMA(TrueRange, 50)。中线上行且收盘价高于上轨时做多;中线下行且收盘价低于下轨时做空。收盘价重新穿越中线时退出。信号是收盘价与中线的距离,以ATR为单位。仓位规模为权益名义金额的0.9 x,取值为1x。

验证结果

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

结局总结

任何随历史数据量增长的逐柱成本都会使沙盒在信号得到测试前超时,因此从第一轮迭代起,就应将每个指标写成 O(1) 增量状态;还应检查基类的历史数据处理(例如 self._bars 缓冲区),看它是否仍是瓶颈。

经过 3 次迭代后,该策略在验证循环中被放弃。第 3 层(沙盒回测)因 sandbox_timeout 未通过:冒烟测试在约 20,000 根柱的窗口内超过了 300 秒的墙钟时间限制(ETHUSDT.BYBIT 4H 共 2400 天)。尽管第 3 次迭代已将逐柱 ATR 循环替换为 O(1) 滚动求和,仍然发生了这种情况。

在 ETHUSDT.BYBIT 4H 上运行的金肯特纳(Raschke)通道突破策略,纯 OHLCV:当 EMA(典型价格, 20) 中线上升且收盘价高于中线 + 1.0x SMA(TrueRange, 50) 时做多;反向条件下做空;收盘价再次穿越中线时退出。时钟从 1H 改为 4H,因为研究者自己的前测发现 1H 版本无法覆盖手续费。

不存在工厂回测表现数据,因为回测报告为空,且未运行优化。唯一的数字来自该假设自身的前测:对于 ETHUSDT 4H,做多每笔交易净收益为 +0.38%,做空为 +0.39%;对于 1H 版本,每笔交易净收益为 -0.14% 至 0.00%(PF 0.82-1.00)。

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