策略
Jesse KDJstrategy 忠实移植,固定默认参数 — LTC 现货日线
结局: 已放弃
JesseKdjLtcSpotDaily
结局总结
本次运行将 Jesse 的 KDJstrategy 移植到 LTC 现货日线数据,并保留来源的默认参数。经过 3 次迭代修复配置和订单关联问题后,移植版本顺利运行。全历史回测在约 6 年内进行了 336 笔交易,亏损 39.1%;七年中有六年亏损,三个波动率区间也都亏损,且扣除佣金前已亏损。分析人员在回测审查阶段因期望收益为负而放弃该策略,这印证了 QA 先前对策略优势的担忧;此后未进行优化、风险审查或晋级。
假设
将 Jesse 社区的 MIT 许可 KDJstrategy 忠实移植到 LTCUSDT.BINANCE_SPOT,使用 1-DAY K 线、CASH 账户且不使用杠杆。保留可执行的 Python 语义,不按注释修正代码。KDJ 默认值为 fastk_period=9、slowk_period=3、slowk_matype=0、slowd_period=3、slowd_matype=0,且 sequential=False。计算九周期随机指标,K 为其三周期 SMA,D 为 K 的三周期 SMA,J=3*K-2*D。使用不包括当前 K 线的数据计算前一根 K 线的 J。ATR 周期为 14。保留 Jesse 的指标初始化和 ATR 平滑处理;不要替换为基于 EMA 的 KDJ。来源:[KDJstrategy,固定提交版本](https://github.com/jesse-ai/example-strategies/blob/7c91e0a37bf62165790120d730442e4f6eb00364/KDJstrategy/__init__.py).。默认值已对照 [Jesse KDJ 实现](https://raw.githubusercontent.com/jesse-ai/jesse/master/jesse/indicators/kdj.py); 核实;该策略未固定其 Jesse 依赖版本。
明确要求忠实于来源,因此优先还原原策略,而非引入新机制或改变方向。代码仅做多,且 Jesse 的仓位计算辅助函数将名义价值限制在资本以内,因此现货交易合适。本地存在确切的 LTC 日线目录。BINANCE_SPOT 低于其 15% 目标,为 11%;尽管如此,本方案仍增加了占比过高的单一标的、仅做多和日线类别,因为改变这些维度会改变给定策略。corpus_concentration 为空,因此无法确定 LTC 近期研究的占比。这是一次复现实验,并不声称 KDJ 具有已证实的结构性优势。
negative_expectancy(fee_edge/no_edge)。这个采用固定默认设置的 Jesse KDJ 移植版本,在 LTCUSDT 现货日线数据上交易,在约 6 年的可靠样本(共 336 笔交易)中亏损。相对于 +0.25% BINANCE_SPOT 下限,avg_trade_return_pct 为 -0.281%。PF 为 0.856,夏普比率为 -0.30,最大回撤为 44.1%,而预先登记的标准为 30%;七年中有六年亏损。佣金和冲击成本前的总损益也为负(约 -$10.6k),因此扼杀这一优势的并非手续费。信号 IC 为 0.011(t=0.5),这只是噪声。相对于 LTC 买入并持有策略的阿尔法每年为 -11.5%。该计划没有可调参数,因此优化无法改变任何结果。这证实了 QA 对策略优势的担忧:完整历史数据的数值与沙盒结果一致(-0.253%,PF 0.865)。J > D 门槛在约一半的所有日期为真,因此它充当噪声振荡器门槛,持仓约 2.8 天,无法覆盖 0.20% 现货交易的往返成本。此结论仅适用于采用源默认设置进行的这项 LTC 现货日线转换。
实现
将 Jesse 的 KDJstrategy 移植到 LTCUSDT 现货日线数据。随机指标使用 9 根 K 线,K 是其 3 根周期的 SMA,D 是 K 的 3 根周期的 SMA,J = 3K - 2D,以上计算均使用 240 根非连续 K 线切片。当 J > (K 和 D) 时做多,沿用 Python 的 `and` 语义。当持仓盈利且前一根 K 线的 J 高于当前 J,或 J < (K 和 D) 时退出。入场为市价 BUY,附带 2xATR(14) 止损单,并以 OTO 子单形式挂在交易场所。仓位遵循 Jesse 的 risk_to_qty,风险为 5%,上限为资本的 100%。
第 3 次迭代只修复了第 -3 层崩溃。NautilusTrader 会拒绝 OUO 订单,因为其 linked_order_ids 为空。来源代码没有可供止损单关联的止盈单,因此现在让止损单关联自身。关联到入场单行不通:提交止损单时,入场单已成交,而撮合引擎会拒绝关联订单已关闭的 OUO 订单。所有 OUO 撤单和更新路径都会跳过已关闭的关联单,因此自关联不起作用。止损单仍为条件单,所以基类仍将其视为保护性订单,并持续调用 should_exit。我在 LTC 日线数据上对 2019-01 至 2024-07 进行了本地回测。运行无错误,平仓 273 笔,平均每笔交易为 -0.27%,夏普比率为 -0.24,最大回撤为 43.6%。这是复现移植:结果较弱,但应由分析人员进行判断。信号、仓位规模和参数均未改变。
验证结果
如果完整回测诊断中出现拒单,仅在上限生效时加入缓冲(例如 max_notional_fraction 0.995),或将数量向下取整至该交易品种的数量精度。将此记录为工程偏差,而非规则变更。
仓位规模遵循 Jesse 的 risk_to_qty:以资本的 5% 除以 2xATR 止损距离,再乘以价格,最高为资本的 100%。sizing_fee_rate 为 0,sizing_precision 为 8,而 LTC 现货数量精度较粗,make_qty 可能将数量向上取整。当 ATR 低于价格的约 2.5% 时,上限会生效;这种情况会出现在平静的市场阶段。此时,按权益的 100% 提交的市价 BUY 加上 CASH 账户的 0.1% 手续费,可能超过可用现金并遭拒。这会导致入场单被静默丢弃,且只发生在平静阶段。它不会改变冻结的来源语义,沙盒产生了 335 笔交易,因此不构成阻碍。
无需更改。请使覆盖项与基础模板的保护条件保持同步。
_submit_entry 覆盖基类方法,以便提交带有仅减仓止损市价子单的 OTO 市价入场单,这与 Jesse 的 self.stop_loss 相对应。我将其与 base_template._submit_entry 作了比较:它保留预热、种子冻结、暂停、市场就绪和在途保护条件,并记录在途入场单。基类的现货做空保护被显式的 BUY-only 检查取代,在此情形下二者等价。止损单以 OUO 关联自身,使 NautilusTrader 能接受该订单。这种做法不寻常,但没有危害:它没有关联的同级订单,且沙盒顺利平掉了每个仓位(open_positions 0)。日后对基类保护条件的任何修改都不会传递到此覆盖方法。
沙盒覆盖了 2161 天,平仓 335 笔做多交易。相对于 +0.25% BINANCE_SPOT 底线,avg_trade_return_pct 为 -0.253%;PF 0.865,夏普比率为 -0.28(CI -1.11 至 0.47),最大回撤为 44%,三个波动率区间均亏损。开发者自行运行的 2019-2024 结果一致:273 笔交易的每笔交易为 -0.27%。佣金占毛利的 9.25%,所以毛利优势大致持平,冻结方案没有可调参数。每当 J > D 时便会触发入场,该条件在约一半交易日成立。因此,这是一个持仓平均约 2.8 天的噪声振荡指标动量门槛,每次交易需承担 0.20% 现货往返成本。预计全历史回测会确认 no_edge。这一担忧关乎盈利能力,而非正确性,因此不会阻止继续进行。
回测评审
- 夏普
- -0.30
- 总收益率
- -39.11%
- 最大回撤
- 44.10%
- 总交易数
- 336
- 胜率
- 46.7%
- 盈利因子
- 0.86
移植忠实于来源且运行正常:在 2173 天内完成 336 笔仅做多交易,没有丢弃入场单,会计核算有效,没有期末未实现敞口,样本可靠。
交易模式符合来源逻辑:当 J > D 时入场,约有 44% 的时间处于市场中,持仓约 2.8 天,且不做空。
avg_trade_return_pct 相对于 +0.25% BINANCE_SPOT 底线为 -0.281%。
PF 为 0.856,夏普比率 -0.30(CI -1.09 至 0.50),总回报 -39.1%,最大回撤 44.1%(相对于预先登记的 30%),最长一次回撤持续了 1005 天。
七年中有六年亏损;只有 2020 年为正。三个波动率区间均亏损,六个压力窗口中也有五个亏损。
扣除佣金和冲击成本前的毛利盈亏约为 -$10.6k,因此该策略在计入成本前就已亏损。
该预测没有信息量:IC 0.011,t = 0.5。
年化阿尔法为 -11.5%,信息比率为 -0.62,贝塔为 0.12,表现逊于 LTC 买入持有。
方案没有可调参数,因此优化没有可改变的内容。
迭代历史
验证失败(第 1.5 层 — 假设/配置一致性)[类别=hypothesis_mismatch]: - optimization_plan 将杠杆固定为 1.0
验证失败(第 3 层 — 沙盒回测):当 `contingency_type` OUO 时,`linked_order_ids` 为 `None` 或为空 使用的 K 线类型:LTCUSDT。BINANCE_SPOT-1-DAY-LAST-EXTERNAL,已处理 K 线:0 请确保您的策略能根据给定数据和参数产生交易。
结局总结
J > D 振荡指标门槛在约一半交易日成立,持仓约 2.8 天,在 LTC 日线数据上没有预测信息,也无法覆盖 0.20% 现货往返交易成本,因此不应预期固定默认参数移植能体现策略优势。
回测审查关卡因期望收益为负(无优势)而给出“放弃”结论:平均交易回报为 -0.281%,低于 +0.25% BINANCE_SPOT 底线;扣费前已亏损,回撤也高于预先登记的 30%。方案没有可调参数,因此优化无法改变结果;后续优化及阶段均未进行。
忠实于 Jesse 社区 MIT 许可 KDJstrategy 的固定默认参数移植(基于 SMA 的 KDJ 9/3/3,J=3K-2D,ATR(14) 止损),应用于 LTCUSDT.BINANCE_SPOT 日线数据,仅做多且不使用杠杆。
在 2018-08-11 至 2024-07-22 期间,策略进行了 336 笔做多交易,总回报为 -39.1%,夏普比率为 -0.30(CI -1.09 至 0.50),盈利因子为 0.856,最大回撤为 44.1%,以及 avg_trade_return_pct -0.281%。扣除成本前的毛利盈亏也为负(约 -$10.6k),信号 IC 为 0.011(t=0.5)。
分析
KDJstrategy
Stratmill 是研究与模拟交易工具,不提供财务建议,也不是经纪商。回测与模拟结果均为假设性结果。交易存在亏损风险。