跳至正文
全部策略

策略

忠实移植 FMZ《Python ML:SVM 预测买入/卖出》(作者 Zero):滚动线性 SVM 3 类下一根 K 线方向分类器,使用原始 [Open, Close],多头/空头/空仓,SpreadVal=2,BTCUSD_PERP。BINANCE_CM 1H

结局: 已放弃

BtcCmLinearSvmNextBarDirection

结局总结

该假设将一个 FMZ 滚动线性-SVM 下一根K线方向分类器移植到 Binance COIN-M BTC 永续合约,周期为 1H,并预先登记了边际接近于零的预测。经过 2 次迭代,回测产生了 1,408 笔交易,平均每笔交易为 -0.129%,PF 0.80,夏普比率为 -0.38;账户因 -100% 回报而被强平,而买入并持有 BTC 上涨了约 3x。分析师在回测审查时、优化之前就放弃了该策略,因为零毛收益优势无法覆盖交易成本。分析师还标记了不合理的 COIN-M 日度 MTM 波动以及相互冲突的强平日期,建议引擎审查,并指出这些问题不会改变收益优势的正负。

假设

忠实移植开源 FMZ Quant 策略《Python 机器学习之 SVM 预测买卖》,作者为 Zero(https://www.fmz.com/strategy/21370; 原版:Bitfinex BTC_USD、1 小时K线)。感谢原作者。机制用我们自己的话来说:每出现一根新的小时K线,就根据近期K线历史从头训练一个线性支持向量分类器。每个训练样本对应过去的一根K线 i,其特征向量为两个 RAW 价格水平 [open_i, close_i](不做缩放,不用收益率),标签为 NEXT 根K线收盘价变化的方向,d = close_{i+1} - close_i:若 d > SpreadVal,则类别为 UP;若 d < -SpreadVal,则类别为 DOWN;否则为类别 FLAT,其中 SpreadVal = 2(价格单位,USD),完全遵照源代码。随后,训练好的模型将最新一根K线的 [open, close] 分类为 UP/DOWN/FLAT,该预测决定单一的多头/空头/空仓头寸。改动仅限以下内容:交易场所/品种从 Bitfinex BTC_USD 现货改为……展开收起

忠实移植开源 FMZ Quant 策略《Python 机器学习之 SVM 预测买卖》,作者为 Zero(https://www.fmz.com/strategy/21370; 原版:Bitfinex BTC_USD、1 小时K线)。感谢原作者。机制用我们自己的话来说:每出现一根新的小时K线,就根据近期K线历史从头训练一个线性支持向量分类器。每个训练样本对应过去的一根K线 i,其特征向量为两个 RAW 价格水平 [open_i, close_i](不做缩放,不用收益率),标签为 NEXT 根K线收盘价变化的方向,d = close_{i+1} - close_i:若 d > SpreadVal,则类别为 UP;若 d < -SpreadVal,则类别为 DOWN;否则为类别 FLAT,其中 SpreadVal = 2(价格单位,USD),完全遵照源代码。随后,训练好的模型将最新一根K线的 [open, close] 分类为 UP/DOWN/FLAT,该预测决定单一的多头/空头/空仓头寸。改动仅限以下内容:交易场所/品种从 Bitfinex BTC_USD 现货改为 BTCUSD_PERP.BINANCE_CM(Binance COIN-M 反向永续合约)。报价单位也是每 BTC 的 USD,因此 SpreadVal=2 保留了原有单位含义;在我们这组交易场所中,其双边交易成本最低(约 0.06%,相比之下约为 0.10% USD-M),这对小时级换手的策略很重要。它也填补了未达配额的 COIN-M 类别(3.2%,目标为 >=5%)。尽管语料集中度较高,仍保留 BTC,只因源策略属于 BTC_USD 策略,且用户要求忠实移植。仓位规模从“初始账户的一半”调整为当前权益名义金额的 50%,杠杆为 1.0。由于沙盒不允许导入 sklearn,分类器用 numpy 实现,是对 sklearn 的 svm.LinearSVC 默认配置的重新实现。源策略运行于 FMZ 的实时/进行中K线上:检测到新K线时,使用刚刚开盘K线的 [open, close](此时 close 大致等于 open)。在我们的收盘价引擎中,对应的时点转换是使用刚刚CLOSED的 t 根K线作为预测输入。训练样本全部为(K线 i 的特征、由 close_{i+1} - close_i 得出的标签),且 K线 i+1 已经收盘,因此不存在前视。坦诚说明:在约 $60k-120k 的 BTC 上,SpreadVal=2 USD 约为 0.002%,因此 FLAT 类几乎不会出现,模型实际上是一个基于价格水平的二元涨跌分类器。原始 [open, close] 水平对下一小时变化的符号几乎没有信息。工厂的教训 L167 预测,这类忠实移植策略会在 fee_edge 失效。之所以提出该策略,是因为用户明确要求忠实移植,最终由包含真实费用的回测作出判断。以下预测已预先登记为边际接近于零。

第 2 次迭代修复了关键的 QA 仓位规模缺陷,除此之外不做任何改动。信号、标签、求解器和进出场逻辑均未改变。在 BINANCE_CM 上,反向合约的盈亏、手续费和冲击成本以 BTC 结算,因此 get_account_equity()(以 USD 计价的余额)从未变动,每笔交易都按约 $50k 的规模下单,直到账簿被强平。现在,position_size() 使用按市值计价的 USD 权益:稳定币余额加上(当前 BTC 余额减去首根K线捕获的 BTC 余额,捕获时尚未进行任何交易)乘以当前价格。由于策略在确定入场仓位规模时始终为空仓,未实现盈亏为零。名义金额限制为 min(position_frac x MTM x 杠杆, MTM),向下取整至整数 $100 合约,且当 MTM <= 0 时函数返回 0。币本位基准保存在普通标量属性(_coin0、_coin0_set)中,因此重启后仍会保留。预期效果:部署的名义金额会随亏损缩小,avg_position_pct 应显示约为 MTM 权益的 50%,而不是约 97%;1x 账簿也不再可能被强平。接受的单根K线空仓反转机制和 min_bars_required 覆盖项仍按 QA 的接受意见保留。坦诚说明预期与预先登记的一致:成本前盈亏大致持平,约 1,800 次往返交易在约 0.06% RT 成本下,将构成一次有测量依据的 fee_edge 证伪,而非一个可调优的策略。

negative_expectancy:在 BTCUSD_PERP 上忠实移植 FMZ“SVM预测买卖”(Zero)。BINANCE_CM 1H。经过 1,408 笔交易,avg_trade_return_pct 为 -0.129%(COIN-M 下限为 +0.10%),PF 为 0.80,夏普比率为 -0.38。账户已清算(total_return -100%),且该策略在所有波动率状态下均亏损。单笔亏损约等于吃单往返成本加冲击成本,因此成本前盈亏约为零:原始价格水平作为 SVM 特征,对下一根 K 线的方向没有信息。这与该假设对近零边际优势的预测相符。QA 对边际优势的担忧得到印证。优化无法让零毛边际优势超过成本,重新调整 spread_val 或 train_bars 将不再是忠实移植(经验教训 L120/L141)。失败代码:fee_edge(首份实测报告)。另:COIN-M 每日 MTM 序列显示出不合理的波动(连续两日分别为 -70% 和 +224%,而账簿规模为 0.5x),且 liquidation_date 与每日序列不一致。其机制尚未核实;请标记以供引擎审查。这不改变交易账本所示边际优势的正负。

实现

忠实移植自 Zero 的 FMZ《Python ML:SVM 预测买入/卖出》(fmz.com/strategy/21370)。在 BTCUSD_PERP.BINANCE_CM 的每根已收盘 1H K 线上,它都会从头重新训练一个 numpy 线性 SVM,等效于 sklearn LinearSVC 默认设置(平方合页损失,L2,C=1,OvR,截距正则化)。训练行是最近 300 根 K 线的原始 [open, close],根据下一根 K 线的收盘价变化并使用 SpreadVal=2 USD 进行 UP/DOWN/FLAT 标记。模型对刚刚收盘的 K 线进行分类。预测为 UP 时策略做多,预测为 DOWN 时做空,否则空仓;持仓规模为按市值计价的 USD 权益的 50%,以整张 $100 合约计。

验证结果

忠实移植无需修改代码。分析师应将 0.10% + 冲击成本作为成本下限。

成本前提不匹配。该假设以约 0.06% 的往返交易成本论证 BINANCE_CM,但进场和出场使用基础模板的市价单(两侧各按 0.05% 的吃单费率),因此往返成本约为 0.10%,另加模型计入的冲击成本。这不影响正确性。预先登记的 fee_edge 结果只是更快出现。

可选:如果基础模板允许,可在同一根K线上退出后立即提交反向入场。

反转时会空仓一根 K 线。预测与当前持仓方向不同时,should_exit 会平仓。反向入场只能在下一根 K 线上发生,而且只有届时预测仍相同时才会入场。源策略会在每根新 K 线上直接反转。此前 QA 接受了这一处理方式。它会略微降低敞口,并且每次反转都会错过一根 K 线。

确认模拟交易/实盘交易中是否恢复了纯标量策略状态,或根据账户初始币余额重建基线。

_coin0(BTC 基准)在首次调用 calculate_signal 时捕获。文档字符串说明它会在重启后保留。如果实盘重启时未恢复该值,重启前的已实现币本位盈亏就不会计入 MTM 权益。回测不受影响。此外,沙盒中的强平由事后计入的冲击成本导致,策略引擎内的权益计算无法感知该成本。这是测试框架的限制,而非策略错误。

沙盒是一次已完成的 fee_edge 测量,这正是该假设预先登记的内容。3,598 次往返交易,胜率为 48.8%,avg_trade_return_pct -0.102%,手续费占毛收益的 42%。每笔交易的亏损约等于实际往返成本,因此成本前损益大致为零。PF 0.71 源于成本,而不是信号反转,因此 L125 的极性疑虑并不适用。假设称 COIN-M 次往返交易成本约为 0.06%,但代码按 0.05% 的吃单费率发送 MARKET 笔订单,因此实际成本约为 0.10%,另加冲击成本(总计 $44.5k)。liquidated=true / -100% 结果并非由仓位规模导致。avg_position_pct 为 41%,因此迭代-2 MTM 修复有效。交易损益合计约为 -$76k,事后折算的冲击成本 -$44.5k 使权益曲线跌至零以下。策略引擎内的权益无法计入这笔折算成本。资金费率也未建模(funding_events_available=0),而敞口为 81%,因此实际结果会略差。作为 SVM 特征的原始价格水平不含方向信息。应将此视为已证伪(L117 形态:交易次数超过 1,000,成本前 PF 约为 1)。不要重新调整阈值。

回测评审

夏普
-0.38
总收益率
-100.00%
最大回撤
100.00%
总交易数
1408
胜率
53.6%
盈利因子
0.80

该移植忠实于原策略:分类器采用默认配置的 LinearSVC,并使用原始 [open, close] 特征。标签仅来自已经收盘的K线,因此不存在前视。

样本可靠:从 2020-08 到强平,共有 1,408 笔已平仓交易(2,815 次成交)。这足以精确测量每笔交易的收益优势。

每笔交易回报为负。avg_trade_return_pct 为 -0.129%,低于 COIN-M 的 +0.10% 下限。代码发送吃单市价单,因此真实的往返成本约为 0.10% 加冲击成本。成本前盈亏大致为零,这与 0.536 的胜率及平均盈利 $230 对比平均亏损 $333 相符。

盈利因子为 0.80。夏普比率为 -0.38,其中 CI 为 -4.43 至 1.80,PSR 为 0.41。手续费为 $43.7k,模型估算的冲击成本另为 $47.0k。该策略在三个波动率状态下均亏损(平静期夏普比率 -3.7,正常期 -2.0)。

账户已被强平,total_return 为 -100%。从 2020-09 到 2021-01,每个月的回报都为负,随后账户被清零。

基准比较:从 2020-08 到 2021-02 买入并持有 BTC,上涨约 3x。该策略的贝塔为 -0.99,阿尔法为 -2.28,因此它在强劲趋势中交易,却没有任何可弥补这一点的收益优势。

旁注,不作为判定依据:在 0.5x 账簿上,日度序列出现不合理的反向合约波动(2021-01-24 -70%、2021-01-25 +224%、2020-11-28/29 -20%/+25%)。报告还给出了两个不同的强平日期:日度序列在 2021-02-07 结束,但 liquidation_date 写的是 2021-10-11。这看起来像是 COIN-M MTM 或会计异常。我尚未核实其机制,无论这是否属实,交易账簿都是负值。

迭代历史

验证未通过(第 4 层——QA 审查)[类别=code_defect]: - [edge_concern] 沙盒:1,779 笔交易,PF 0.72,avg_trade_return_pct -0.095%。相对于约 $85k 的净亏损,成本为 $89k 手续费加 $56k 冲击成本,因此计入成本前,账簿大致持平或略有盈利 BEFORE 成本,但受换手率影响而亏损(约 1,970x)。每笔交易持仓约 3.5h,因此成本接近每笔交易的价格变动幅度。这与预先登记的 fee_edge 预测一致。对于超过 100 笔交易,若 PF < 0.70 左右,通常会引发方向极性方面的怀疑(L125)。此处 53% 胜率和正的成本前盈亏说明,亏损来自成本,而非方向。仓位规模修复后,预期将得到有测量依据的证伪结果,而不是一个可调优的策略。 - [严重] 在 BINANCE_CM 上,仓位规模没有随真实权益变动;在杠杆为 1.0 时,沙盒中的 LIQUIDATED 被强平(liquidated=true、2025-04-22、total_return -100%)。策略本应持有相当于权益 50% 的仓位,因此 1x……展开收起

验证未通过(第 4 层——QA 审查)[类别=code_defect]: - [edge_concern] 沙盒:1,779 笔交易,PF 0.72,avg_trade_return_pct -0.095%。相对于约 $85k 的净亏损,成本为 $89k 手续费加 $56k 冲击成本,因此计入成本前,账簿大致持平或略有盈利 BEFORE 成本,但受换手率影响而亏损(约 1,970x)。每笔交易持仓约 3.5h,因此成本接近每笔交易的价格变动幅度。这与预先登记的 fee_edge 预测一致。对于超过 100 笔交易,若 PF < 0.70 左右,通常会引发方向极性方面的怀疑(L125)。此处 53% 胜率和正的成本前盈亏说明,亏损来自成本,而非方向。仓位规模修复后,预期将得到有测量依据的证伪结果,而不是一个可调优的策略。 - [严重] 在 BINANCE_CM 上,仓位规模没有随真实权益变动;在杠杆为 1.0 时,沙盒中的 LIQUIDATED 被强平(liquidated=true、2025-04-22、total_return -100%)。策略本应持有相当于权益 50% 的仓位,因此 1x 账簿不应被强平。position_size() 使用 get_account_equity(),而在此交易场所,该函数读取账户以 USD 计价的稳定币余额(初始资金 100k)。反向合约的盈亏、手续费和冲击成本以 BTC 结算,资金来自独立的 50-BTC 初始资金,因此该稳定币余额始终不变。所以,无论已经亏损多少,每笔交易的仓位规模都固定在约 $50k(500 份合约)。这些数字相互吻合:avg_trade_pnl_usd -47.70 / avg_trade_return_pct -0.0954% 得出每笔交易部署的名义金额约为 $50k。avg_position_pct 相当于不断缩水的 MTM 权益的 96.9%,而声明的比例为 50%。因此,回撤最终导致强平,而不是仓位规模随之缩小。这是仓位规模/会计缺陷,不是收益优势的结果(参见 L148/L156:仓位规模仅受过时的权益数值限制)。(第 176 行)——修复:在 USD 中按市值计价的权益确定仓位规模:稳定币余额,加上自开始以来 BTC 余额的变动乘以当前价格(保存 BTC 在 on_start 时的余额),再加未实现盈亏。或者自行跟踪已平仓头寸的已实现盈亏。然后进行限制:合约数 x 100 <= position_frac x MTM 权益 x 杠杆,且不超过权益的 MTM。添加后备逻辑:当 MTM 权益 <= 0 时返回 0。在理由说明中指出,下一次沙盒运行时 avg_position_pct 应显示约 50%。 - [警告] FMZ 源代码会在一根K线内反转。此处反转的含义是先在 t 根K线上退出,然后在 t+1 根K线上,如果新的预测仍然一致,则可能重新入场。开发者已说明此情况,基础模板也强制采用这种方式。其影响是每次切换方向后空仓一根K线,且再次反转的切换会失效。这不会改变机制。(第 164 行)——修复:按已披露的方式接受。或者,在 _submit_exit 之后立即使用 should_exit 中的 _submit_entry_instrument 提交反向入场,以符合源代码的同K线反转方式。 - [警告] min_bars_required 覆盖了基类方法(静态分析警告)。这无害:train_bars+2 = 302 1H 根K线。双端队列有界(maxlen=train_bars+1),因此“无界增长”警告是误报。每根K线的成本固定(300 行,至多进行 3 次小型牛顿求解),因此其复杂度不是 O(span)(L124 OK)。(第 50 行)——修复:无需更改。 - [警告] 沙盒账簿显示 avg_holding_bars 0.0,同时为 avg_holding_period 3h27m;此外,trades_count 3557 与 total_trades 1779 不一致(成交笔数与往返交易数)。这看起来是已知的测试框架指标问题,而非策略错误。另有 funding_folded=false,且有 0 次资金费事件:COIN-M 资金费未计入盈亏,因此约 78% 的市场持仓时间包含未建模的资金费。——修复:回测审查时留意即可。无需更改策略。

结局总结

用作分类器特征的原始价格水平不包含下一根K线方向的信息,因此,以小时级换手建立的移植策略会在 fee_edge 失效,正如预先登记的预测和教训 L167 所述。另有 COIN-M 日度 MTM 波动(在 0.5x 账簿上先为 -70%,随后为 +224%)以及相互冲突的强平日期,应提交引擎审查。

回测审查时,分析师选择放弃(fee_edge / negative_expectancy):毛边际收益约为零,因此每笔交易亏损大致等于吃单往返成本加冲击成本。优化无法解决这一问题,重新调整 spread_val 或 train_bars 将违反忠实移植要求。

这是对 Zero 的 FMZ 策略《SVM 预测买卖》的忠实移植:每小时都用最近 300 根K线的原始 [open, close] 重新训练线性 SVM(以 numpy 重新实现 sklearn LinearSVC 默认配置),预测下一根K线的方向(SpreadVal=2),并以 50% 的权益、1x 杠杆交易 BTCUSD_PERP.BINANCE_CM 1H 多头/空头/空仓。

从 2020-08-11 起,直到账户被强平,1,408 笔交易的平均每笔损益为 -0.129%(COIN-M 下限 +0.10%),利润因子为 0.80,夏普比率为 -0.38(CI -4.43 至 1.80),胜率为 53.6%,总回报为 -100%。手续费为 $43.7k,模型估算的冲击成本另为 $47.0k;策略在平静、正常和高压力波动率环境下均亏损。

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