全系统key配对升级 bug9

配对维度优化后系统缺陷与不足分析

当前已对齐配对维度的部分

  • 配置层 src/trading/config.py:黑名单、禁止平仓、策略参数均支持配对级(ALT|BASE)与币种级;get_strategy_params(symbol, base_symbol) 优先级为配对 > 币种 > 全局。
  • 仓位与策略状态
    • src/trading/position_manager.py_positions: dict[PairKey, PairPosition],开/平仓、恢复、同步、孤儿收纳均按 (symbol, base_symbol)
    • src/trading/strategy.py_baselines_positions_exit_pending_last_trade_time 等全部按 PairKeyprime_buffersync_positionon_position_closedcleanup_pair 均按配对。
  • 编排与风控 src/trading/orchestrator.pysrc/trading/risk_manager.py:入场/退场匹配、重复仓位检查、止损/同步线程均按 (symbol, base_symbol)
  • 持久化 src/trading/trade_repository.pyget_open_positionsget_positions_by_symbols 返回/键为 PairKey;get_known_pair_relations 返回 list[PairKey]
  • 数据库 database/migrations/20260219_fix_pairkey_indexes.sqltrading_signalspair_positionsanalysis_results 的索引与压缩分段已改为 (symbol, base_symbol)
  • 服务层 src/services/realtime_kline_service_base.py_has_open_position(symbol, base_symbol) 与 DB 查询均按配对 + network。

缺陷与不足

1. 告警限流/去重未按配对维度(建议修复)

  • 位置src/utils/monitoring/alert_sender.py 的限流与去重 key;src/trading/orchestrator.py_send_entry_alert(..., pair_name=signal.symbol)
  • 问题pair_name 仅传 signal.symbol,同一 alt 多配对(如 PURR|HYPE 与 PURR|BTC)共享同一限流桶,一个配对的告警可能压制另一配对的正常告警。
  • 建议:在 pair 模式或当 signal.base_symbol 非空时,使用配对维度作为告警 key,例如
    pair_name = f"{signal.symbol}|{signal.base_symbol}" if signal.base_symbol else signal.symbol,并在 _send_entry_alert 中传入该值。

2. cleanup_symbol 未被使用且与“仅按配对清理”策略不一致(建议明确或收敛)

  • 位置src/trading/strategy.pycleanup_symbol(symbol)(约 347–362 行)。
  • 问题
    • 当前仅 cleanup_pair(symbol, base_symbol) 被调用(退场/同步/止损后),没有任何地方调用 cleanup_symbol
    • cleanup_symbol(symbol) 会按 k[0] == symbol 清除该 symbol 下所有配对的状态;若将来被误用(例如只传 symbol),会误清同 symbol 其他配对的状态。
  • 建议:二选一:
    • 收敛:若业务上不需要“按币种整批清理”,可删除 cleanup_symbol,避免后续误用;
    • 保留:则仅在明确“禁用某币种并清理其所有配对”的入口调用,并在注释/文档中说明与 cleanup_pair 的差异及调用场景。

3. allow_duplicate_position 与当前内存结构不兼容(设计限制)

  • 位置src/trading/position_manager.py_positions: dict[PairKey, PairPosition]
  • 问题:当 allow_duplicate_position=True 时,同一 (symbol, base_symbol) 可能有多条仓位,但 _positions 为 PairKey → 单条 PairPosition,后写入会覆盖先前的仓位,导致漏管或错误平仓。
  • 建议
    • 短期:在配置说明或代码注释中明确“当前实现下 allow_duplicate_position 仅允许不同配对多仓,同一配对仅支持单仓”;若需同配对多仓,需先改结构。
    • 中长期:若产品确需同配对多仓,可将 _positions 改为 dict[PairKey, list[PairPosition]] 或按 position_id 索引(例如 dict[str, PairPosition]),并同步修改开仓/平仓/恢复/同步的查找与更新逻辑。

4. 部分告警/日志未体现 base(可改进)

  • 位置:例如 src/trading/orchestrator.py 中平仓重试全部失败告警(约 439 行)使用 symbol_to_coin(pos.symbol),未带 base。
  • 问题:pair 模式下多配对时,仅看 alt 难以区分是哪一个配对失败。
  • 建议:在关键告警标题或内容中,pair 模式下增加 pos.base_symbol,例如
    f"{pos.symbol}|{pos.base_symbol or ''}"symbol_to_coin(pos.symbol) + 注明 base,便于排查。

5. 历史已压缩 chunk 与新区块分段不一致(运维已知,可选处理)

  • 位置database/migrations/20260219_fix_pairkey_indexes.sql 注释已说明。
  • 问题:已压缩的 analysis_results / trading_signals 历史 chunk 仍为旧分段方式;新数据才按 (symbol, base_symbol) 分段压缩,查询与压缩策略在历史数据上不一致。
  • 建议:若需全量一致,可对历史 chunk 执行 decompress_chunk + recompress_chunk(需在低峰期执行);否则保持现状,仅新数据使用 PairKey 分段。

