Files
Chan/research/HANDOFF.md
T
jackyu66gitandCursor 66061f79a1 research: 低滞后信号口径定稿与实盘前偏差审计
fast_bsp3 改用 tol=-1 + require_touch=False,信号滞后从 5.8 根降到 2.2 根。
滞后与收益严格单调(年化 370% -> 906%,同一份数据同一套成本),
这是本轮提升的主因,也意味着实盘延迟会直接侵蚀收益。

新增 step31~39 验证策略能否落地:
- 跨品种样本外——8 个未参与调参的币,PF 2.73 / t 28.5,无一为负
- 时点重建——只喂到信号那一根重算,同根命中 100%,确认无未来函数;
  1m 在 2000 根窗口即饱和,计算耗时 0.20s
- 偏差审计——多空对称、中枢生效时刻零回退、滑点稳健至 30bp、持仓几乎不重叠
- 消融——alpha 来自缠论中枢的上下文定位,而非「收盘转强」这个触发动作

补 research/HANDOFF.md:记录确切口径与参数、已排除的偏差、
已验证无效因而不必重做的方向,以及下一步用影子交易器实测执行滑点的方案。

清理 step1~20 的输出:早期方法论已被推翻(存在未来函数偏差),
其结论不再被引用;脚本保留,需要时可重跑。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-27 17:47:41 +08:00

23 KiB
Raw Blame History

缠论信号研究 → 实盘落地:交接文档

最后更新:2026-08-27。写给接手这项工作的下一个 agent。 读完这份文档应该不需要再翻聊天记录。若确有需要,历史转录在 /Users/jack/.cursor/projects/Users-jack-Project-chan/agent-transcripts/


0. 一句话现状

策略在回测和多重偏差审计下都站得住(跨 11 个币、7 年、多空对称、无未来函数), 研究阶段基本结束;当前唯一的拦路问题是「实盘执行成本能否压进预算」, 下一步是写影子交易器实测滑点,而不是继续调参。

用户明确要求:不要再跑新的参数优化。 他的原话是「很多时候回测数据特别好, 一到 dry run 和实盘就歇菜了」。他要的是执行层的验证。


1. 策略的确切定义

这是全文最重要的一节。所有回测数字都基于以下这套口径,改任何一条数字就不可比。

1.1 信号生成(三层)

第一层  小级别(LTF) 自身的中枢         build_htf_zones(cdf, ltf, chan=chan_l)
第二层  中枢突破后回抽不回,收盘转强 → 入场   find_fast_bsp3(cdf, zones)
第三层  大级别(HTF) 分型方向必须同向        attach_htf_context(...) 后取 h1_agree == 1
可选    中枢阶梯方向过滤(顺向推进)        z_above / z_below,见 1.4

用户对「区间套」的定义(务必按这个理解,早期我理解错过): 大级别(1h/4h)分型定位转折点 + 小级别(15m/5m/1m)中枢突破形成第三类买卖点。 不是大级别中枢突破。

1.2 find_fast_bsp3 的当前默认参数

research/lib/fast_bsp3.py

参数 默认值 含义与注意
scan 200 中枢成立后向后扫多少根找突破
pullback_win 30 回抽窗口
tol -1.0 负值=禁用「回抽未触及边界就跳过」。这是最关键的参数,见 3.2
max_per_zone 1 同一中枢只做首次入场,见 4.2
require_touch False 不要求回抽触及中枢边界,见 3.2

tol=-1 + require_touch=False 是当前口径,滞后 2.2 根。 早期默认(tol=0.003, require_touch=True)滞后 5.8 根,年化从 906% 掉到 370%。 新旧差异已完整量化在 step34(tol 扫描)与 step33require_touch)里, 旧口径的原始输出已清理——不需要它,也不要回到旧口径

1.3 交易执行口径

SL, TP, MAX_BARS = 1.5, 3.0, 48      # ATR 倍数止损/止盈 + 超时根数
run_trades(cdf, entries, SL, TP, MAX_BARS, fee=..., entry_delay=1)
  • 入场:信号次根开盘价entry_delay=1),不是信号根收盘价
  • 研究口径成本:4bp 手续费 + 1bp 滑点 = 5bp(所有带「已扣 5bp」的数字都是这个)
  • ATR 取信号根的值(atr[sig_idx]),不是入场根

1.4 阶梯过滤(顺向推进)

