时间序列 phi AR(1) (序列的一阶自相关系数)的用法

phi 的含义

phi 是 AR(1) 模型的系数,表示价差序列的一阶自相关系数:

  • phi < 0:均值回归(负相关,价差会反向调整)
  • phi 越接近 -1:回归倾向越强
  • phi >= 0:无均值回归特性

具体使用场景

1. 动态调整 Z-score 阈值

当前代码使用固定阈值:

ZSCORE_THRESHOLD_LONG = 0.2
ZSCORE_THRESHOLD_MIDDLE = 1.5
ZSCORE_THRESHOLD_SHORT = 1.8

使用 phi 动态调整:

def get_dynamic_zscore_threshold(phi: float, base_threshold: float) -> float:
    """
    根据phi动态调整Z-score阈值
    
    原理:
    - phi越负(如-0.5),回归倾向越强 → 可以降低阈值(更敏感)
    - phi接近0(如-0.1),回归倾向弱 → 需要提高阈值(更保守)
    """
    if phi >= 0:
        # 无回归特性,大幅提高阈值(几乎不开仓)
        return base_threshold * 5.0  
    elif phi <= -0.5:
        # 强回归倾向,可以降低阈值
        return base_threshold * 0.7
    elif phi <= -0.3:
        # 中等回归倾向,略微降低阈值
        return base_threshold * 0.9
    else:
        # 弱回归倾向,提高阈值
        return base_threshold * 1.3

# 使用示例
phi = result['phi']  # 从健康监控结果获取
adjusted_threshold = get_dynamic_zscore_threshold(phi, self.ZSCORE_THRESHOLD_LONG)
if abs(zscore) > adjusted_threshold:
    # 开仓信号

2. 评估交易信号的可靠性

zscore_analysis 方法中,使用 phi 评估信号强度:

def zscore_analysis(self, coin: str, price_data_cache: dict, phi: float = None) -> bool:
    """
    增强版:加入phi评估信号可靠性
    """
    # ... 现有代码 ...
    
    # 如果phi可用,评估信号可靠性
    if phi is not None:
        if phi >= 0:
            # 无回归特性,拒绝所有信号
            logger.warning(f"phi={phi:.3f} >= 0,无均值回归特性,拒绝交易信号 | 币种: {coin}")
            return None
        
        # 计算信号强度系数
        signal_strength = abs(phi)  # phi越负,信号越强
        
        if signal_strength < 0.1:
            logger.warning(f"phi={phi:.3f},回归倾向极弱,信号不可靠 | 币种: {coin}")
            return None
        
        # 根据phi调整阈值
        phi_multiplier = 1.0 / signal_strength  # phi=-0.5时,multiplier=2.0
        adjusted_threshold_long = self.ZSCORE_THRESHOLD_LONG * phi_multiplier
        
        if abs(direction) < adjusted_threshold_long:
            logger.info(f"phi={phi:.3f},调整后阈值={adjusted_threshold_long:.2f},Z-score={direction:.2f}未达标 | 币种: {coin}")
            return None

3. 计算预期持仓时间

phi 与半衰期相关,可用于估算持仓时间:

def estimate_holding_period(phi: float, current_zscore: float) -> float:
    """
    根据phi和当前Z-score估算预期持仓时间
    
    原理:
    - 半衰期 = -log(2) / log(1 + phi)
    - 预期回归到均值的时间 ≈ 半衰期 × log(|zscore|) / log(2)
    """
    if phi >= 0 or phi <= -1:
        return float('inf')  # 无法回归
    
    halflife = -np.log(2) / np.log(1 + phi)
    
    # 估算回归到均值的时间(假设回归到0.5倍标准差)
    target_zscore = 0.5
    if abs(current_zscore) < target_zscore:  
        return 0  # 已经接近均值
    
    # 使用对数衰减模型估算
    periods = halflife * np.log(abs(current_zscore) / target_zscore) / np.log(2)  
    
    return max(1, int(periods))

# 使用示例
phi = result['phi']
current_zscore = 2.5
expected_periods = estimate_holding_period(phi, current_zscore)
logger.info(f"预期持仓时间: {expected_periods} 个周期(基于phi={phi:.3f})")

4. 风险控制:过滤弱回归信号

在开仓前检查 phi

def should_open_position(zscore: float, phi: float, halflife: float) -> tuple[bool, str]:
    """
    综合判断是否应该开仓
    
    Returns:
        (should_open, reason)
    """
    # 检查1:phi必须为负(有回归特性)
    if phi >= 0:
        return False, f"phi={phi:.3f} >= 0,无均值回归特性"
    
    # 检查2:phi不能太接近0(回归倾向太弱)
    if phi > -0.05:
        return False, f"phi={phi:.3f},回归倾向极弱"
    
    # 检查3:半衰期不能太长(回归太慢)
    if halflife > 50:
        return False, f"半衰期={halflife:.1f}期,回归太慢"
    
    # 检查4:Z-score必须足够大
    if abs(zscore) < 1.0:
        return False, f"Z-score={zscore:.2f},偏离不够大"
    
    # 检查5:根据phi调整Z-score要求
    min_zscore = 1.5 / abs(phi)  # phi=-0.3时,需要Z-score>5.0
    if abs(zscore) < min_zscore:
        return False, f"Z-score={zscore:.2f} < 调整后阈值{min_zscore:.2f}"
    
    return True, "所有条件满足"

# 使用示例
health_result = monitor.update(logA, logB)
phi = health_result.get('phi')  # 需要从diagnostics中提取,或提升到主返回
halflife = health_result['halflife']
zscore = self._calculate_zscore(...)

should_open, reason = should_open_position(zscore, phi, halflife)
if should_open:
    # 执行开仓
else:
    logger.info(f"拒绝开仓: {reason}")

5. 仓位管理:根据 phi 调整仓位大小

def calculate_position_size(base_size: float, phi: float, halflife: float) -> float:
    """
    根据phi和半衰期调整仓位大小
    
    原理:
    - phi越负,回归倾向越强 → 可以加大仓位
    - 半衰期越短,回归越快 → 可以加大仓位
    """
    if phi >= 0:
        return 0  # 无回归特性,不开仓
    
    # phi强度系数(0-1)
    phi_strength = min(1.0, abs(phi) / 0.5)  # phi=-0.5时为1.0
    
    # 半衰期系数(半衰期越短,系数越大)
    halflife_coefficient = max(0.3, min(1.0, 10 / halflife))  # 半衰期=10时为1.0
    
    # 综合调整系数
    adjustment = (phi_strength + halflife_coefficient) / 2
    
    return base_size * adjustment

# 使用示例
base_position = 1000  # 基础仓位
adjusted_position = calculate_position_size(base_position, phi, halflife)
logger.info(f"基础仓位: {base_position}, 调整后仓位: {adjusted_position:.0f} (phi={phi:.3f}, halflife={halflife:.1f})")

总结

phi 提升到主返回结果后,可用于:

  1. 动态调整 Z-score 阈值(根据回归强度)
  2. 评估信号可靠性(过滤弱信号)
  3. 估算持仓时间(结合半衰期)
  4. 风险控制(开仓前验证)
  5. 仓位管理(根据回归强度调整仓位)

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