撤单策略基础:撤单的时机选择、撤单对盘口的影响、虚假挂单识别

撤单,听起来很简单对吧?

点一下取消就完事了。但在我眼里,撤单才是盘口博弈中最见功力的地方。挂单谁都会,什么时候撤、怎么撤、撤完怎么走——这才是区分新手和老手的分水岭。

我刚开始做量化那会儿,觉得撤单就是个“取消操作”。后来被市场狠狠教育了几次,才明白:撤单不是认输,是策略的一部分。说白了,撤单本身就是一种信号。

撤单的时机选择

时机这东西,差一秒结果可能天差地别。我个人习惯把撤单时机分成三类:

  1. 被动撤单:挂单后长时间没成交,主动放弃
  2. 主动撤单:发现盘口异动,立刻撤回重新布局
  3. 策略撤单:按预设条件自动触发,比如时间阈值、价格偏移

我在项目中遇到过最典型的场景:某只股票在买一挂了500手大单,看着像是有资金在托底。但过了3分钟,这单子纹丝不动,价格反而往下压了2个tick。嗯,这时候就该撤了——明显是假托单,等着散户往上冲呢。

核心原则:挂单超过30秒未成交,且价格朝不利方向移动,优先考虑撤单。

你想想看,如果真是大资金要吃货,不会让单子挂在那里当靶子。真正的大单,要么瞬间吃掉,要么挂上去就撤,根本不会给你反应时间。

撤单对盘口的影响

撤单不是孤立行为。你撤了,盘口就变了,别人看到的变化又会反过来影响你。这就是博弈。

我总结了几种常见影响:

撤单类型 盘口表现 市场解读
买一撤单 买盘厚度骤降 支撑消失,价格可能下探
卖一撤单 卖盘压力减轻 抛压减弱,价格可能反弹
大单撤单 深度图出现断层 主力意图不明,观望情绪加重

我记得有一次做回测,发现一个很有意思的现象:某只股票在拉升前,卖五位置频繁出现大单挂上又撤掉。反复三次后,价格突然拉涨停。后来我才明白,那是主力在测试上方抛压——挂上去看有没有人跟着卖,没人卖就撤,然后自己拉。

实战技巧:如果发现某价位反复出现“挂单-撤单”循环,且每次撤单后价格都往同一方向移动,大概率是主力在试盘。这时候跟着方向走,胜率会高很多。

虚假挂单识别

虚假挂单,行话叫“托单”或“压单”。说白了就是挂上去不打算成交,纯粹为了影响别人判断。

怎么识别?我总结了三个关键点:

  • 挂单时间短:真正的交易单,挂上去要么成交要么等。虚假单子往往挂几秒就撤,尤其是大单。
  • 挂单位置刁钻:比如买一挂大单,但买二到买五全是小单。这种结构很不自然,大概率是托单。
  • 撤单后价格反向:虚假买单撤掉后价格不跌反涨,说明那单子本身就是假的,市场根本没把它当支撑。

我曾经踩过一个坑:某只股票买一挂了2000手,看着特别稳。我跟着挂了500手在买二,想着有人托底不怕。结果那2000手突然撤了,价格瞬间砸下来3个点,我的单子直接成交在最低点。嗯,从那以后我再也不盲目跟大单了。

避坑指南:我曾经以为挂单量越大越安全,后来发现恰恰相反。真正的大资金,不会让你看到它的底牌。那些明晃晃挂在那里的“大单”,十有八九是诱饵。

核心逻辑框架

下面这张图,是我自己整理的一套撤单决策流程。每次做策略前,我都会过一遍这个逻辑:

挂单状态监控 是否超过预设时间阈值? 执行撤单 继续监控盘口 盘口是否有异常信号? 撤单并重新评估 维持现有挂单 撤单决策流程:时间优先 → 信号验证

这个流程看起来简单,但实际跑起来很考验盘感。我一般会在策略里加两个参数:一个是max_hold_time,控制单子最长挂多久;另一个是price_deviation,价格偏离多少就触发撤单。这两个参数调好了,胜率能提升不少。

代码示例:撤单策略核心逻辑

def should_cancel(order, market_data, config):
    """
    判断是否应该撤单
    order: 当前挂单信息
    market_data: 实时盘口数据
    config: 策略参数
    """
    # 1. 时间检查
    hold_time = time.time() - order['timestamp']
    if hold_time > config['max_hold_time']:
        return True, "超时撤单"
    
    # 2. 价格偏移检查
    current_price = market_data['last_price']
    order_price = order['price']
    deviation = abs(current_price - order_price) / order_price
    
    if deviation > config['price_deviation']:
        return True, "价格偏移过大"
    
    # 3. 盘口异常检查
    bid_depth = market_data['bid_depth']  # 买盘厚度
    ask_depth = market_data['ask_depth']  # 卖盘厚度
    
    # 如果挂的是买单,但买盘突然变薄
    if order['side'] == 'buy' and bid_depth < config['min_depth']:
        return True, "买盘支撑不足"
    
    # 如果挂的是卖单,但卖盘突然变厚
    if order['side'] == 'sell' and ask_depth > config['max_depth']:
        return True, "卖盘压力过大"
    
    return False, "继续持有"

这段代码是我早期策略的核心。你可能会问:为什么还要检查盘口深度?

因为有时候价格没变,但盘口结构已经变了。比如买一还是那个价,但下面的单子全撤了——这时候你的单子就悬空了,不撤等着被砸吗?

个人习惯:我一般会把撤单逻辑和重新挂单逻辑写在一起。撤完不是结束,而是新一轮博弈的开始。撤单后3秒内,我会根据新的盘口结构决定下一步动作。

撤单这东西,说白了就是“认错要快”。市场不会给你第二次机会。你犹豫的那一秒,可能已经错过了最佳撤单窗口。嗯,这句话是我亏出来的经验。


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