摘要: 挂单是排队等成交,价格优先时间优先决定谁先谁后。市价单直接吃掉对手盘,大单分批买卖和期货撮合都会让成交价偏离挂单价。想减少滑点用限价单,别用市价单追涨杀跌。

挂单是排队,成交是撮合

很多刚接触股票和期货的朋友都会遇到一个困惑:我明明挂单在10块钱买入,为什么最后成交价是10块零1分,甚至10块零5分?挂单在10块钱卖出,成交价却只有9块9毛9。

这中间的钱去哪了?是谁在占我便宜?

买股票时成交价为什么不是挂单价

答案很简单:交易所不是自动售货机,你投币它就掉货。交易所是一个菜市场,买卖双方都在喊价,必须有人愿意跟你匹配,交易才能达成。

价格优先,时间优先

交易所的撮合规则就八个字:价格优先,时间优先。

买入的时候,谁出价高谁先成交。卖出的时候,谁要价低谁先成交。出价一样,谁先挂单谁先成交。

假设当前某只股票盘口是这样的:

  • 卖一:10.00元,100手

  • 卖二:10.01元,200手

  • 卖三:10.02元,300手

你挂单10.00元买入500手。你的单子只能先吃掉卖一那100手。卖一被吃完后,价格会跳到卖二10.01元。如果你还想继续买,剩下的400手只能以10.01元甚至更高的价格成交。

你的挂单价是10.00元,但成交均价变成了10.008元。这就是为什么挂单价和成交价不一样。

市价单直接吃掉对手盘

股票和期货里有两种常见的下单方式:限价单和市价单。

限价单是你指定一个价格,只在这个价格或更好的价格成交。市价单是你不管价格,只要立刻成交。

期货市场里市价单用得更多,因为期货波动快,很多人怕错过行情。你下市价单买入,交易所会从卖一、卖二、卖三一路吃上去,直到你的单子全部成交。最后成交价可能是卖五、卖六的价格。

一个品种盘口薄的时候,市价单能把价格瞬间打上去好几个点。这就是滑点。滑点不是交易所收你的手续费,而是你为了立刻成交付出的代价。

大单分批,成交价是一串价格的加权平均

机构买卖股票,动辄几百万股。他们不可能一笔市价单打进去,那样会把价格打飞。他们用算法把大单拆成几百个小单,分批挂在不同价位。

你看到的分时成交明细,每一笔价格都不一样。最终你账户里显示的成交均价,是所有这些小单成交价的加权平均。

挂单价是你下的指令,成交价是市场给你匹配的结果。指令和结果之间隔着整个盘口的深度。

期货撮合更直接,对手价才是真实成交价

股票有集合竞价和连续竞价,期货大部分时间是连续竞价。期货交易软件里有一个功能叫“对手价”。你点对手价买入,系统自动用卖一价挂单。点对手价卖出,系统自动用买一价挂单。

为什么期货老手喜欢用对手价?因为对手价就是当前盘口能立刻成交的价格。用对手价,成交速度快,滑点可控。用挂单价,可能要等很久,行情跑了单子还没成交。

期货还有一个概念叫“排队价”。排队价就是买一价或卖一价,你挂在那里等别人来吃。排队价成交的前提是有人愿意主动跟你成交。如果没人主动来,你的单子就一直挂着。

滑点是怎么吃掉利润的

做日内交易的人最怕滑点。一笔交易滑一个点,十笔交易就滑十个点。期货一个点可能是10块钱,十个点就是100块。一天做二十笔,滑点成本比手续费还高。

减少滑点的方法很简单:用限价单,别用市价单。限价单最多不成交,但不会让你成交在离谱的价格。市价单保证成交,但成交价可能让你怀疑人生。

还有一个办法是看盘口深度。买一卖一挂单量大的品种,滑点小。挂单量小的品种,一笔大单就能打穿好几档。

挂单价是你想要的,成交价是市场给的

回到最初的问题:成交价为什么不是挂单价?

挂单价是你的愿望,成交价是市场的现实。愿望和现实之间,隔着价格优先、时间优先的排队规则,隔着盘口深度的约束,隔着市价单的冲击成本。

理解这一点,你就不会再纠结为什么成交价和挂单价不一样。你反而会开始思考:我该用限价单还是市价单?我该看几档盘口?我的单子会不会把价格打飞?

这些才是交易里真正重要的问题。


# 一个简单的盘口撮合模拟,帮助理解成交价形成过程

# 卖盘挂单:价格从低到高

ask_orders = [

    {'price': 10.00, 'volume': 100},

    {'price': 10.01, 'volume': 200},

    {'price': 10.02, 'volume': 300},

    {'price': 10.03, 'volume': 400},

]

# 你的买入限价单

my_order = {'price': 10.00, 'volume': 500}

# 撮合过程

def match_order(asks, order):

    remaining = order['volume']

    total_cost = 0

    filled = 0



    for ask in asks:

        if remaining <= 0:

            break

        if order['price'] >= ask['price']:

            deal_volume = min(remaining, ask['volume'])

            total_cost += deal_volume * ask['price']

            remaining -= deal_volume

            filled += deal_volume



    if filled > 0:

        avg_price = total_cost / filled

        print(f"成交数量: {filled}手")

        print(f"成交均价: {avg_price:.4f}元")

        print(f"挂单价: {order['price']}元")

        print(f"滑点: {avg_price - order['price']:.4f}元")

    else:

        print("无法成交")

match_order(ask_orders, my_order)

跑一下这段代码,你会看到挂单价10.00元买入500手,最终成交均价是10.0112元。挂单价和成交价之间的差距,就是市场给你的答案。