均线系统策略

均线系统策略是量化交易中最常用的趋势跟踪方法之一,基于移动平均线(Moving Average)捕捉价格趋势的变化。均线通过平滑价格数据,过滤市场噪音,帮助交易者识别价格趋势。

常见均线类型

简单移动平均线 (SMA)

对过去N个时间周期的价格进行等权重平均:

def sma(prices, window):
    return prices.rolling(window=window).mean()

指数移动平均线 (EMA)

赋予近期价格更高权重的平均方法:

def ema(prices, span):
    return prices.ewm(span=span, adjust=False).mean()

加权移动平均线 (WMA)

使用线性递减权重的平均方法:

def wma(prices, window):
    weights = np.arange(1, window + 1)
    return prices.rolling(window=window).apply(
        lambda x: np.sum(weights * x) / weights.sum(), raw=True
    )

自适应移动平均线 (AMA)

根据市场波动性动态调整参数的平均线:

def kama(prices, er_window=10, fast_span=2, slow_span=30):
    # 计算效率比率(ER)
    change = abs(prices - prices.shift(er_window))
    volatility = prices.diff().abs().rolling(window=er_window).sum()
    er = change / volatility
    
    # 计算平滑常数(SC)
    sc = (er * (2/(fast_span+1) - 2/(slow_span+1)) + 2/(slow_span+1)) ** 2
    
    # 计算KAMA
    kama = np.zeros_like(prices)
    kama[er_window] = prices[er_window]
    for i in range(er_window + 1, len(prices)):
        kama[i] = kama[i-1] + sc[i] * (prices[i] - kama[i-1])
    
    return pd.Series(kama, index=prices.index)

基本交易策略

价格穿越均线策略

最简单的均线策略是基于价格与均线的相对位置:

def price_crossover_signals(prices, ma_window=50):
    ma = sma(prices, ma_window)
    
    # 生成信号
    signals = pd.Series(0, index=prices.index)
    
    # 价格上穿均线:买入信号
    signals[(prices > ma) & (prices.shift(1) <= ma.shift(1))] = 1
    
    # 价格下穿均线:卖出信号
    signals[(prices < ma) & (prices.shift(1) >= ma.shift(1))] = -1
    
    return signals

双均线策略

使用两条不同周期的均线产生交易信号:

def dual_ma_signals(prices, fast_window=20, slow_window=50):
    fast_ma = sma(prices, fast_window)
    slow_ma = sma(prices, slow_window)
    
    # 生成信号
    signals = pd.Series(0, index=prices.index)
    
    # 快线上穿慢线:买入信号
    signals[(fast_ma > slow_ma) & (fast_ma.shift(1) <= slow_ma.shift(1))] = 1
    
    # 快线下穿慢线:卖出信号
    signals[(fast_ma < slow_ma) & (fast_ma.shift(1) >= slow_ma.shift(1))] = -1
    
    return signals

三均线策略

结合短、中、长期三条均线确认趋势方向:

def triple_ma_signals(prices, short_window=5, mid_window=20, long_window=60):
    short_ma = sma(prices, short_window)
    mid_ma = sma(prices, mid_window)
    long_ma = sma(prices, long_window)
    
    # 生成信号
    signals = pd.Series(0, index=prices.index)
    
    # 多头排列(短期>中期>长期):买入信号
    long_condition = (short_ma > mid_ma) & (mid_ma > long_ma)
    
    # 空头排列(短期<中期<长期):卖出信号
    short_condition = (short_ma < mid_ma) & (mid_ma < long_ma)
    
    # 仅在排列状态改变时产生信号
    signals[long_condition & ~long_condition.shift(1).fillna(False)] = 1
    signals[short_condition & ~short_condition.shift(1).fillna(False)] = -1
    
    return signals

高级策略优化

MACD (移动平均线收敛散度)

MACD是结合两条EMA的动量振荡指标:

def calculate_macd(prices, fast_span=12, slow_span=26, signal_span=9):
    # 计算快线和慢线
    fast_ema = ema(prices, fast_span)
    slow_ema = ema(prices, slow_span)
    
    # 计算MACD线和信号线
    macd_line = fast_ema - slow_ema
    signal_line = ema(macd_line, signal_span)
    
    # 计算柱状图
    histogram = macd_line - signal_line
    
    return macd_line, signal_line, histogram

乖离率 (BIAS)

价格与均线的偏离程度,用于判断超买超卖:

def calculate_bias(prices, window=20):
    ma = sma(prices, window)
    bias = (prices - ma) / ma * 100
    return bias

平均线带宽

使用多条移动平均线形成价格通道:

