全系统key配对升级 bug12

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

当前架构概览

  • PairKey 定义src/trading/models.pyPairKey = tuple[str, str],即 (symbol, base_symbol),全系统交易/仓位/策略状态均按此维度存储。
  • 配置层配对键:黑名单与策略覆盖使用字符串格式:币种级 "PURR"、配对级 "PURR|HYPE"(由 symbol/base_symbol 解析出 asset 部分后拼接),见 config.pyis_symbol_allowedis_close_disabledget_strategy_params
  • 服务层配对键:分析黑名单与 pair cache 使用 tuple (symbol, base_symbol) 或 symbol 字符串(K 线/任务 key),见 realtime_kline_service_base.py
flowchart LR
  subgraph trading [交易层]
    PM[PositionManager]
    RM[RiskManager]
    Strat[Strategy]
    Orch[Orchestrator]
  end
  subgraph config [配置]
    BL[黑名单/close_disabled]
    SP[策略参数覆盖]
  end
  subgraph service [分析服务]
    PairCache[pair_cache]
    AnaBL[_blacklist_cache]
  end
  PM --> PairKey
  Strat --> PairKey
  Orch --> BL
  BL --> "ALT|BASE 字符串"
  PairCache --> "alt_symbol 字符串"
  AnaBL --> "tuple(symbol,base)"
  PairKey["PairKey = (symbol, base_symbol)"]

一、已做对的部分(无缺陷)

  • 仓位/策略/风控PositionManagerAdaptiveBollingerStrategyRiskManager 均按 (symbol, base_symbol) 做重复仓位检查、状态存储、止损/超时参数查找,与配置的 get_strategy_params(symbol, base_symbol) 一致。
  • DB 与恢复pair_positions 的 symbol/base_symbol、恢复时 key = (symbol, base_symbol)get_positions_by_symbols 返回 dict[PairKey, dict],与内存一致。
  • 编排器process_analysis 强制要求 base_symbol 存在、黑名单与策略参数均按配对维度调用,入场/退场与 has_position(symbol, base_symbol) 一致。
  • 孤儿与同步sync_with_exchange 返回的 closed_pairs / adopted_pairs / base_lost_failed_pairs 均为 list[PairKey],编排器据此同步策略层;base 腿残留收纳为 (orphan_symbol, "") 单腿仓位,逻辑自洽。

二、缺陷与不一致

1. 双黑名单未统一,可能浪费算力且语义割裂

  • 交易黑名单(config):TRADING_SYMBOL_BLACKLIST,格式 "PURR""PURR|HYPE",仅在 orchestrator.process_analysis 中用于拒绝开仓。
  • 分析黑名单(DB + 服务内存):symbol_blacklist 表 + _blacklist_cache,key 为 (symbol, base_symbol),用于跳过分析拉黑保护(有持仓则拒绝写入 DB 黑名单)。

问题:若只在 config 中配置了配对级黑名单(如 PURR|HYPE),分析层仍会对该配对做完整分析与策略计算,仅到执行前被交易黑名单拒绝,造成 CPU/IO 浪费;反之若只加分析黑名单而未加 config,理论上仍可能对该配对产生信号并尝试开仓(取决于分析是否先被 DB 黑名单过滤)。两套黑名单来源、生命周期、键格式均不同,运维与预期行为容易混淆。

建议:在分析入口(如 _analyze_and_alert 或调度处)增加对交易黑名单的查询(需注入 config 或提供 is_symbol_allowed(symbol, base_symbol)),使被交易黑名单禁止的配对直接跳过分析;和/或提供文档/配置说明,明确“分析黑名单 vs 交易黑名单”的职责与推荐用法。


2. 配对关系缓存键与 K 线 symbol 格式需明确约定

  • pair_cache:来自 cointegrated_pairs_pair_cache[alt_symbol] = [base_symbol, ...],键为 alt_symbol
  • 分析任务:K 线到达后以 symbol(如 PURR/USDC:USDC)入队,工作线程用 base_symbols = self._pair_cache.get(symbol, []) 解析要分析的配对。

cointegrated_pairs 中存的是全合约符号(如 PURR/USDC:USDC),与 K 线 symbol 一致,则查找正确;若存的是资产名(如 PURR),则 _pair_cache.get("PURR/USDC:USDC", []) 会落空,仅能依赖 self.base_symbol,导致多 base 配对发现依赖回测/导入的符号格式。

