配对交易中目标代币的 自相关性检测同样不可或缺


有必要添加自相关性检测,但应作为辅助过滤条件,而非必需条件。

当前逻辑分析

从代码看,当前套利机会检测流程是:

        if is_anomaly:
            zscore_result_list = self.zscore_analysis(coin, price_data_cache)
            if not zscore_result_list:
                logger.info(f"❌ Z-score 计算不满足告警条件 | 币种: {coin}")
                return False
            # 找到绝对值最大的元素(保留原符号)
            zscore_result = zscore_result_list[np.argmax(np.abs(zscore_result_list))]
            self._output_results(coin, valid_results, diff_amount, zscore=zscore_result)
            return True

当前只检查了:

  1. 相关系数(> 0.6)
  2. 协整检验(多周期通过)
  3. Z-score(多周期符号一致且超过阈值)

自相关性检测的价值

  1. 正自相关(趋势延续)
    • 若 PURR 处于趋势中,价差可能不会立即回归
    • 可延迟开仓,等待更优时机
  2. 负自相关(均值回归)
    • 价格可能反转,加速价差回归
    • 适合立即开仓
  3. 无显著自相关(随机游走)
    • 符合均值回归假设
    • 当前策略逻辑更有效

建议实现方案

zscore_analysis 方法返回结果后、_output_results 之前,添加自相关性检测:

def _check_autocorrelation(self, alt_prices: pd.Series, coin: str, 
                          window: int = 50, max_lag: int = 5) -> Optional[dict]:
    """
    检测PURR自身价格序列的自相关性
    
    Args:
        alt_prices: PURR价格序列
        coin: 币种名称
        window: 用于计算自相关的窗口大小
        max_lag: 最大延迟阶数
        
    Returns:
        dict: {
            'acf_values': [lag1_acf, lag2_acf, ...],
            'max_acf': 最大自相关系数,
            'max_lag': 最大自相关对应的延迟,
            'is_positive_autocorr': 是否存在显著正自相关,
            'is_negative_autocorr': 是否存在显著负自相关,
            'recommendation': '开仓'/'延迟开仓'/'谨慎开仓'
        }
    """
    from statsmodels.tsa.stattools import acf
    
    if len(alt_prices) < window:
        return None
    
    # 使用最近window期的收益率序列
    recent_prices = alt_prices.iloc[-window:]
    returns = recent_prices.pct_change().dropna()
    
    if len(returns) < max_lag + 10:
        return None
    
    # 计算自相关函数
    acf_values = acf(returns, nlags=max_lag, fft=True)
    
    # 排除lag=0(自身相关,值为1)
    acf_lags = acf_values[1:max_lag+1]
    
    # 找出最大绝对值
    max_abs_idx = np.argmax(np.abs(acf_lags))
    max_acf = acf_lags[max_abs_idx]
    max_lag_value = max_abs_idx + 1
    
    # 判断显著性(使用95%置信区间,约±1.96/sqrt(n))
    n = len(returns)
    significance_threshold = 1.96 / np.sqrt(n)
    
    is_positive = max_acf > significance_threshold
    is_negative = max_acf < -significance_threshold
    
    # 给出建议
    if is_positive and abs(max_acf) > 0.3:
        recommendation = "延迟开仓"  # 趋势延续,等待更好时机
    elif is_negative and abs(max_acf) > 0.3:
        recommendation = "开仓"  # 均值回归,适合开仓
    elif abs(max_acf) < 0.1:
        recommendation = "开仓"  # 无显著自相关,符合随机游走
    else:
        recommendation = "谨慎开仓"  # 弱自相关
    
    return {
        'acf_values': acf_lags.tolist(),
        'max_acf': float(max_acf),
        'max_lag': int(max_lag_value),
        'is_positive_autocorr': is_positive,
        'is_negative_autocorr': is_negative,
        'significance_threshold': float(significance_threshold),
        'recommendation': recommendation
    }

然后在 one_coin_analysis 中调用:

if is_anomaly:
    zscore_result_list = self.zscore_analysis(coin, price_data_cache)
    if not zscore_result_list:
        logger.info(f"❌ Z-score 计算不满足告警条件 | 币种: {coin}")
        return False
    
    # 新增:自相关性检测
    autocorr_result = None
    if len(price_data_cache) > 0:
        # 使用最短周期的价格数据(最敏感)
        shortest_period_key = min(price_data_cache.keys(), 
                                 key=lambda x: self._timeframe_to_minutes(x[0]))
        alt_prices = price_data_cache[shortest_period_key]['alt_prices']
        autocorr_result = self._check_autocorrelation(alt_prices, coin)
        
        if autocorr_result:
            logger.info(
                f"自相关性检测 | 币种: {coin} | "
                f"最大自相关: {autocorr_result['max_acf']:.4f} (lag={autocorr_result['max_lag']}) | "
                f"建议: {autocorr_result['recommendation']}"
            )
            
            # 可选:如果建议延迟开仓,可以降低信号优先级或跳过
            # if autocorr_result['recommendation'] == "延迟开仓":
            #     logger.info(f"⚠️ 自相关检测建议延迟开仓,跳过本次信号 | 币种: {coin}")
            #     return False
    
    zscore_result = zscore_result_list[np.argmax(np.abs(zscore_result_list))]
    self._output_results(coin, valid_results, diff_amount, 
                        zscore=zscore_result, 
                        autocorr_result=autocorr_result)  # 传递自相关结果
    return True

注意事项

  1. 作为辅助指标:不要仅因自相关性就拒绝信号,应结合 Z-score 和协整结果综合判断。
  2. 计算成本:自相关计算较快,但需注意窗口大小。
  3. 参数调优:阈值(如 0.3)需根据回测结果调整。
  4. 多周期验证:可在多个周期上计算自相关,提高稳健性。

总结

  • 有必要添加自相关性检测,用于优化开仓时机。
  • 建议作为辅助过滤,而非硬性条件。
  • 可先实现并记录结果,通过回测评估效果后再决定是否作为过滤条件。

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