4、信号过滤与确认:多指标共振、成交量确认、时间窗口过滤
信号过滤,说白了就是给交易信号「挤水分」。
我刚开始做量化那会儿,总觉得信号越多越好。后来回测一看,胜率惨不忍睹。为什么?因为单个指标太容易骗人了。你想想看,一个金叉信号出来,兴冲冲进场,结果是个假突破,直接被套。
所以,我们需要一套过滤机制。今天聊的这三个方法,是我个人最常用的组合拳。
4.1 多指标共振:让信号「互相验证」
什么叫共振?就是多个独立指标同时指向同一个方向。比如均线金叉的同时,MACD也翻红,RSI也处于强势区。三个指标都说「买」,那这个信号的可靠性就高很多。
我在项目中遇到过最典型的案例:某只股票日线级别出现均线金叉,但MACD还是死叉状态。我当时犹豫了一下,没进场。结果第二天直接一根大阴线砸下来。嗯,这就是典型的「指标背离」,单个指标骗线。
多指标共振的核心逻辑,我总结成一句话:不同维度的指标同时确认,信号置信度指数级提升。
实战经验:我个人习惯用「2+1」原则——至少两个趋势指标(如均线、MACD)加一个震荡指标(如RSI、KDJ)同时确认,才考虑进场。单一指标信号,直接忽略。
下面是一个简单的多指标共振检测代码示例:
def check_resonance(df):
"""
检查多指标共振情况
返回共振强度评分 (0-3分)
"""
score = 0
# 1. 均线共振:短期均线上穿长期均线
if df['ma5'].iloc[-1] > df['ma20'].iloc[-1]:
score += 1
# 2. MACD共振:DIF上穿DEA
if df['macd_dif'].iloc[-1] > df['macd_dea'].iloc[-1]:
score += 1
# 3. RSI共振:RSI处于强势区(>50)
if df['rsi'].iloc[-1] > 50:
score += 1
return score
# 使用示例
resonance_score = check_resonance(data)
if resonance_score >= 2:
print("共振信号确认,可以考虑进场")
else:
print("共振不足,等待更多确认")
小技巧:共振指标不是越多越好。3-4个足矣。指标太多反而容易互相矛盾,导致信号过少,错过行情。
4.2 成交量确认:没有量的信号都是「耍流氓」
成交量是什么?是市场的「真金白银」。价格可以骗人,但成交量很难造假。
我记得有一次,某个币种突然拉了一根大阳线,技术指标全部看多。但我看了一眼成交量——缩量的。当时我就觉得不对劲。果然,第二天直接跌回原形。这就是典型的「无量上涨」,主力拉高出货。
成交量确认的核心逻辑:价格变动必须有成交量配合,否则视为无效信号。
具体怎么用?我一般看两个维度:
- 放量突破:价格突破关键位时,成交量必须明显放大(至少是前5日均量的1.5倍以上)
- 缩量回调:上涨趋势中的回调,成交量应该萎缩,说明抛压不大
下面是一个成交量确认的过滤函数:
def volume_confirm(df, threshold=1.5):
"""
成交量确认过滤
返回True表示成交量确认通过
"""
current_vol = df['volume'].iloc[-1]
avg_vol = df['volume'].iloc[-6:-1].mean() # 前5日均量
vol_ratio = current_vol / avg_vol
if vol_ratio >= threshold:
return True
else:
return False
# 使用示例
if volume_confirm(data, threshold=1.5):
print("成交量确认通过,信号有效")
else:
print("成交量不足,信号过滤掉")
避坑指南:我曾经踩过一个坑——只看绝对成交量,忽略了市场整体环境。牛市的成交量本身就比熊市大。所以建议用「相对成交量」,即当前成交量与近期均量的比值,而不是绝对值。
4.3 时间窗口过滤:别在「垃圾时间」交易
时间窗口过滤,说白了就是「在正确的时间做正确的事」。
你想想看,A股开盘前15分钟和收盘前15分钟,波动剧烈,噪音极大。这时候的信号,可靠性很低。我个人的习惯是:避开开盘后30分钟和收盘前30分钟。
时间窗口过滤的核心逻辑:不同时间段的市场行为特征不同,信号的有效性也不同。
我常用的时间窗口规则:
| 市场 | 有效交易时段 | 过滤时段 | 原因 |
|---|---|---|---|
| A股 | 10:00 - 14:30 | 9:30-10:00, 14:30-15:00 | 开盘/收盘噪音大 |
| 期货 | 开盘后30分钟至收盘前30分钟 | 开盘/收盘前后30分钟 | 跳空缺口和尾盘异动 |
| 加密货币 | 避开整点前后15分钟 | 整点前后15分钟 | 合约交割/资金费率结算 |
代码实现也很简单:
def time_window_filter(timestamp, market='A股'):
"""
时间窗口过滤
返回True表示当前时间允许交易
"""
hour = timestamp.hour
minute = timestamp.minute
if market == 'A股':
# 有效时段:10:00 - 14:30
if (hour == 10 and minute >= 0) or (11 <= hour <= 13) or (hour == 14 and minute <= 30):
return True
else:
return False
elif market == '期货':
# 有效时段:开盘后30分钟至收盘前30分钟
if (hour == 9 and minute >= 30) or (10 <= hour <= 14) or (hour == 15 and minute <= 0):
return True
else:
return False
else:
return True # 默认不过滤
# 使用示例
if time_window_filter(current_time, market='A股'):
print("时间窗口通过,可以执行交易")
else:
print("当前处于过滤时段,信号暂不执行")
个人经验:时间窗口过滤不是死的。如果遇到重大数据发布(比如非农、CPI),我会临时调整窗口。数据发布前后30分钟,所有信号一律过滤——因为这时候市场反应极度情绪化,技术分析基本失效。
4.4 三者结合:完整的信号过滤流程
上面三个方法单独用,效果有限。组合起来,威力才大。我一般按这个顺序执行过滤:
- 第一步:时间窗口过滤——先判断当前是否在有效交易时段
- 第二步:多指标共振——检查多个指标是否同时确认
- 第三步:成交量确认——最后看成交量是否配合
只有三步全部通过,我才执行交易。任何一个环节不通过,直接放弃。
下面是一个完整的过滤流程代码:
def signal_filter_pipeline(df, current_time, market='A股'):
"""
信号过滤流水线
返回 (是否通过, 过滤原因)
"""
# 第一步:时间窗口过滤
if not time_window_filter(current_time, market):
return False, "时间窗口过滤未通过"
# 第二步:多指标共振
resonance_score = check_resonance(df)
if resonance_score < 2:
return False, f"共振不足,当前评分{resonance_score}"
# 第三步:成交量确认
if not volume_confirm(df):
return False, "成交量确认未通过"
return True, "所有过滤通过,信号有效"
# 使用示例
is_valid, reason = signal_filter_pipeline(data, current_time, 'A股')
if is_valid:
print("✅ 信号确认,执行交易")
else:
print(f"❌ 信号过滤,原因:{reason}")
核心总结:信号过滤不是「越多越好」,而是「越精准越好」。多指标共振解决「方向确认」问题,成交量确认解决「真伪辨别」问题,时间窗口过滤解决「时机选择」问题。三者缺一不可。
嗯,这套过滤体系我用了好几年,胜率从原来的40%左右提升到了65%以上。当然,没有完美的系统,但至少能帮你避开大部分明显的坑。