跳转到内容

突破、均线与回看期

通道突破、双均线交叉、时序动量符号看起来是三套技术,数学上都是对过去收益的某种加权和,差别只在权重形状:

  • 时序动量:过去 LL 期收益等权求和;
  • 双均线交叉:快慢均线之差 = 对近期收益权重递增的线性滤波;
  • 通道突破(Donchian):价格是否超过过去 LL 期最高/最低点,等价于对突破段收益的非线性压缩。

统一视角的价值在于:调参就是在挑权重形状。既然三种信号高度相关,就不该把它们当作三种独立策略,而应作为同一信号族的变体做组合,见时序动量。

单一回看期的样本外表现极不稳定(12 个月有效不等于明年 12 个月有效)。稳健做法:

  1. 多周期组合:3、6、12 个月信号等权平均——回看期本身做了分散,参数敏感性立刻下降;
  2. 连续信号:用 sign\mathrm{sign} 换成连续的强度(如 rt−L→t/σ^tr_{t-L\to t}/\hat\sigma_t),降低信号在零点附近的抖动与换手;
  3. 参数敏感性测试是稳健性检查而非调参:如果只有某一个回看期显著,信号多半是运气。

快慢均线之差可以精确写为历史收益的加权和:

MAn−MAm=∑k=1mwk rt+1−k,wk=m−k+1m−n−k+1n  (k≤n).\mathrm{MA}_n - \mathrm{MA}_m = \sum_{k=1}^{m} w_k\, r_{t+1-k}, \qquad w_k = \frac{m-k+1}{m} - \frac{n-k+1}{n}\ \ (k \le n).

权重在快慢均线窗口间先正后负——这解释了为什么均线交叉天然比简单动量更平滑、滞后更大。

trend-signals.py
import numpy as np
import pandas as pd
def trend_signal(prices: pd.Series, lookbacks: tuple = (63, 126, 252)) -> pd.Series:
"""多周期时序动量的等权组合(连续强度),日频 lookback 近似 3/6/12 个月"""
sigs = []
for L in lookbacks:
r_L = prices.pct_change(L).shift(1) # 过去 L 日累计收益
vol = prices.pct_change().rolling(L).std().shift(1) * np.sqrt(L)
sigs.append((r_L / vol).clip(-3, 3))
return pd.concat(sigs, axis=1).mean(axis=1)
  • 多周期等权组合为默认,单周期只做诊断;
  • 信号强度连续化并按波动率归一,降低换手;
  • 突破、均线、动量不叠加成"三个策略",当作一族做相关性与组合。
  • 均线交叉等价于对历史收益的线性滤波
  • 多个回看期等权组合优于挑选"最优"参数
  • 信号强度连续化(而非 ±1)可降低换手