对应缠论「趋势 vs 盘整」:当前中枢相对前一个中枢是否同向推进。

pg, pdn = z["zg"].shift(), z["zd"].shift()
z["z_above"], z["z_below"] = z["zd"] > pg, z["zg"] < pdn
push = z_above if direction == 1 else z_below

加上它 PF 从 2.72 → 3.4130m/2h)。用户特别在意这一点,因为它印证了 缠论对趋势的定义(一个分型后第一个中枢就反转的概率低于出现第二个中枢后反转)。

1.5 各级别的确切配对

小级别 大级别(h1,做同向过滤) 备注
1m 5m step23 的配置是 1m:5m:15m15m 只记录不过滤
5m 30m 统计量最强
15m 1h
30m 2h 单笔质量最高

2. 最优配置与核心数字

2.1 级别矩阵(step28,同向+阶梯,3 币)

组合 笔数 胜率 中位 PF t值
5m/30m 1321 53.1% +0.31% 1.98 10.16
30m/2h 258 65.1% +1.65% 3.41 8.51
5m/15m 1292 51.7% +0.24% 1.82 8.84
15m/1h 467 56.5% +0.74% 2.46 7.96

选择逻辑:30m/2h 单笔质量最好,5m/30m 统计显著性最强。1h 及以上小级别笔数不足。

2.2 跨品种样本外(step37)— 最有说服力的一项

参数一个没动,拿 8 个完全没参与调参的币验证:

分组 笔数 年笔数 胜率 中位 PF t值 剔10%PF
样本内(BTC/ETH/SOL) 2309 334 61.4% +0.531% 2.86 +19.11 1.77
样本外(8 个新币) 5859 884 62.9% +0.592% 2.73 +28.50 1.66

逐币最弱的 XRP 仍是 PF 2.21 / t 7.64。没有一个币是负的。

2.3 收益量级——务必用正确口径(step35 第 5 节)

这一条最容易被误读,历史上我自己也一度报错过口径:

口径 年化 回撤 Sharpe
A 1%风险+20倍上限+复利 +1323.8% 8.1% 10.38
B 1%风险+20倍上限+不复利 +270.0% 8.4% 10.38
C 固定名义1倍+不复利 +194.7% 8.4% 7.95
D 固定名义3倍+不复利 +584.1% 25.2% 7.95

只有 C/D 是可以直接对照的量级。 那些 906%/1323% 的数字来自复利+杠杆假设。 平均单笔杠杆 2.1x(中位 1.8x)。 未含资金费率,未含同时持仓的保证金约束。


3. 已验证成立的结论

3.1 没有未来函数(step38,最要紧的一项)

担心的是 incremental.py 里那句注释:「最后一笔 is_sure 允许收回」—— 中枢生效时刻 available_ts 取自笔的 sure_time,而那是全量重算得出的。

做法:对每个信号只喂到该根为止的数据(窗口 4000 根),重跑 TF_DF → 中枢 → fast_bsp3,看信号是否真的在那一刻存在。

结果:同根命中 100.0%(抽检 1217 个信号),完全消失 0.0%,假阳性 0.7%。 偏移中位 +0.0 根。回测口径可信。

3.2 滞后是收益的第一驱动(step34)

口径 笔数 滞后(根) 胜率 PF 年化 Sharpe
禁用跳过(现用) 2309 2.2 61.4% 2.86 +906.1% 9.02
tol 0 2214 2.7 60.4% 2.74 +731.3% 8.43
tol 0.1% 2134 3.6 58.7% 2.64 +569.8% 7.65
tol 0.3%(旧默认) 2045 5.8 55.4% 2.37 +370.4% 6.30
tol 1% 1561 9.9 48.3% 1.88 +112.0% 3.53

滞后与收益严格单调。这也意味着实盘延迟会直接侵蚀收益,是下一阶段的核心风险。

3.3 其余已排除的偏差

  • 中枢生效时刻step36 §1):0% 走 end_time 回退分支,全部用 sure_time
  • 多空对称step36 §3):做多 PF 3.12 / t 14.77,做空 PF 2.62 / t 12.27 → 不是单纯吃加密货币的上涨 beta
  • 时间样本外step36 §4):20192022 挑参数,20232026 验证 → PF 从 3.31 降到 2.44t 仍 12.29。有衰减但成立
  • 滑点脆弱性step35 §1):加到 +30bp 仍 PF 1.73 / t 10.15
  • 入场后移step35 §2):后移 1→4 根平滑衰减(PF 3.18→2.53), 未来函数会呈断崖,这里没有
  • 持仓重叠(step35 §3-4):单腿平均并发 0.01,组合 9 腿平均并发 0.1, 有仓位时间仅 8.6% → t 值没被虚高,各笔基本独立

