Pair Tradability Score(PTS)最小可用版本

很好,这一步问得非常对
因为 MVP 的关键不是“少”,而是“少而不偏”

下面我会直接给你一个可以今天就落地的 Pair Tradability Score(PTS)最小可用版本,它满足:

  • ✅ 覆盖你提出的 5 个维度的“信息核心”
  • 不依赖 ACF / GARCH / KPSS(先别上)
  • ✅ 参数少、解释性强
  • ✅ 能直接接到你现在的 zscore_analysis 流程

一、MVP 设计原则(为什么要这样压缩)

我们先明确一件事:

MVP 的目标不是“评估全面”,而是“防止犯致命错误”

在配对交易里,真正会一票否决一个 pair 的只有三类问题:

  1. 赚不到钱(波动 < 成本)
  2. 钱回不来(回归太慢)
  3. 关系在漂(不稳定)

所以 MVP 必须强约束这三点,其余的(ACF 细节、异方差形态)先降级。


二、MVP 的 5 → 3 → 1 压缩逻辑

原始 5 维度

原维度是否保留MVP 处理方式
平稳性二值 gate(不过直接 reject)
波动幅度连续得分
回归速度连续得分(最重要)
自相关结构暂不显式建模
稳定性轻量 proxy

MVP 实际只算 4 个量

4 个 scalar → 1 个 PTS

三、Pair Tradability Score(MVP)定义

1️⃣ 必要门槛(Gate,不计分)

ADF p < 0.05

不通过:
PTS = 0,直接 reject


2️⃣ 四个核心指标(全部 ∈ [0, 1])


🟦 (A) 波动 / 成本充分性得分 S_vol

直觉:

能不能覆盖手续费,而且不是偶尔一下
vol_cost_ratio = spread_std / round_trip_cost

映射到分数(soft clip):

S_vol = clip( (vol_cost_ratio - 2) / (8 - 2), 0, 1 )

解释:

ratioS_vol
≤20
50.5
≥81

🟦 (B) 回归速度得分 S_mr(最重要)

用你已经实现的 AR(1) 半衰期(小时)

设定一个 理想区间

T_min < half_life < T_max

不是硬 cut,而是钟形得分:

S_mr = exp( - |log(half_life / T_opt)| )

其中:

timeframeT_opt
5m2h
1h12h
4h48h

性质:

  • 太快(噪声)→ 低分
  • 太慢(资金占用)→ 低分
  • 只奖励“刚刚好”

🟦 (C) 稳定性 proxy 得分 S_stab

MVP 不做完整 rolling beta,只用 分段方差稳定性

var_ratio = max(std_1, std_2) / min(std_1, std_2)

映射为:

S_stab = exp( - (var_ratio - 1) )
var_ratioS_stab
1.01.00
1.50.61
2.00.37
≥3~0

🟦 (D) 有效偏离频率得分 S_freq

防止“95% 时间贴着 0 抖动”的假波动:

freq = P(|spread| > 1.5 * spread_std)
S_freq = clip( freq / 0.15 , 0, 1 )

3️⃣ 最终 PTS 聚合(不是平均!)

这是关键。

❌ 不要:

( S_vol + S_mr + S_stab + S_freq ) / 4

✅ 推荐:加权几何平均

PTS = (
    S_vol ** 0.25 *
    S_mr  ** 0.40 *
    S_stab** 0.20 *
    S_freq** 0.15
)

原因:

  • 任一维度接近 0 → PTS 快速塌陷
  • 回归速度权重最大(你工程直觉是对的)

4️⃣ 决策规则(MVP)

PTS ≥ 0.6  → 高质量可交易
0.4–0.6    → 观察 / 降权
< 0.4      → reject

四、MVP 版 compute_pair_tradability_score

def compute_pts_mvp(spread, half_life_hours, timeframe, fee_rate):
    # ---------- A. 波动 / 成本 ----------
    spread_std = spread.std()
    round_trip_cost = fee_rate * 2
    vol_cost_ratio = spread_std / round_trip_cost
    S_vol = np.clip((vol_cost_ratio - 2) / 6, 0, 1)

    # ---------- B. 回归速度 ----------
    T_opt = {'5m': 2, '1h': 12, '4h': 48}.get(timeframe, 12)
    S_mr = np.exp(-abs(np.log(half_life_hours / T_opt)))

    # ---------- C. 稳定性 ----------
    mid = len(spread) // 2
    std1 = spread.iloc[:mid].std()
    std2 = spread.iloc[mid:].std()
    var_ratio = max(std1, std2) / max(min(std1, std2), 1e-8)
    S_stab = np.exp(-(var_ratio - 1))

    # ---------- D. 有效偏离频率 ----------
    freq = (spread.abs() > 1.5 * spread_std).mean()
    S_freq = np.clip(freq / 0.15, 0, 1)

    # ---------- PTS ----------
    pts = (
        S_vol ** 0.25 *
        S_mr  ** 0.40 *
        S_stab** 0.20 *
        S_freq** 0.15
    )

    return {
        'PTS': pts,
        'components': {
            'S_vol': S_vol,
            'S_mr': S_mr,
            'S_stab': S_stab,
            'S_freq': S_freq,
            'vol_cost_ratio': vol_cost_ratio,
            'half_life_hours': half_life_hours,
            'var_ratio': var_ratio,
            'freq': freq
        }
    }

五、为什么这个 MVP 很适合你现在用

✅ 不破坏你现有结构

  • 接在 cointegration_result['spread']
  • 只多一次 AR(1)

✅ 能直接排序 + 筛选

  • 用 PTS 排序所有 pair
  • 选 Top-K 或设阈值

✅ 为 Phase 2 留足接口

以后你可以:

  • 把 ACF 得分并入 S_mr
  • 把 GARCH 并入 S_stab
  • 把 rolling beta 稳定性替换 var_ratio

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