1. 信号源头:策略信号的生成逻辑与数据结构

做量化交易这些年,我见过太多人一上来就研究下单接口、搞回测框架。但说实话,真正决定你赚钱还是亏钱的,是信号源头——策略信号怎么来的,长什么样,怎么存。

信号源头要是歪了,后面再漂亮的执行都是白搭。我自己就踩过这个坑,所以今天咱们好好聊聊这个基础中的基础。

1.1 策略信号到底是什么?

说白了,策略信号就是「什么时候该做什么事」的指令。它告诉你的交易系统:在哪个时间点,对哪个标的,做什么方向的操作,做多少

我习惯把信号拆成三个层次:

  • 原始信号:策略计算出来的裸数值,比如「RSI = 72.5」
  • 决策信号:经过规则过滤后的结果,比如「RSI > 70 → 卖出」
  • 执行信号:最终发给交易引擎的指令,包含价格、数量、订单类型

嗯,这里要注意:很多新手直接把原始信号当执行信号用,结果就是频繁交易、滑点吃死。我早期一个策略就是吃了这个亏,回测年化80%,实盘直接腰斩。

1.2 信号生成的核心逻辑

信号怎么来的?无非三种路子:

1.2.1 基于规则的信号

这是最传统的方式。你写死条件,满足就触发。比如:

if ma5 > ma20 and volume > volume_ma5 * 1.5:
    signal = 'BUY'
    confidence = 0.7
else:
    signal = 'HOLD'
    confidence = 0.3

我在项目中遇到过一个问题:规则写多了,信号之间互相打架。比如均线金叉说买,但布林带说超买。后来我加了个「信号优先级表」,才把这事理顺。

1.2.2 基于模型的信号

机器学习、深度学习现在很火。模型输出一个概率值,你设个阈值:

# 假设模型返回 [0.2, 0.8] 表示 [不涨, 涨]
prob_up = model.predict(features)[1]
if prob_up > 0.65:
    signal = 'BUY'
    strength = prob_up  # 信号强度直接用概率

你想想看,模型信号有个好处——它自带置信度。但坑也明显:模型会过拟合。我见过有人用LSTM预测涨跌,回测准确率85%,实盘直接变抛硬币。

1.2.3 混合信号

我个人最推荐的方式。规则做风控,模型做预测,两者结合:

if model_prob > 0.6 and rule_check() == True:
    signal = 'BUY'
elif model_prob > 0.6 and rule_check() == False:
    signal = 'WATCH'  # 观望,不执行
else:
    signal = 'HOLD'

1.3 信号的数据结构设计

信号生成出来,总得有个地方装。我见过最糟糕的做法:用Python字典随手一扔,字段名都不统一。结果就是后面解析代码写得比策略还长。

我建议用统一的数据结构,比如这样:

字段名 类型 说明 示例
timestamp int64 信号生成时间戳(纳秒) 1700000000000000000
symbol string 交易标的代码 "BTC-USDT"
direction string 信号方向 "BUY" / "SELL" / "HOLD"
strength float 信号强度 [0, 1] 0.75
price float 触发时的参考价格 42000.50
volume float 建议交易量(手/币) 0.1
source string 信号来源策略ID "ma_cross_v1"
metadata json 额外信息(指标值等) {"ma5": 100, "ma20": 95}

核心原则:信号数据结构一旦确定,就不要轻易改。我见过一个团队改了3次字段名,结果历史信号全废了,回测对不上实盘。

1.4 信号的生命周期

一个信号从出生到消亡,大概经历这几个阶段:

  1. 生成:策略计算产生原始信号
  2. 校验:检查数据合法性(价格不为负、时间戳不异常)
  3. 过滤:去重、去噪、合并冲突信号
  4. 存储:写入信号数据库或消息队列
  5. 分发:推送给风控模块和交易执行模块
  6. 归档:执行完毕后标记状态,存入历史库

我曾经犯过一个错:跳过了校验步骤。结果某次数据源推送了错误的价格,信号直接按0.001美元买入,差点把账户干穿。从那以后,校验环节我打死都不省。

1.5 信号生成的整体架构

说了这么多,咱们用一张图把整个逻辑串起来:

策略信号生成与流转架构图 📡 数据源 行情 / 订单簿 / 新闻 ⚙️ 策略引擎 规则 / 模型 / 混合 📊 信号生成 原始 → 决策 → 执行 🔍 校验 & 过滤 去重 / 去噪 / 合法性 💾 存储 & 分发 数据库 / 消息队列 🚀 交易执行 反馈回路(风控 / 日志) 数据层 计算层 信号层 风控层

💡 个人经验:信号架构设计时,一定要预留「元数据」字段。我早期没留,后来想加个「信号来源的模型版本号」,结果要改整个数据管道,折腾了两周。

⚠️ 避坑指南:信号的时间戳一定要用纳秒级精度,别用秒或毫秒。高频场景下,同一秒内可能生成多个信号,精度不够会导致信号覆盖或乱序。我曾经因为这个原因,在回测里漏掉了3%的盈利信号。

1.6 小结

信号源头这事,说难不难,说简单也不简单。核心就三点:

  • 逻辑要清晰:规则、模型、混合,选适合你的路子
  • 结构要统一:字段名、类型、含义,定下来就别改
  • 流程要完整:生成→校验→过滤→存储→分发,一步都不能少

我见过太多人在这上面栽跟头。信号源头稳了,后面的执行才能稳。下一节咱们聊聊信号怎么从策略代码里「走出来」,进入真正的交易管道。


公众号:蓝海资料掘金营,微信deep3321