全系统key配对升级 bug14

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

本文档记录在全系统 Key 已改为 (symbol, base_symbol) 配对维度后,当前仍存在的缺陷与不足,涵盖数据库、脚本、统计与一致性四类问题。


一、当前已正确落地的部分(简要)

  • 核心交易链路position_manager.pystrategy.pyorchestrator.pytrade_repository.py 的仓位/信号/策略状态均按 PairKey = (symbol, base_symbol) 存储与查询。
  • 库表与迁移trading_signalspair_positionsanalysis_results 均有 symbol+base_symbol20260219_fix_pairkey_indexes.sql 已把索引与压缩分段统一为 PairKey。
  • 黑名单与配置symbol_blacklist 表与 BlacklistRepository(symbol, base_symbol) 读写;配置层 is_symbol_allowed / is_close_disabled 支持币种级与配对级。
  • 实时服务:配对缓存 alt → [bases],分析循环对每个 base_sym 调用 _analyze_and_alert(..., base_symbol=base_sym),写入分析结果时带 base_symbol
  • 数据自愈data_healing/orchestrator.py 使用 (self.symbol, self.base_symbol) 查询 analysis_results

二、缺陷与不足

1. 历史压缩 Chunk 与 PairKey 不一致

位置database/migrations/20260219_fix_pairkey_indexes.sql 末尾说明。

问题:仅新写入的数据会按 (symbol, base_symbol) 分段压缩;已压缩的历史 chunk 仍使用旧分段方式(若此前为 symbol 单列分段,则与当前设计不一致)。

影响:历史数据压缩段内可能混多个 base,按配对查询/压缩效率与语义不完全一致;新 chunk 与旧 chunk 行为不一致。

建议:若需全库一致,对受影响的 hypertable 执行 decompress_chunk + 再 compress_chunk(或按 TimescaleDB 文档做 chunk 重压),并评估 I/O 与锁;或在文档中明确“仅新数据为 PairKey 压缩”的边界。


2. 分析/回测/脚本中 analysis_results 未按配对查询

问题:多处对 analysis_results 的查询仍只按 symbol 过滤,未带 base_symbol。同一 symbol 对应多个 base 时,会混用不同配对的数据,与“全系统 Key 为配对维度”不一致。

典型位置与修改方向

文件 说明
src/scripts/backtest_base.py fetch_analysis_data()WHERE symbol = %s,回测若支持多配对需增加 base_symbol 参数并条件
src/scripts/backfill_analysis_results.py get_existing_kline_times()WHERE symbol = %s,补数若按配对跑需传入并过滤 base_symbol
src/scripts/query_analyze_result/query_eth_zscore.py WHERE symbol = %s,应按配对查询或明确“单 symbol 聚合”的语义
src/scripts/query_analyze_result/query_purr_zscore.py 同上
src/scripts/query_analyze_result/check_missing_purr_zscore.py 同上
src/scripts/query_analyze_result/check_buffer_continuity.py WHERE symbol = %s AND zscore_4h IS NOT NULL,若按配对校验需加 base_symbol
src/scripts/fix_buffer_loading.py WHERE symbol = %s AND zscore_4h IS NOT NULL,同上
src/scripts/optimize_adaptive_zscore.py / optimize_adaptive_zscore_v2.py 查询 analysis 仅按 symbol,优化结果应按配对解读或按配对查询
src/scripts/validate_data_consistency.py 多处 AND symbol = %s,若校验“按配对一致”需增加 base_symbol 条件

建议

  • 凡“按配对”的统计/回测/补数/校验,统一改为 WHERE symbol = %s AND base_symbol = %s(或等价),并对外接口增加 base_symbol 参数(或明确脚本仅单配对使用)。
  • 若部分脚本故意做“单 symbol 多 base 聚合”,在注释或文档中写明,避免与配对维度混淆。

3. daily_trading_stats 无配对维度

位置database/init_timescaledb.sqldaily_trading_stats,主键 (stat_date, network)trade_repository.pyupdate_daily_stats() 仅按日+网络累加。

问题:无 symbol/base_symbol 或等价配对字段,无法按配对做每日统计(如每配对信号数、开平次数、实现盈亏)。

影响:运营/风控无法按配对做日报或历史对比;与“全系统 Key 为配对维度”的统计视角不统一。

建议(二选一或组合):

  • 若需按配对统计:增加“配对每日统计”表(例如 daily_pair_stats(stat_date, network, symbol, base_symbol, ...)),并在信号/成交写库时更新;或
  • 保持现有表为“全局汇总”,在文档中明确“日报为全局维度,不做配对拆分”,并在需要时通过 trading_signals / pair_positions 等按配对聚合做离线报表。

4. 孤儿收纳时 is_close_disabled 的语义

位置position_manager.py_collect_orphan_candidates() 调用 is_close_disabled(coin_to_symbol(coin)),仅传了 symbol(等价于 base_symbol="")。

现状:对“真孤儿”(单腿、无配对)而言,用“该 symbol 是否禁止平仓”是合理的(币种级)。

潜在不足:若后续把“配对孤儿”(交易所有两腿但 DB 无记录)也通过同一路径收纳,是否应传 (original_alt, original_base) 需再确认,以符合配对级 close_disabled 的语义。

建议:在注释中写明“当前仅用于单腿孤儿,等价于 base_symbol=''”;若以后支持配对孤儿收纳,在此处改为传入配对并调用 is_close_disabled(symbol, base_symbol)


5. 索引命名与 analysis_results 无 timeframe 列

位置database/init_timescaledb.sql 中索引 idx_analysis_results_symbol_timeframe 建在 (symbol, base_symbol, analysis_time DESC)

问题analysis_results 表并无 timeframe 列,实际是 PairKey + 时间;索引名易让人误以为按“周期”区分。

建议:将索引重命名为例如 idx_analysis_results_pair_time,并在迁移或 init 中统一(若存在多处创建需一并改),避免后续维护误解。


6. trade_orders 压缩维度与配对的关系

位置database/init_timescaledb.sqltrade_orders 压缩分段为 coin

说明:订单表无 symbol/base_symbol,通过 position_id 关联 pair_positions;按 coin 压缩是合理的设计选择,并非错误。

建议:若希望“按配对查某段时间订单”,需通过 position_id → pair_positions(symbol, base_symbol) 做 JOIN;在架构/文档中注明“订单表不存配对键,配对维度通过仓位表关联”即可。


7. 小结与优先级建议

flowchart LR
  subgraph high [高优先级]
    A[脚本 analysis_results 按配对查询]
    B[历史压缩 chunk 一致性策略]
  end
  subgraph mid [中优先级]
    C[daily_trading_stats 是否按配对]
    D[索引命名与文档]
  end
  subgraph low [低优先级]
    E[孤儿收纳 close_disabled 注释]
  end
  A --> C
  B --> D
  • :统一所有“按配对”的 analysis 查询与回测/补数/校验脚本(避免多 base 混用);明确历史压缩 chunk 的处理策略(重压或文档约定)。
  • :决定是否需要按配对的每日统计并落地表或聚合方式;修正 idx_analysis_results_* 命名并补充说明。
  • :在孤儿收纳处补充 is_close_disabled 的语义注释,便于后续扩展配对孤儿逻辑。

以上为当前系统在“全系统 Key 改为配对维度”之后仍存在的缺陷与不足,以及可执行的改进方向。

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