4. 信号生成模块:基于盘口异动的信号、基于成交量加权的信号、基于时间优先级的信号
信号生成模块,是整个抢单策略的「眼睛」和「耳朵」。
说白了,你得先看到机会,才能去抢。我见过不少新手,一上来就研究怎么下单快、怎么改参数,结果信号本身就有问题——那后面全是白费功夫。
这一章,咱们把三种最核心的信号生成方式掰开揉碎了讲。每一种我都踩过坑,也都有优化心得。
4.1 基于盘口异动的信号
盘口异动,就是买卖挂单突然出现剧烈变化。比如买一挂单从100手瞬间变成1000手,或者卖一被一口吃掉。
为什么会这样?通常是大资金在行动。他们不想慢慢磨,直接一把梭。
核心逻辑:
- 监控买一、卖一、买二、卖二等关键价位的挂单量
- 计算挂单量的变化率(delta)
- 设定阈值,超过阈值就触发信号
我个人的习惯是,不光看绝对变化量,还要看相对变化率。举个例子:
- 买一从100手变成500手,变化率400%
- 买一从1000手变成1400手,变化率40%
前者虽然绝对量小,但异动更剧烈,往往更值得关注。
我曾经在实盘中吃过亏——只设了绝对阈值,结果遇到大单撤单再挂,反复触发信号,导致频繁交易。后来我加了一个「冷却期」:同一方向、同一价位的异动,5秒内只触发一次。
// 伪代码示例:盘口异动检测
function detectOrderBookAnomaly(bidLevels, threshold) {
let currentBidQty = bidLevels[0].qty;
let prevBidQty = bidLevels[0].prevQty;
let changeRate = (currentBidQty - prevBidQty) / prevBidQty;
if (changeRate > threshold && !cooldownActive) {
return { signal: 'BUY', strength: changeRate };
}
return null;
}
4.2 基于成交量加权的信号
成交量加权信号,说白了就是「用钱投票」的结果。
盘口异动可能被虚假挂单欺骗,但成交量是实打实的成交。你想想看,大资金要进场,不可能完全不留下痕迹。
核心指标:
| 指标 | 含义 | 我常用的参数 |
|---|---|---|
| VWAP(成交量加权均价) | 按成交量加权的平均成交价 | 5分钟窗口 |
| 成交量突变率 | 当前成交量 vs 过去N周期均值 | N=20,阈值=3倍标准差 |
| 大单成交占比 | 单笔超过阈值的手数占比 | 阈值=50手(视品种调整) |
我记得有一次做回测,发现VWAP信号在震荡市里表现很差。后来我加了一个「趋势过滤」:只有价格在VWAP上方运行时,才启用买入信号。效果立竿见影。
成交量加权信号最好和盘口异动信号配合使用。盘口异动负责「发现」,成交量加权负责「确认」。两者同时触发时,信号质量会高很多。
// 成交量突变检测
function detectVolumeSpike(currentVolume, volumeHistory) {
let mean = volumeHistory.reduce((a,b) => a+b) / volumeHistory.length;
let std = Math.sqrt(volumeHistory.map(v => Math.pow(v-mean,2)).reduce((a,b)=>a+b) / volumeHistory.length);
if (currentVolume > mean + 3 * std) {
return { signal: 'VOLUME_SPIKE', ratio: currentVolume / mean };
}
return null;
}
4.3 基于时间优先级的信号
这个信号,很多人会忽略。但我告诉你,在抢单策略里,时间优先级信号往往是最「稳」的。
为什么?因为交易所的撮合规则就是「价格优先、时间优先」。你比别人早挂单,你就排在前面。
核心思路:
- 监控队列深度:你在买一/卖一队列中的位置
- 计算预期成交时间:根据队列长度和近期成交速度
- 当预期成交时间小于阈值时,触发「加仓」或「撤单重挂」信号
嗯,这里要注意:时间优先级信号不能单独用。你想想看,如果你排在买一第一位,但价格一直在跌,那你挂单就是接飞刀。
时间优先级信号必须结合价格趋势使用。我建议至少加一个简单的移动均线过滤:价格在均线上方时,才考虑买入队列的优先级信号。
// 时间优先级信号示例
function timePrioritySignal(myPosition, queueLength, tradeSpeed) {
let expectedTime = (queueLength - myPosition) / tradeSpeed;
if (expectedTime < 3) { // 预期3秒内成交
return { signal: 'ADD_ORDER', reason: '队列即将轮到' };
}
return null;
}
4.4 三种信号的融合策略
单独用任何一种信号,都有缺陷。我个人的做法是「三票制」:
- 盘口异动:发现潜在机会(第一票)
- 成交量加权:确认资金动向(第二票)
- 时间优先级:判断执行可行性(第三票)
三票全中,才出手。两票中,谨慎观察。一票中,直接忽略。
你可能会问:这样会不会太保守?
我的回答是:抢单策略的核心不是「抢到每一单」,而是「抢到对的单」。宁可错过,不要做错。这个道理,我是在亏了真金白银之后才真正理解的。
先用历史数据回测三种信号的单独表现,找到各自的最佳参数。然后再做融合测试。不要一上来就搞复杂模型,简单的东西往往更可靠。
4.5 信号生成模块的知识体系
下面这张图,是我自己梳理的信号生成模块核心逻辑。你可以把它当作一个「检查清单」:
这张图我建议你保存下来。每次做策略优化时,对照着检查一遍,看看是哪个环节出了问题。
信号生成模块没有「万能公式」。不同品种、不同市场环境,最优参数都不一样。我的做法是:每季度做一次参数重优化,用最近3个月的数据重新跑一遍回测。