策略
市场状态门控的6个月横截面动量策略,采用无前视偏差的固定前-10种现货资产范围(2020-01-01),仅做多排名前-3的资产,每月再平衡;当BTC过去12个月收益率 <= 0时,持有USDT(BINANCE_SPOT,1日线)
结局: 已放弃
FrozenTop10SpotMomentumBtcStateGated
结局总结
该策略原本旨在忠实且无幸存者偏差地测试加密货币现货市场状态门控的6个月动量策略:每月持有固定的前2020种资产范围(-10)中排名前3的资产;若BTC过去12个月收益率不为正,则持有USDT。代码采用固定长度环形缓冲区,每月仅再平衡一次,以避免此前运行中出现的沙箱超时。尽管如此,全部3次迭代均未通过第3层验证,沙箱回测超过了300秒时限,因此该运行被放弃。回测、优化、分析师审核和风险审核均未产出结果,因此该假设本身仍未经过测试。
假设
提炼出源文中的两条具体规则:(1)市场状态 = 大盘过去12个月收益率的符号,每月月初检查一次;(2)在UP状态下,持有此前-6个月动量排名靠前的赢家,等权配置,每月再平衡;在DOWN状态下,将所有资产清仓并转入防御性资产。调整之处:(a)源文中的做空输家部分为DROPPED。此处的多空组合为0比-12(L137);在本策略工厂对该源策略的USEQ行业测试中(带防御性门控的6-1行业多空组合),输家部分拖累了表现:在517笔交易中为PF 1.03。(b)防御性资产是USDT现金,而非TLT;根据L143,信号和交易都在同一市场内。(c)市场 = BTCUSDT.BINANCE_SPOT,即加密货币“广义指数”的代理;BTC也是可交易的标的之一。(d)投资范围:源文使用了所有NYSE/NASDAQ股票,而本策略工厂的US名单是当前标普500成分股,因此会产生幸存者偏差(L151)。这里改用FROZEN时点投资范围:截至2020-01-01,按市值排名、符合币安现货USDT交易对条件的最大10种非稳定币:BTC、ETH、XRP、BCH、LTC、BNB、XTZ、XLM、TRX、ADA。仅因EOS(当时排名前-10)在2025更改了代码,导致数据无法连续衔接,故将其排除。未根据2020之后的表现挑选币种,后来表现出色的SOL和DOGE也有意排除。因此这是一个包含10种币的投资范围(上限为L173)。持仓硬上限:3个。为何这不是重复策略:本策略工厂中未通过的相近策略包括:(i)USEQ SPDR行业轮动,运行5次,过拟合或约1.0的PF;(ii)加密货币双动量策略,在WEEKLY个周期上采用每个资产的OWN绝对动量过滤器,回撤为65-77%;(iii)已部署的30日周期周度永续合约轮动策略。它们都没有在一个杜绝事后偏差的冻结投资范围内,将6个月排名窗口与月度周期以及基于单一大盘的12个月状态切换相结合。新颖性门槛仍可能判定这一策略族过于相近。如果如此,分析师应将其视为对源策略的一次忠实测试,不再反复迭代。空仓状态声明(L150):在每个DOWN月的USDT中均为空仓。BTC的12个月收益率在约2018-2026期间的40-45%个月中为负,因此预期空仓时间约为40%。实现说明:鉴于近期sandbox_timeout的消亡,使用日线柱,每种资产维护一个定长双端队列,保存366个收盘价,并且只在每个UTC月的首根日线柱上运行。这使每根柱的计算量为O(1),无需重新扫描历史数据。
第3次迭代保留传入信号,仅更改历史数据存储方式:用固定循环缓冲区替代双端队列的中间索引读取,使每次回看操作均为 O(1),并消除第-3层超时风险。
verification_loop:sandbox_timeout:验证失败(第3层 — 沙盒回测):在约20000根柱的窗口(2400天,时间范围为BTCUSDT.BINANCE_SPOT-1-DAY-LAST-EXTERNAL)内,冒烟测试超过了300秒的墙钟时间限制。这几乎总是意味着每根柱的工作量会随历史数据增长,例如重新扫描全部资金费率/补充序列,或在每根柱上于calculate_signal()/on_bar()内部重建列表并调用min()/sorted()。在__init__中预先计算排序后的时间戳数组ONCE并使用bisect,或按时间戳缓存查询结果,使每根柱的开销为O(log n)而非O(n)。
实现
在固定的2020种 Binance 现货前十名资产范围内,每月持有动量排名前三的资产,仅做多、等权配置;当BTC过去12个月收益率小于或等于零时,持有USDT现金。
验证结果
sandbox_timeout:验证失败(第3层 — 沙盒回测):在约20000根柱的窗口(2400天,时间范围为BTCUSDT.BINANCE_SPOT-1-DAY-LAST-EXTERNAL)内,冒烟测试超过了300秒的墙钟时间限制。这几乎总是意味着每根柱的工作量会随历史数据增长,例如重新扫描全部资金费率/补充序列,或在每根柱上于calculate_signal()/on_bar()内部重建列表并调用min()/sorted()。在__init__中预先计算排序后的时间戳数组ONCE并使用bisect,或按时间戳缓存查询结果,使每根柱的开销为O(log n)而非O(n)。
结局总结
即使设计目标是在月度周期下让每根 K 线仅执行 O(1) 次操作,也应在提交前对照沙箱时限检查多标的日线策略的实际运行时间,因为此处的sandbox_timeout会在测出任何优势之前终止整个测试。
经过3次迭代后,该策略在验证循环中被放弃,因为第3层沙箱回测在约20000根 K 线的窗口(2400天,BTCUSDT.BINANCE_SPOT根1日线 K 线)内超过了300秒墙钟时限。回测审核、分析师和风险审查阶段均未启动。
仅做多、按月再平衡的6个月横截面动量策略(从10种资产中选前3),投资范围为固定且无前视偏差的 Binance 现货前-10种资产(2020-01-01);当BTC过去12个月收益率 <= 0时,全部转为持有USDT。
没有绩效数据:回测报告为空,且未进行优化,因此没有收益率、夏普比率或交易笔数数据。
分析
动量与市场状态过滤器
Stratmill 是研究与模拟交易工具,不提供财务建议,也不是经纪商。回测与模拟结果均为假设性结果。交易存在亏损风险。