均线系统策略
均线系统策略是量化交易中最常用的趋势跟踪方法之一,基于移动平均线(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
参数选择与优化
均线策略的关键参数包括:
-
均线周期:
- 短期均线(5-20):对价格变动更敏感,更适合短线交易
- 中期均线(20-60):平衡敏感度和稳定性,适合中线交易
- 长期均线(60-200):更稳定,适合识别主要趋势,适合长线投资
-
均线类型:
- SMA:稳定但滞后较大
- EMA:响应较快但可能产生更多假信号
- KAMA:自适应性好但计算复杂
均线策略的市场适应性
均线策略在不同市场环境中表现差异明显:
- 趋势市场:均线策略表现优异,特别是强趋势阶段
- 震荡市场:容易产生频繁假信号,表现较差
- 突发性市场:大幅跳空可能导致严重滑点
策略增强方法
均线结合量能确认
将均线信号与交易量指标结合提高可靠性:
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