建议:在文档或代码注释中明确规定 cointegrated_pairs.alt_symbol / base_symbol 必须与实时 K 线/交易使用的 symbol 格式一致(推荐全合约);或在加载 pair_cache 时统一做 normalize(如都转为全合约),避免隐式依赖。


3. 孤儿收纳时 close_disabled 仅按币种级过滤

  • 逻辑position_manager.py_collect_orphan_candidates 仅调用 is_close_disabled(coin_to_symbol(coin)),即 base_symbol="",只做币种级禁止平仓检查。
  • 影响:若仅配置了配对级 close_disabled(如 PURR|HYPE),则交易所上残留的 PURR 单腿(例如原 PURR|HYPE 配对中 base 腿已平)仍会被收纳为孤儿;收纳后该仓位 key 为 (PURR/USDC:USDC, ""),平仓时仍不会命中 PURR|HYPE,因此不会被 close_disabled 禁止平仓。从“配对级仅禁止以该配对身份平仓”的语义看,单腿孤儿不再属于该配对,当前行为可接受,但若希望“凡涉及 PURR|HYPE 的腿一律不自动收纳/不自动平仓”,则需要在孤儿候选阶段也能考虑配对级 close_disabled(例如已知 pair 关系时用 (alt, base) 查一次)。

建议:若产品上希望“配对级 close 禁止也影响孤儿”,可在 _collect_orphan_candidates_build_orphan_positions 中,对能解析出配对关系的孤儿用 is_close_disabled(symbol, base_symbol) 再滤一次;否则在文档中说明“close_disabled 配对级仅作用于显式配对仓位,不作用于单腿孤儿”。


三、可改进点(非致命)

4. 策略引擎与配置的 pair_key 展示格式不统一

  • 配置的 pair_strategy_overrides 的 key 为字符串 "ALT|BASE"(如 PURR|HYPE),日志中策略引擎也按 pair_key 打印。
  • 策略内部全部使用 PairKey 元组 (symbol, base_symbol)。日志中若混用 "PURR|HYPE"(symbol, base_symbol) 会略不利于排查。

建议:在日志/告警中统一使用一种人类可读格式(例如统一为 symbol|base_symbolf"{symbol}|{base_symbol or '单币'}"),并在策略初始化等处与 config 的 pair 覆盖键格式保持一致,便于对照配置与行为。


5. 单币模式与空 base_symbol 的传递一致性

  • 全链路已统一用 base_symbol or "" 作为 PairKey 的第二元组,单币模式为 (symbol, "")
  • 配置侧 get_strategy_params(symbol, "") 会正确回退到币种级/全局,不会误用配对级覆盖。暂无发现遗漏,仅建议在对外接口(如 HTTP/CLI)或文档中明确“单币模式即 base_symbol 为空字符串”,避免后续扩展时引入不一致。

6. 数据自愈与配对维度

  • realtime_kline_service_base.py 中数据自愈逻辑会查询“已有 zscore 数据的配对”并与活跃 symbol 取交集,再对 heal_pairs 做补点。若自愈或历史数据中存在 symbol/base_symbol 格式与当前 pair_cache 或 config 不一致(如历史为资产名、当前为全合约),可能漏补或重复键。建议自愈使用的配对列表与 pair_cache/config 使用同一套符号规范化逻辑。

四、总结表

类别 描述 严重程度
双黑名单未统一 分析层不读交易黑名单,可能对已禁止交易的配对继续做分析;两套黑名单语义与运维割裂
pair_cache 键格式 alt_symbol 与 K 线 symbol 格式未强制约定,依赖回测/导入写法,易出现“查不到多 base”
孤儿与配对级 close_disabled 孤儿收纳只按币种级 close_disabled 过滤,配对级仅作用于显式配对仓位
日志/展示格式 配置用 "ALT|BASE",策略用 tuple,可统一为同一可读格式
自愈与符号规范 自愈配对列表与 pair_cache/config 的符号格式若不一致可能影响补数

建议优先:在分析入口增加对交易黑名单的检查(1);明确并统一 cointegrated_pairs 与实时 symbol 的格式约定或 normalize(2)。其余为体验与可维护性改进。

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