def ma_channel(prices, window=20, num_stds=2):
    ma = sma(prices, window)
    std = prices.rolling(window=window).std()
    
    upper_band = ma + num_stds * std
    lower_band = ma - num_stds * std
    
    return ma, upper_band, lower_band

参数选择与优化

均线策略的关键参数包括:

  1. 均线周期

    • 短期均线(5-20):对价格变动更敏感,更适合短线交易
    • 中期均线(20-60):平衡敏感度和稳定性,适合中线交易
    • 长期均线(60-200):更稳定,适合识别主要趋势,适合长线投资
  2. 均线类型

    • SMA:稳定但滞后较大
    • EMA:响应较快但可能产生更多假信号
    • KAMA:自适应性好但计算复杂

均线策略的市场适应性

均线策略在不同市场环境中表现差异明显:

  1. 趋势市场:均线策略表现优异,特别是强趋势阶段
  2. 震荡市场:容易产生频繁假信号,表现较差
  3. 突发性市场:大幅跳空可能导致严重滑点

策略增强方法

均线结合量能确认

将均线信号与交易量指标结合提高可靠性:

def volume_confirmed_ma_signals(prices, volumes, ma_window=50):
    ma = sma(prices, ma_window)
    vol_ma = sma(volumes, ma_window)
    
    # 基本均线信号
    signals = pd.Series(0, index=prices.index)
    price_cross_up = (prices > ma) & (prices.shift(1) <= ma.shift(1))
    price_cross_down = (prices < ma) & (prices.shift(1) >= ma.shift(1))
    
    # 量能确认
    volume_confirm = volumes > vol_ma
    
    # 最终信号:仅在量能确认时产生信号
    signals[price_cross_up & volume_confirm] = 1
    signals[price_cross_down & volume_confirm] = -1
    
    return signals

均线结合震荡指标

将均线与RSI等震荡指标结合,减少震荡市场假信号:

def ma_rsi_combined_signals(prices, ma_window=50, rsi_window=14):
    ma = sma(prices, ma_window)
    
    # 计算RSI
    delta = prices.diff()
    gain = delta.clip(lower=0)
    loss = -delta.clip(upper=0)
    avg_gain = gain.rolling(window=rsi_window).mean()
    avg_loss = loss.rolling(window=rsi_window).mean()
    rs = avg_gain / avg_loss
    rsi = 100 - (100 / (1 + rs))
    
    # 生成信号
    signals = pd.Series(0, index=prices.index)
    
    # 买入:价格上穿均线且RSI>50(上升动能)
    signals[(prices > ma) & (prices.shift(1) <= ma.shift(1)) & (rsi > 50)] = 1
    
    # 卖出:价格下穿均线且RSI<50(下降动能)
    signals[(prices < ma) & (prices.shift(1) >= ma.shift(1)) & (rsi < 50)] = -1
    
    return signals

与其他策略的结合

均线策略通常作为趋势确认工具与其他策略结合:

实际应用案例

以下是一个完整的均线系统策略示例:

def adaptive_ma_system(prices, volumes, short_window=10, mid_window=50, long_window=200):
    # 计算均线
    short_ma = ema(prices, short_window)
    mid_ma = sma(prices, mid_window)
    long_ma = sma(prices, long_window)
    
    # 计算市场状态(趋势强度)
    trend_strength = abs(short_ma - long_ma) / prices * 100
    
    # 计算交易量确认
    vol_ma = sma(volumes, mid_window)
    vol_confirm = volumes > vol_ma
    
    # 根据趋势强度调整策略
    signals = pd.Series(0, index=prices.index)
    
    # 强趋势市场:使用单均线突破
    strong_trend = trend_strength > 5  # 5%阈值可根据资产调整
    
    # 弱趋势/震荡市场:使用双均线交叉策略
    weak_trend = ~strong_trend
    
    # 强趋势信号
    strong_buy = (prices > mid_ma) & (prices.shift(1) <= mid_ma.shift(1)) & strong_trend
    strong_sell = (prices < mid_ma) & (prices.shift(1) >= mid_ma.shift(1)) & strong_trend
    
    # 弱趋势信号
    weak_buy = (short_ma > mid_ma) & (short_ma.shift(1) <= mid_ma.shift(1)) & weak_trend
    weak_sell = (short_ma < mid_ma) & (short_ma.shift(1) >= mid_ma.shift(1)) & weak_trend
    
    # 最终信号,加入交易量确认
    signals[((strong_buy | weak_buy) & vol_confirm)] = 1
    signals[((strong_sell | weak_sell) & vol_confirm)] = -1
    
    return signals