3.4 alpha 的来源(step32 消融)

逐条拆掉 fast_bsp3 的条件后发现:alpha 完全来自缠论中枢的上下文定位, 不是「回抽结束、收盘转强」那个触发动作本身。 触发条件只负责压低滞后。

这个结论回答了用户当时的问题(「如果有这个,那就可以去判断任何笔的端点了」): 不能。脱离中枢上下文,那个触发条件没有预测力。


4. 已验证无效 / 不要重做的方向

方向 结论 出处
动态止盈(小级别三买后等大级别三买再调止盈) 无效。持仓期太短(8~13 根),大级别确认来得太罕见 step27
同一中枢重复入场(二次、三次) 质量骤降,只做首次 step25
缠论引擎原生 find_all_bsp 的 B3/S3 is_sure 确认滞后,统计上呈逆势、显著亏损。几何位置没错,但实时不可用 step30/31
刷交易额换 VIP 费率 成本收益不划算,见 5.3 step23
线段(Chan_XD)做大级别 滞后太大,且中枢极少 早期,用户也这么说

5. 实盘落地的现状与关键约束

5.1 交易所:这是当前最大的未决项 ⚠️

用户实际用 Bitget手续费.xlsx 在项目根目录):

VIP maker taker 升级门槛(月交易额)
1 0.020% 0.060% 0
2 0.016% 0.040% $3M
3 0.014% 0.0375% $20M

返还比例:手动 60%、API 50%

框架支持情况(已查证,2026-08):

框架 Bitget 永续 说明
freqtrade(本地已装 2025.4-dev 源码里搜不到一处 bitgetSUPPORTED_EXCHANGES = binance/bingx/bitmart/bybit/gate/htx/hyperliquid/kraken/okx
NautilusTrader nautilus-bitget 是 0.0.0 空壳无 API;官方适配器列表(2026-06-30)无 Bitget。Bitget 只出现在第三方 Tardis 历史数据里
Hummingbot bitget_perpetual v2.0 连接器,2026 年 Bitget 官方合作。支持单向/对冲、限价/市价,有 Perp Candles Feed

用户最后问的就是「还有没有其他框架支持 Bitget」,答案是 Hummingbot—— 这个问题还没得到他的回应,需要先确认交易所再定框架。

其他信息:Hummingbot V2 的 PositionExecutor 结构恰好匹配我们的 「入场 + 止损 + 止盈 + 超时」,架构上契合。用户的费率表里还有一列空着的 HL Hyperliquid),而 Hyperliquid 在 freqtrade 和 Nautilus 都是原生支持的。

5.2 网络:Bitget 必须走代理 ⚠️

直连  失败 NetworkError: bitget GET https://api.bitget.com/api/v2/spot/public/coins
代理  OK 2.39s  (http://127.0.0.1:7897)

盘口实测(BTC/USDT:USDT 永续):bid 79492.7 / ask 79492.8 价差仅 0.01bp100 档深度。即时价差成本可忽略。

但代理会把延迟从几百毫秒放大到秒级,而 1m 那条腿的滑点预算只有 3.9bp。 实盘这条腿最终必须落到境外 VPS,否则测出来的滑点是代理的账,不是策略的账。

5.3 1m 那条腿的经济性(用户的核心问题)

用户原话:「1m 测的是返佣后是否能够不亏钱」,配合「一边刷交易额,一边走大点周期」。

1m 同向信号实测:3578 笔 / 2.28 年 / 3 币 = 524 笔/年/币, 毛均收益 +0.0991%,胜率 54.2%,平均持仓仅 8.3 分钟。

按 Bitget 真实费率算滑点预算:

档位 双边费率 PF=1 滑点上限 t>2 实用上限
VIP1 taker + API 返50% 0.060% 3.9bp ~2.5bp
VIP1 taker + 手动返60% 0.048% 5.1bp ~3.8bp
VIP2 taker + API 返50% 0.040% 5.9bp ~4.5bp
VIP1 maker + API 返50% 0.020% 7.9bp ~6.5bp

四条腿的滑点余量对比VIP1 taker + API 返50%,即双边费率 0.060%):