6. 其他一致性检查(无问题)

  • 策略 signal 去重signal_key = f"{symbol}:{base_symbol}:{direction}:{timestamp}" 已是配对维度,正确。
  • 配置 key 格式:黑名单/策略覆盖统一为 ALT|BASE,环境变量用 __ 解析为 |,一致。
  • daily_trading_stats:按 (stat_date, network) 汇总,无配对维度,符合当前“按日按网统计”的设计,无需为配对维度改动。

建议优先级

优先级 说明
告警 pair_name 按配对维度 小改,避免多配对时告警互相压制
cleanup_symbol 删除或明确用法 避免误用导致误清其他配对状态
allow_duplicate_position 文档/注释 明确“同配对仅单仓”的设计限制
告警/日志中体现 base_symbol 便于 pair 模式排查
历史 chunk 重压缩 按需在运维窗口执行

小结

全系统 Key 改为配对维度后,核心路径(仓位、策略、持久化、DB 索引与压缩、服务层持仓判断)已一致使用 (symbol, base_symbol)。剩余问题主要集中在:告警限流 key 未按配对、未使用的 cleanup_symbol 的语义风险、以及 allow_duplicate_position 与当前一对一 PairKey 结构的限制。按上表优先级逐步处理即可进一步消除缺陷与歧义。

Read more

跑步的技巧(滚动落地)

“滚动落地(rolling contact / rolling foot strike)”不是一种教条式的“脚法”,而是一种 让冲击沿着整只脚、整条后链逐级传递的落地机制。 它的核心不是“你先用哪儿着地”,而是: 你的脚落地之后,冲击是不是像轮子一样滚过去,而不是像锤子一样砸下去。 这就是滚动落地的本质。 一、什么叫“滚动落地”? 你可以把它理解成两种完全不同的落地方式: 1. 砸地(撞击式) 脚像锤子一样拍到地上: * 要么后跟先砸 * 要么前掌先戳 * 冲击集中在一个点 * 一个结构瞬间吃掉大部分载荷 结果就是: * 后跟砸 → 膝盖难受 * 前掌戳 → 前脚掌磨烂 * 都不是长跑友好模式 这叫 撞击式着地(impact strike)。 2. 滚地(滚动式) 脚像轮胎一样“滚”过地面: * 不是某一点硬砸 * 而是外侧中足先轻触 * 再向前滚到前掌 * 最后从大脚趾蹬离

By SHI XIAOLONG

AMI的优越性

世界模型(World Models)的具体例子 如下,我按类型分类,便于理解。每类都附带实际实现、演示效果和应用场景。 1. Yann LeCun / Meta 的 JEPA 系列(最直接对应“世界模型”概念) 这些是 LeCun 主张的非生成式抽象预测世界模型代表。 * I-JEPA(Image JEPA,2023) 输入一张图像,模型把不同区域(context 和 target)编码成抽象表示,然后预测 target 的表示(不在像素级别重建)。 例子:给定一张遮挡了部分物体的图片,模型能预测“被遮挡物体的大致位置和属性”,构建对物体持久性和空间关系的理解。 这是一个“原始世界模型”,能学习物理常识(如物体不会凭空消失)。 * V-JEPA / V-JEPA 2(Video JEPA,

By SHI XIAOLONG

什么是:“世界模型(World Models)”

世界模型(World Models) 是人工智能领域的一个核心概念,尤其在 Yann LeCun 等研究者推动的下一代 AI 架构中占据中心位置。它指的是 AI 系统在内部构建的对现实世界的抽象模拟或内部表示,让机器能够像人类或动物一样“理解”物理世界、预测未来、规划行动。 简单比喻 想象你闭上眼睛也能“看到”房间里的物体会如何移动、碰撞或掉落——这就是你大脑里的世界模型。AI 的世界模型就是类似的“数字孪生”(digital twin)或“内部模拟器”:它不是简单记住数据,而是学习世界的动态、因果关系和物理直觉(如重力、物体持久性、遮挡、因果等)。 为什么需要世界模型? 当前主流的大型语言模型(LLM) 擅长处理文本(统计模式预测),但存在根本局限: * 缺乏对物理世界的真正理解 → 容易“幻觉”、无法可靠规划。 * 样本效率低 → 人类/

By SHI XIAOLONG

K线周期可配置化设计方案

K线周期可配置化设计方案 1. 背景与目标 当前 Beta 套利策略的 K 线周期硬编码为 "1h",分散在多个文件中。需要: 1. 将 K 线周期从 1h 改为 2h 2. 提取为环境变量 BETA_ARB_KLINE_INTERVAL,使其可在 .env 中配置 2. 影响范围分析 2.1 需要修改的文件(共 6 个) 文件 硬编码位置 修改内容 src/trading/config.py BetaArbConfig dataclass 新增 kline_interval 字段,

By SHI XIAOLONG