信号生成逻辑:从阈值触发到多条件组合

信号生成,说白了就是告诉交易系统「什么时候该动手」。我做了这么多年量化,见过太多策略死在信号生成这步——要么太敏感频繁交易,要么太迟钝错过行情。今天咱们就把这块掰开揉碎了讲。

一、基于阈值的信号生成

这是最基础、也最常用的方法。设定一个数值门槛,价格或指标穿过去,就触发信号。

简单阈值:比如RSI低于30买入,高于70卖出。我在项目中遇到过,这种策略在震荡市里表现还行,但趋势行情里容易反复打脸。

核心逻辑:价格突破某个固定数值或动态数值时触发。

# 简单阈值示例
def simple_threshold(price, upper=100, lower=80):
    if price > upper:
        return 'sell'
    elif price < lower:
        return 'buy'
    else:
        return 'hold'

动态阈值:用移动平均线、布林带等动态计算阈值。我个人习惯用布林带上下轨作为动态阈值,比固定数值更适应市场变化。

我的经验:动态阈值在趋势行情里表现更好,但参数选择很关键。我建议先用历史数据回测,找到最优参数区间。

二、交叉信号

交叉信号是量化交易里最经典的模式之一。两条线交叉,金叉买入,死叉卖出。

均线交叉:短期均线上穿长期均线,买入;下穿则卖出。嗯,这里要注意:均线周期选择直接影响信号质量。我试过5日/20日组合,也试过10日/60日组合,没有绝对的好坏,关键看交易标的的特性。

# 均线交叉信号
def ma_cross(short_ma, long_ma):
    if short_ma[-1] > long_ma[-1] and short_ma[-2] <= long_ma[-2]:
        return 'buy'
    elif short_ma[-1] < long_ma[-1] and short_ma[-2] >= long_ma[-2]:
        return 'sell'
    return 'hold'

指标交叉:比如MACD的快线穿过慢线,或者KDJ的K线穿过D线。我曾经用MACD金叉死叉做日内交易,效果还不错,但要注意滞后性——信号出来时,行情可能已经走了一半。

避坑指南:交叉信号在盘整行情里会频繁出现假信号。我建议配合趋势过滤器使用,比如只在均线多头排列时做多。

三、多条件组合信号

单一信号容易出错,组合多个条件能提高胜率。说白了,就是让多个指标「投票」,多数同意才执行。

AND逻辑:所有条件同时满足才触发。比如:RSI低于30 AND 价格站上20日均线 AND 成交量放大。这种组合信号胜率高,但交易机会少。

OR逻辑:任一条件满足就触发。比如:价格突破布林带上轨 OR RSI高于80。这种信号多,但假信号也多。

组合方式 特点 适用场景
AND 高胜率,低频率 趋势确认、大级别行情
OR 低胜率,高频率 短线交易、震荡行情
加权投票 灵活可控 多因子模型
# 多条件组合示例
def multi_condition_signal(rsi, ma_status, volume_ratio):
    conditions = 0
    if rsi < 30:
        conditions += 1
    if ma_status == 'bullish':
        conditions += 1
    if volume_ratio > 1.5:
        conditions += 1
    
    if conditions >= 2:  # 至少两个条件满足
        return 'buy'
    return 'hold'

我的建议:组合条件不要超过4个,否则信号太少,策略容易「饿死」。我一般用2-3个核心条件,再加1个过滤条件。

四、信号平滑与去噪

原始信号往往毛刺很多,直接使用会导致频繁交易。信号平滑就是把这些毛刺去掉,让信号更「干净」。

移动平均平滑:对信号本身做移动平均。比如把连续5个信号做平均,大于0.5才触发。我在项目中遇到过,这种方法简单有效,但会引入延迟。

# 信号平滑示例
def signal_smoothing(signals, window=3):
    smoothed = []
    for i in range(len(signals)):
        if i < window:
            smoothed.append(signals[i])
        else:
            avg = sum(signals[i-window:i]) / window
            smoothed.append(1 if avg > 0.5 else 0)
    return smoothed

中值滤波:取窗口内的中位数作为当前信号。这种方法对异常值不敏感,比移动平均更鲁棒。我建议在信号毛刺特别多的时候用中值滤波。

状态机去噪:设定一个「确认次数」,信号连续出现N次才触发。比如连续3根K线都发出买入信号,才真正执行买入。这种方法能有效过滤假信号,但会错过急涨急跌的行情。

避坑指南:我曾经在回测里用移动平均平滑,参数设得太大,结果信号延迟了10个周期,策略收益直接腰斩。平滑参数一定要根据交易频率来调整。

知识体系总览

下面这张图把信号生成的整个逻辑串起来了,你可以对照着看:

信号生成逻辑知识体系 信号生成逻辑 基于阈值的信号 交叉信号 多条件组合信号 信号平滑与去噪 简单阈值 动态阈值 均线交叉 指标交叉 AND逻辑 OR逻辑 移动平均 中值滤波 状态机去噪 四种信号生成方式各有优劣,实际策略中常混合使用 核心原则:信号质量 > 信号数量

信号生成这块,说白了就是「质量优先」。我见过太多人追求信号数量,结果策略回测漂亮,实盘一塌糊涂。记住:一个高质量的信号,胜过十个平庸的信号。

核心总结:阈值信号简单直接,交叉信号经典可靠,多条件组合提高胜率,平滑去噪减少毛刺。把这四块吃透了,信号生成这块基本就稳了。

专注资料整理