级别 笔数 毛均收益 平均持仓 滑点余量
1m 3578 +0.0991% 8.3 根 3.91bp
5m 1984 +0.3253% 9.7 根 26.53bp
15m 689 +0.4436% 12.1 根 38.36bp
30m 340 +0.9504% 11.7 根 89.04bp

1m 和 30m 的余量差 23 倍。

重要判断:1m 若失败,唯一的结论是「执行成本超了 3.9bp」, 绝不能拿它去否定 5m/30m。 三条腿的成本敏感度不在一个量级上。

风险点:入场条件恰好是「收盘突破转强」,那一刻价格正朝我们的方向跑, 所以延迟造成的是系统性的追高/追低,不会正负抵消。这正是 「回测漂亮、实盘歇菜」最常见的具体机制。

5.4 实时计算窗口(step39,已跑完)

research/step39_pit_1m.py(新写,已跑完:3 币 × 每币 60 信号 = 180 笔抽检):

窗口(根) 覆盖天数 同根命中 ±3根内 完全消失 同向过滤也成立 假阳性 耗时中位 耗时P95
2000 1.4 100.0% 100.0% 0.0% 100.0% 0.0% 0.20s 0.22s
4000 2.8 100.0% 100.0% 0.0% 100.0% 0.0% 0.40s 0.42s
8000 5.6 100.0% 100.0% 0.0% 100.0% 0.0% 0.81s 0.84s
16000 11.1 100.0% 100.0% 0.0% 100.0% 0.0% 1.68s 1.81s

分币种(最大窗口):BTC/ETH/SOL 各 60 笔全部 100% 命中,零偏移。

结论:1m 在 2000 根窗口(1.4 天)就已完全饱和,单次计算 0.20s,假阳性 0%。 比 15m/30m 的 step38 结果还干净(那里有 0.7% 假阳性)。耗时对窗口严格线性 (约 0.105ms/根),所以没有任何理由带更长的历史。

这一步顺带解决了一个更重要的问题1m 的回测口径本身是可信的, is_sure 回撤对 1m 同样没有影响。1m 现在唯一的风险就剩执行成本。

⚠️ 延迟预算的分解(这直接决定 1m 生死):

环节 实测 说明
信号计算 0.20s 2000 根窗口,可控
走代理访问 Bitget 约 2.4s 单次 REST 往返(含建连),这才是瓶颈

计算只占延迟的一小部分,网络是主要来源。所以影子交易器必须: 用 WebSocket 订阅而非轮询 REST 拉 K 线,并尽快把实盘迁到境外 VPS。 否则测到的滑点全是代理的账。

为什么这一步必要:step38 只验证了 15m/30m,从没验证 1m。而窗口 4000 根 对 15m 是 41 天、对 1m 只有 2.8 天,中枢的左边界效应完全不是一个量级。 窗口同时牵动两头:太短则中枢被截断信号不符,太长则算得慢延迟大滑点高。


6. 接下来要做的事(按优先级)

第 1 步:跑完 step39,确定实时窗口 已完成

结果见 5.4 节。结论:影子交易器用 2000 根 1m 窗口,单次计算 0.20s。 完整输出在 research/out/step39.logstep39_pit_1m.csv,无需重跑。

(若日后要重跑:python research/step39_pit_1m.py --symbols BTC,ETH,SOL --probe 60 --workers 3,约 4 分钟。瓶颈不在窗口重建,而在 run_one 开头 那次 120 万根 1m 的全量 TF_DF。)

第 2 步:向用户确认交易所(当前的阻塞项)

这个问题必须他回答,因为它决定框架:

  • 留 Bitget → 只有 Hummingbot 支持,或用 ccxt 自己写执行层
  • 换 Hyperliquid / Binance / Bybit / OKX → freqtrade 和 Nautilus 都能用

他已选定先只上 1m(在我问「先从哪条腿落地」时选的 1m_first)。

第 3 步:写影子交易器测滑点(核心工作)

关键判断:测滑点不需要任何交易框架。 完整框架解决的是「如何可靠下单」, 而当前的未知量是「成交价会差多少」。所以先写一个不下单的影子跑法:

