跳至正文
全部策略

策略

Quantiacs LSTM 多特征移植版:AAPL 日线下一开盘上涨回归器,原始输出作为目标权重(AAPL.USEQ 1-DAY,2x64 LSTMCell,LBFGS,每 360 根 K 线再训练,固定源代码默认值)

结局: 已放弃

QuantiacsLstmMultiFeatureAaplUseq

结局总结

该策略尝试用 NumPy 忠实移植 Quantiacs 的 LSTM 模型,以生成日线 AAPL 目标权重,并声明了初始化 RNG 偏差。经过五轮迭代,由于平台缺少所需的下一交易时段开盘钩子,执行保真度问题仍未解决。最终沙盒验证处理了 0 根 K 线后失败,性能评估未能进行;该运行在优化或后续审查之前即已放弃。

假设

忠实移植开源 MIT 策略“strategy-ml_lstm_multiple_features”,作者为 Quantiacs(https://github.com/quantiacs/strategy-ml_lstm_multiple_features,,提交版本 51f5c6d)。原作者应获致谢。原文声称的任何表现均未经验证;以我们计入真实成本的回测为准。源资产 NAS:AAPL 映射为 AAPL.USEQ,使用 1-DAY 周期(经拆股调整,涵盖数十年历史)。源回测始于 2006-01-01。仅使用一种工具和 OHLCV,不使用补充数据。MODEL:两个堆叠的 LSTMCell 层(input_dim=3,隐藏维度=64),后接 Linear(64->1)。每个序列开始时,隐藏状态和细胞状态均初始化为零;模型在每一步都输出结果。门控遵循标准 PyTorch LSTMCell 顺序 i、f、g、o,并同时包含 bias_ih 和 bias_hh。每根柱使用 FEATURES,顺序为:[ln(close), ln(open), high]。源代码NOT对 high……展开收起

忠实移植开源 MIT 策略“strategy-ml_lstm_multiple_features”,作者为 Quantiacs(https://github.com/quantiacs/strategy-ml_lstm_multiple_features,,提交版本 51f5c6d)。原作者应获致谢。原文声称的任何表现均未经验证;以我们计入真实成本的回测为准。源资产 NAS:AAPL 映射为 AAPL.USEQ,使用 1-DAY 周期(经拆股调整,涵盖数十年历史)。源回测始于 2006-01-01。仅使用一种工具和 OHLCV,不使用补充数据。MODEL:两个堆叠的 LSTMCell 层(input_dim=3,隐藏维度=64),后接 Linear(64->1)。每个序列开始时,隐藏状态和细胞状态均初始化为零;模型在每一步都输出结果。门控遵循标准 PyTorch LSTMCell 顺序 i、f、g、o,并同时包含 bias_ih 和 bias_hh。每根柱使用 FEATURES,顺序为:[ln(close), ln(open), high]。源代码NOT对 high 取对数;此处有意保留这一特殊处理。缺失值先向前填充,再向后填充,最后填为 1。TARGET:对于柱 t,若 open[t+1] > open[t],则为 1,否则为 0。训练切片中的最后一根柱没有下一根开盘价,因此 xr.where 会将其标记为 0;此处予以保留。TRAINING:使用截至当前柱(含当前柱)的最后 train_period=100 根柱,作为批量大小为 1 的一个批次。损失函数为 100 个逐步输出上的 MSE。优化器为 L-BFGS,学习率 lr=0.08,采用 PyTorch 默认值(max_iter=20,max_eval=25,tolerance_grad=1e-7,tolerance_change=1e-9,history_size=100,不进行线搜索),且恰好调用一次优化器 step(epochs=1)。每次重新训练都会创建一个全新的 seed-42 模型。每隔 retrain_interval=360 根柱重新训练一次;retrain_interval_after_submit 仅用于实盘,此处不使用。PREDICTION(predict_each_day=False,lookback_period=155):每次重新训练后,模型从重新训练柱之前 155 根柱处的零状态开始,按因果顺序运行至下一次重新训练。柱 d 的输出即为柱 d 的目标权重。POSITION:w = clip(output, -1, 1)。正 w 表示持有价值为权益 w 倍的多头仓位;负 w 表示持有价值为权益 |w| 倍的空头仓位。每个日线柱都将仓位调整为整股数量,在收盘时做出决定,并于下一个可用价格执行。源策略没有止损或止盈。杠杆为 1.0。DECLARED UNAVOIDABLE DEVIATION:沙盒中无法导入 PyTorch。因此,使用 numpy 重新实现 LSTMCell 前向传播、时间反向传播梯度和 PyTorch L-BFGS。初始权重按 PyTorch 默认值从 U(-0.125, 0.125) 抽取,使用 numpy default_rng(42),并遵循 PyTorch 参数顺序。权重分布相符,但确切的 torch RNG 随机序列不同。其他部分均逐行一致。

这是一个具体且可执行的策略,已移植到其确切的源标的和 K 线周期。USEQ 代表性不足(6.2%),该策略加入了一个 ML 机制类别,而不是另一个趋势变体。由于这是忠实复现,参数固定为源代码默认值。唯一偏差是 torch 到 numpy 的初始化 RNG,并已事先声明。

verification_loop:验证失败(第 3 层——沙盒回测):execution_contract_unsupported:AAPL 的每日收盘决策要求在下一交易时段开盘时无条件执行。FactoryStrategy 没有受支持的下一交易时段开盘挂钩。OCO 止损/触价市价单近似方案无法处理开盘价不变和空仓交易时段,现已停用。引擎需提供支持,才能忠实评估此假设。 使用的 K 线类型:AAPL.USEQ-1-DAY-LAST-EXTERNAL,处理的 K 线数:0 请确保您的策略能根据给定数据和参数产生交易。

实现

Quantiacs MIT AAPL 日线 LSTM 翻译版,保留之前的 numpy 模型、BPTT、L-BFGS、预定再训练和目标权重计算。订单提交现在会明确报告 execution_contract_unsupported,而不是提交不准确的 OCO 近似实现。此版本因等待引擎支持而受阻。

QA 关于关键执行问题的发现有效:比前收盘价高、低一个最小跳动单位的触发价,无法在下一交易时段开盘价不变时保证无条件成交;横盘时段也可能导致两个订单都未成交。对代码库的检查未能在 FactoryStrategy 或其回测集成中找到受支持的无条件下一交易时段开盘钩子。最小修正仅将 OCO 的提交函数主体替换为明确的“不支持该执行约定”错误,同时保留此前已通过验证的模型和信号逻辑。由于不存在受支持的钩子,且验证应由流水线负责,因此未运行执行情形测试。QA 的预热警告仍是一项明确的前置要求:重建此前的 360 时段模型可能需要此前 513 个交易时段的数据,而已注册的评估仅提供 160。增大 min_bars_required 无法找回未提供的历史数据;要解决此问题,需要经研究批准修订预热约定,或恢复预定模型及其循环状态。固定计划和原有再训练锚点均未更改。这是平台支持方面的限制,并不能证明该假设缺乏优势。

验证结果

验证失败(第 3 层——沙盒回测):execution_contract_unsupported:AAPL 的每日收盘决策要求在下一交易时段开盘时无条件执行。FactoryStrategy 没有受支持的下一交易时段开盘挂钩。OCO 止损/触价市价单近似方案无法处理开盘价不变和空仓交易时段,现已停用。引擎需提供支持,才能忠实评估此假设。 使用的 K 线类型:AAPL.USEQ-1-DAY-LAST-EXTERNAL,处理的 K 线数:0 请确保您的策略能根据给定数据和参数产生交易。

在沙盒中,该策略表现得像一只大部分时间持有多头、仓位部分配置的 AAPL:相对于买入并持有,其 beta 为 0.415,基准相关性为 0.94,夏普比率为 0.89,信息比率为 -0.76。模型对 0/1 下一开盘上涨标签进行回归,因此其输出大多落在 (0,1)。这使它成为部分多头的 AAPL 仓位,而不是方向性择时信号。请检查全历史收益是否超过 beta x AAPL。账本也令人担忧:在沙盒中仓位从未归零(已平仓头寸 0,未平仓 1,成交 1230 次)。因此,total_trades 和 avg_trade_return_pct 是 0,无法说明单笔交易的经济效益。分析师应依据 MTM 权益曲线以及相对于买入并持有的 IR 进行判断,而不应依据已平仓交易账本。

分析

回测门槛: - 回测产生了 ZERO 笔交易——入场条件从未在真实数据上触发

迭代历史

验证失败(第 4 层——QA审查)[类别=hypothesis_mismatch]: - [edge_concern] 沙盒收益与 AAPL 敞口高度吻合:基准相关性为 0.9563,贝塔为 0.4373,阿尔法为 -0.0131。完整历史分析应区分预测价值与被动股票敞口。没有已平仓头寸并不能证明存在缺陷。 - [严重] 假设要求每 360 根日线交易 K 线重新训练。实现按包含 US 交易所假期的工作日索引分组,实际约每 351 个交易时段重新训练一次。这会改变训练切片、模型重置和预测。任务说明仅授权 numpy/PyTorch 实现方面的偏差;开发者理由中额外的计划偏差并未修改假设。(第 324 行)——修复:根据实际的 USEQ 交易时段,以源代码起始日期为锚点推导固定的重新训练网格。重新训练间隔须精确保持 360 根交易 K 线,不得使用相对于重启时间的计数器。 - [严重] 每日权重使用已完成 K 线的收盘价、开盘价和最高价,随后立即提交市价单。基础模板中的初始入场也采用相同的即时提交路径。固定版本的引擎文档指出,市价单按当前模拟市场价格成交;此处即已完成 K 线的收盘价。假设明确要求根据收盘价做出决策,并在下一个可用价格执行。同收盘价成交会改变执行约定,并纳入下一交易时段执行时无法获得的隔夜敞口。(第 378 行)——修复:将收盘价推导出的目标排入队列,并通过已验证的下一交易时段价格事件执行。如果仅靠日线 K 线无法表示该事件,则添加所需的引擎/数据馈送支持;延迟到下一日日线收盘执行也会偏离规定的约定。 - [严重] 训练锚点取决于载入的历史缓冲区:max(idx[0], lookback_period-1, train_period-1)。如果窗口或重启发生在重新训练区块中途,模型会使用较晚的可用 K 线训练,而非重建预定模型。因此,相同的当前时间戳可能因回放起点不同而产生不同的训练数据和预测。在一般情况下,160 根 K 线的预热无法重建一个较早训练的模型:该模型训练于 360 根 K 线区块,并经过 155 根 K 线的预测初始化。(第 281 行)——修复:向前载入历史数据,直至预定训练锚点及其预测回看区间,或恢复经过验证的模型和循环状态。历史数据不足时,不得改用较晚的训练锚点。

根据以源起始日期为锚点的实际 USEQ 个交易时段,推导出固定的再训练网格。确保每次再训练之间恰好间隔 360 个交易 K 线,不使用相对于重启时刻的计数器。

假设要求每 360 根日线交易 K 线重新训练。实现按包含 US 交易所假期的工作日索引分组,实际约每 351 个交易时段重新训练一次。这会改变训练切片、模型重置和预测。任务说明仅授权 numpy/PyTorch 实现方面的偏差;开发者理由中额外的重新训练计划偏差并未修改假设。

将收盘价推导出的目标排入队列,并通过已验证的下一交易时段价格事件执行。如果仅靠日线 K 线无法表示该事件,则添加所需的引擎/数据馈送支持;延迟到下一日日线收盘执行也会偏离规定的约定。

每日权重使用已完成 K 线的收盘价、开盘价和最高价,随后立即提交市价单。基础模板中的初始入场也采用相同的即时提交路径。固定版本的引擎文档指出,市价单按当前模拟市场价格成交;此处即已完成 K 线的收盘价。假设明确要求根据收盘价做出决策,并在下一个可用价格执行。同收盘价成交会改变执行约定,并纳入下一交易时段执行时无法获得的隔夜敞口。

向前载入历史数据,直至预定训练锚点及其预测回看区间,或恢复经过验证的模型和循环状态。历史数据不足时,不得改用较晚的训练锚点。

训练锚点取决于已加载的历史缓冲区:max(idx[0], lookback_period-1, train_period-1)。当窗口或重启发生在再训练区块内部时,模型会在之后首个可用 K 线上训练,而不是重建预定模型。因此,根据回放起点不同,相同的当前时间戳可能对应不同的训练数据和预测结果。通常,160 根 K 线的预热无法重建一个在 360 根 K 线区块内较早时刻训练、并使用 155 根 K 线进行预测初始化的模型。

将 evaluation.warmup_bars 设为 >= 515。如果短窗口很重要,则提高该策略的基础 _max_bars(或让它自己的缓冲区持续从 on_bar 获取数据),以便窗口在区块中途开始时仍能重建预定模型。

_optimization_plan.evaluation.warmup_bars 的 160 短于该策略所需长度。策略需要预定锚点(时段 360*b)以及缓冲区中此前的 154 根 K 线,因此任意窗口起点之前最多需要 359+155 = 514 根 K 线。因此,reset_with_warmup 窗口会一直保持空仓,直到下一次预定再训练,除非有锚点位于预热起点之后或当时(含)154 的位置。这最多可能涉及 360 个交易时段,因此短验证窗口大部分时间或整个期间都会处于空仓状态,且统计效力不足。基础模板也只保留 _max_bars=500 根主要 K 线,因此即使延长预热期,从 self._bars 初始化也无法触及约 345 根 K 线之前的锚点。理由中已明确说明此限制,且实现忠实(未替换锚点);这不影响从 1980 开始的单次长期全历史运行。

可接受。可选择跟踪已取消的订单列表 ID,并在 orders_open 防护逻辑中忽略这些订单。

_cancel_stale_orders 会在 calculate_signal 开始时调用 cancel_all_orders。如果取消操作在 should_exit / _process_primary 检查 orders_open 之前尚未处理,该交易时段的再平衡就会跳过,并在下一根 K 线上重新决策。少数未触发日(开盘价与前收盘价相差不到一个跳动点,且盘中未触及触发价)会因此滞后一交易时段。这不属于正确性缺陷。

无需调整。按照计划,将 max_abs_weight 和杠杆固定为 1.0。

该设计始终持仓,不设止损,并依据 get_account_equity() 每日再平衡。教训 L148 提醒您避免这类设计。此处风险有界:|w| <= max_abs_weight 1.0(明确的限幅),杠杆为 1.0,仅一种工具,因此最坏情况下总敞口为权益的 1.0x 倍,符合 USEQ 的 2x Reg-T 规定。源策略没有止损,新增止损会破坏移植的忠实性。沙盒最大回撤为 16.7%。

验证失败(第 1.5 层——假设/配置一致性)[类别=hypothesis_mismatch]: - optimization_plan 将杠杆固定为 1.0

验证失败(第 4 层——QA 审查)[类别=hypothesis_mismatch]: - [严重] OCO 触发器对无法保证在下一交易时段开盘时执行。前收盘价为 100.00,最小跳动单位为 0.01 时,触发价分别为 100.01 和 99.99。如果下一交易时段以 100.00 开盘,则开盘时两个订单都不会触发。之后盘中价格穿越触发价时,会以不同价格执行再平衡;若整个交易时段的价格始终处于两个触发价之间,订单将一直未成交,直至取消。这改变了假设的执行约定。空操作的刷新回调无法弥补这一缺口。该假设只声明了 numpy 实现偏差,并未声明有条件的盘中执行。(第 517 行)——修复方法:使用引擎支持的下一交易时段开盘执行钩子,在下一交易时段开盘时无条件执行已排队的收盘决策。验证开盘价不变、跳空高开、跳空低开和横盘时段等情况。如果没有此类钩子,应报告执行约定不受支持,而不要将 OCO 近似视为忠实实现。 - [警告] 固定的 160 根评估预热 K 线无法重建所有预定模型。若窗口在一个 360 时段周期后段开始,则需要预定锚点及其之前的 154 根预测历史 K 线,最多可能需要此前 513 个交易时段的数据。如果未提供这些 K 线,_retrain 会返回 false,后续重试也无法恢复窗口之前的历史数据。尽管策略规定每日进行预测,但在遇到之后可重建的锚点前,策略会保持空仓。(第 365 行)——修复方法:提供足够的预热数据,以便重建此前的预定模型,最多需提供此前 513 个交易时段的数据;或者恢复其模型和循环状态。保留原有的再训练锚点。

使用引擎支持的下一交易时段开盘执行钩子,在下一交易时段开盘时无条件执行排队的收盘决策。验证开盘价不变、跳空高开、跳空低开和横盘交易时段的情况。如果该钩子不可用,应报告执行约定不受支持,而不要将 OCO 近似方案视为忠实实现。

OCO 触发价对无法保证在下一交易时段开盘执行。前收盘价为 100.00,跳动点为 0.01,触发价为 100.01 和 99.99。如果下一交易时段以 100.00 开盘,两笔订单都不会在开盘时触发。稍后的盘中价格穿越会以不同价格执行再平衡;若整个交易时段价格都处于触发价之间,订单则会一直未成交,直至取消。这会改变假设中的执行约定。空操作的刷新回调无法弥补这一缺口。假设只声明了 numpy 实现偏差,并未声明有条件的盘中执行。

提供足够的预热数据,以便重建此前的预定模型,最多需提供此前 513 个交易时段的数据;或者恢复其模型和循环状态。保留原有的再训练锚点。

固定的 160 根 K 线评估预热无法重建所有预定模型。若窗口在一个 360 时段周期后段开始,则需要预定锚点及其之前的 154 根预测历史 K 线,最多可能需要此前 513 个交易时段的数据。如果未提供这些 K 线,_retrain 会返回 false,后续重试也无法恢复窗口之前的历史数据。尽管策略规定每日进行预测,但在遇到之后可重建的锚点前,策略会保持空仓。

结局总结

要忠实评估该策略,必须先让引擎支持在下一交易时段开盘执行。

经过五次迭代后,验证仍因平台缺少受支持的挂钩,无法在下一交易时段开盘时无条件执行而失败。由于 OCO 近似方案无法处理开盘价不变和空仓交易时段,现已停用。

将 Quantiacs 的双层 LSTM 策略移植到 AAPL 日线 K 线上,预测下一次开盘方向,并将裁剪后的模型原始输出用作目标投资组合权重。

第 3 层沙盒回测处理了 0 根 K 线;未报告收益、夏普比率或交易指标。未进入优化和后续审查阶段。

分析

strategy-ml_lstm_multiple_features

回测评审

夏普
0.51
总收益率
599.20%
最大回撤
36.15%
胜率
0.0%
盈利因子
0.00

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