挂单是排队,成交是撮合
很多刚接触股票和期货的朋友都会遇到一个困惑:我明明挂单在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元。挂单价和成交价之间的差距,就是市场给你的答案。