每根 1m 收盘 → 拉最新 K 线 → 算信号(窗口取第 1 步的结论)
           → 信号触发时抓真实盘口(bid/ask + 深度)
           → 按仓位吃单深度算出真实成交价
           → 等下一根 K 线出来,取其开盘价(回测假设的成交价)
           → 两者相减 = 真实滑点

必须把时间戳拆开记录,否则不知道该优化哪里:

时间戳 含义
t_close K 线收盘时刻
t_data 数据到手时刻 → 拉取延迟
t_signal 信号算完时刻 → 计算延迟
t_book 盘口快照时刻 → 下单时点

滑点应分解成三块:延迟漂移t_book 中间价 次根开盘价)、 盘口价差ask 中间价)、深度冲击(加权成交价 − ask)。 预期延迟漂移是主项,价差可忽略(0.01bp)。

建议路径 research/live/shadow.py,复用 research/lib/ 下同一套信号代码, 这样两边数字直接可比。代码量约两三百行。

实现要点:

  • 数据格式必须与 lib/data.py 一致:timestamp(int64 ms), date(tz Asia/Shanghai), open/high/low/close/volume
  • ccxt 拉 Bitget 需 proxies = {'http': 'http://127.0.0.1:7897', 'https': ...}options={'defaultType':'swap'}
  • 持仓也要影子管理:SL/TP/48 根超时,出场同样记录真实盘口
  • 状态要落盘,重启不能丢

第 4 步:根据滑点结果决策

  • 滑点 ≤ 2.5bp → 1m 可行,t>2,可以进入真实 dry run
  • 2.5~3.9bp → 1m 勉强不亏但无统计显著性,考虑争取 60% 手动返佣或 VIP2
  • 3.9bp → 1m 放弃,但 5m/30m 不受影响(余量 26bp / 89bp

第 5 步(后续):1m 与 5m 分实例

用户问过「1m 和 5m 分成两个实例跑呢?」——对,而且是硬要求 freqtrade 一实例只能一个 timeframe;另有资金池隔离、统计独立、 API 限流风险隔离三个好处。

⚠️ 有个坑要提前处理:两个实例可能在同一个币上同时持反向仓位 (1m 出三卖做空、5m 出三买做多),单向持仓模式下会互相平掉或直接报错。 要么开对冲模式,要么两个实例分配不同币种(币种够多,分开还能看出品种间差异)。


7. 环境与数据

7.1 数据

  • 位置:data/binance/futures/{SYM}_USDT_USDT-{tf}-futures.feather
  • BTC/ETH/SOL:全周期 1m1w21722543 天
  • 另有 8 个样本外币种(BNB/XRP/DOGE/ADA/AVAX/LINK/LTC/TRX): 48 个文件已全部校验,2020~2026-08-26,零缺口零重复
  • 读取统一走 research/lib/data.pyfetch_ohlcv(symbol, tf, limit) 本地优先,回落到 https://provider.jackyu66.com(该服务只有 BTC/ETH/SOL, 且小周期仅 90 天,别指望它)

7.2 代理

本地代理 127.0.0.1:7897。Binance 和 Bitget 的 API 都需要它。

7.3 已修过的两个 bug(别再踩)

  1. 时间戳精度lib/data.py):不能用 date.astype("int64")//10**6 该值单位取决于列精度([ns] 给纳秒、[ms] 给毫秒),对毫秒精度的文件 会把时间戳砸平,再被 drop_duplicates 删掉九成数据。 正确写法:(date - pd.Timestamp("1970-01-01", tz="UTC")) // pd.Timedelta("1ms")
  2. 相邻中枢撞同一 entry_idx:会让下游 set_index("entry_idx")InvalidIndexError。已在 find_fast_bsp3 末尾按 ["entry_idx","occ","zone_i"] 排序后 drop_duplicates("entry_idx") 去重。

7.4 跑长任务的注意事项

  • 用 shell 工具的原生后台执行(block_until_ms=0), 不要用 nohup——早期用 nohup 的后台任务多次莫名消失
  • 1m 全量数据(120 万根)的 TF_DF 约需 2 分钟,任何涉及 1m 全量的脚本 都要预留时间
  • 多进程用 ProcessPoolExecutor,记得在子进程里重新 sys.path.insertwarnings.filterwarnings("ignore")
  • 内存很大(用户说「随便用」),但 1m 全量 × 多进程仍可能吃掉几十 GB

