突破、均线与回看期
三种信号,一个家族
Section titled “三种信号,一个家族”通道突破、双均线交叉、时序动量符号看起来是三套技术,数学上都是对过去收益的某种加权和,差别只在权重形状:
- 时序动量:过去 期收益等权求和;
- 双均线交叉:快慢均线之差 = 对近期收益权重递增的线性滤波;
- 通道突破(Donchian):价格是否超过过去 期最高/最低点,等价于对突破段收益的非线性压缩。
统一视角的价值在于:调参就是在挑权重形状。既然三种信号高度相关,就不该把它们当作三种独立策略,而应作为同一信号族的变体做组合,见时序动量。
回看期:不要挑"最优"参数
Section titled “回看期:不要挑"最优"参数”单一回看期的样本外表现极不稳定(12 个月有效不等于明年 12 个月有效)。稳健做法:
- 多周期组合:3、6、12 个月信号等权平均——回看期本身做了分散,参数敏感性立刻下降;
- 连续信号:用 换成连续的强度(如 ),降低信号在零点附近的抖动与换手;
- 参数敏感性测试是稳健性检查而非调参:如果只有某一个回看期显著,信号多半是运气。
均线交叉的滤波视角
Section titled “均线交叉的滤波视角”快慢均线之差可以精确写为历史收益的加权和:
权重在快慢均线窗口间先正后负——这解释了为什么均线交叉天然比简单动量更平滑、滞后更大。
import numpy as npimport 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)量化中的用法
Section titled “量化中的用法”- 多周期等权组合为默认,单周期只做诊断;
- 信号强度连续化并按波动率归一,降低换手;
- 突破、均线、动量不叠加成"三个策略",当作一族做相关性与组合。
- 均线交叉等价于对历史收益的线性滤波
- 多个回看期等权组合优于挑选"最优"参数
- 信号强度连续化(而非 ±1)可降低换手