时间序列 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 提升到主返回结果后,可用于:
- 动态调整 Z-score 阈值(根据回归强度)
- 评估信号可靠性(过滤弱信号)
- 估算持仓时间(结合半衰期)
- 风险控制(开仓前验证)
- 仓位管理(根据回归强度调整仓位)