8. 代码地图

8.1 研究库 research/lib/

文件 作用
data.py 数据层,本地 feather 优先
fast_bsp3.py 核心:自研低滞后第三类买卖点。滞后 2.2 根
nested_level.py build_htf_zones:构建中枢,可传入已建好的 chan 复用
nested_bsp.py htf_fx_timeline / attach_htf_context:区间套上下文。
confirm_ts+period 修正 K 线收盘时刻
fx_signal.py 分型信号提取与背驰
breakout.py 事件驱动回测。run_trades 支持 entry_delay/slippage/
boost_dir(动态止盈,已验证无效)

8.2 缠论引擎 chanlun/

  • TF_DF(df, 1, tf) 是入口,.dataframe 拿到含缠论标注的 DataFrame
  • pipeline/builders/incremental.py:增量更新(init_stream / append_bar / replace_last_bar / rebuild_bi_zs)。注释写明「最后一笔 is_sure 允许收回」, 这是 step38 要验证的那个隐患(已证实无影响)。 实盘若要用增量而非全量重算,需重新验证
  • pipeline/orchestrator.pyTF_DF 方法的门面
  • web/:图表与分析服务,无下单/订单管理功能,实盘用不上

8.3 实验索引

step 一句话
1~14 早期探索:信号有效性、滞后测量、直接预测收益(后发现有未来函数偏差,已弃)
15~18 区间套雏形;fast_bsp3 诞生(降滞后)
19~20 级别配对批量扫描 + 并行化
21 最优配置的尽调(尾部依赖、成本敏感)
22 执行压力:收盘价 vs 次根开盘、滑点
23 费率分档 + 刷量测算1m 经济性的数据来源)
24 信号聚簇:同一大级别分型下的多信号是否独立(是)
25 同中枢重复入场(只做首次)
26 中枢阶梯序列(趋势 vs 盘整,印证缠论定义)
27 动态止盈(无效)
28 全级别矩阵(最优配置来源)
29 信号漏斗诊断 + 参数敏感性
30/31 引擎原生 B3/S3 对比 + 方向反转诊断(引擎信号因滞后而亏损)
32 消融研究(alpha 来自中枢上下文,非触发动作)
33 require_touch=False 的影响(显著提升)
34 tol 扫描(滞后与收益严格单调)
35 高收益审计(口径、滑点、并发)
36 偏差审计(生效时刻、多空、时间样本外)
37 跨品种样本外8 个新币)
38 时点重建(无未来函数)
39 1m 时点重建 + 窗口扫描(新写,待跑完)

输出都在 research/out/2026-08-27 清理过一轮:step1~20 的输出(早期方法论 已被推翻,含未来函数偏差)与旧口径备份一并删除,只留支撑当前结论的证据。 脚本都还在,需要时可重跑。step31 及之后的 .py 都在 research/ 下。


9. 与用户协作的注意事项

  • 用中文回复(用户规则)
  • 用户技术判断力强,会主动纠正方向(他纠正过我对区间套的理解、 指出内存回收、指出结论印证缠论定义)。他的领域直觉值得认真对待
  • 他反复强调不要再调参,要落地验证
  • 他讨厌长时间等待,早期多次问「还在跑吗」「好了吗」。 长任务要后台跑并主动汇报进度,不要让他干等
  • 报数字时必须交代口径(复利/杠杆/费率),否则会误导

10. 待办清单

  • step391m 时点重建 + 窗口扫描 → 2000 根窗口饱和,计算 0.20s, 假阳性 0%,1m 回测口径可信
  • 向用户确认交易所(阻塞后续框架选择,这是当前第一件事)
  • research/live/shadow.py 影子交易器,测 1m 真实滑点。 务必用 WebSocket 而非 REST 轮询——代理下单次 REST 往返约 2.4s, 而信号计算只要 0.20s,网络是延迟主项
  • 收集 1~2 周影子数据,与回测口径逐笔对比
  • 按 6.4 的判据决策 1m 是否可行
  • 若可行:选框架(Bitget→Hummingbot)做真实 dry run
  • 补一项研究阶段的缺口:资金费率从未计入任何回测。 30m 腿平均持仓 6.5 小时会跨结算点,需要评估影响
  • 补:同时持仓的保证金约束也未建模(组合有仓位时间仅 8.6%, 预计影响小,但没算过)