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 信号的生命周期
一个信号从出生到消亡,大概经历这几个阶段:
- 生成:策略计算产生原始信号
- 校验:检查数据合法性(价格不为负、时间戳不异常)
- 过滤:去重、去噪、合并冲突信号
- 存储:写入信号数据库或消息队列
- 分发:推送给风控模块和交易执行模块
- 归档:执行完毕后标记状态,存入历史库
我曾经犯过一个错:跳过了校验步骤。结果某次数据源推送了错误的价格,信号直接按0.001美元买入,差点把账户干穿。从那以后,校验环节我打死都不省。
1.5 信号生成的整体架构
说了这么多,咱们用一张图把整个逻辑串起来:
💡 个人经验:信号架构设计时,一定要预留「元数据」字段。我早期没留,后来想加个「信号来源的模型版本号」,结果要改整个数据管道,折腾了两周。
⚠️ 避坑指南:信号的时间戳一定要用纳秒级精度,别用秒或毫秒。高频场景下,同一秒内可能生成多个信号,精度不够会导致信号覆盖或乱序。我曾经因为这个原因,在回测里漏掉了3%的盈利信号。
1.6 小结
信号源头这事,说难不难,说简单也不简单。核心就三点:
- 逻辑要清晰:规则、模型、混合,选适合你的路子
- 结构要统一:字段名、类型、含义,定下来就别改
- 流程要完整:生成→校验→过滤→存储→分发,一步都不能少
我见过太多人在这上面栽跟头。信号源头稳了,后面的执行才能稳。下一节咱们聊聊信号怎么从策略代码里「走出来」,进入真正的交易管道。
公众号:蓝海资料掘金营,微信deep3321