订单类型:市价单、限价单与成交
同一笔交易,用不同的订单类型提交,成交价可以差出好几个跳动价位。市价单、限价单、止损单背后其实是同一个权衡:确定成交,还是确定价格。
决定一笔交易成本的,除了买什么、什么时候买,还有一个新手最容易忽略的变量:单子是怎么递出去的。同样是”买 200 股”,用市价单和用限价单提交,最后落在账户里的成交价可以差出好几个跳动价位。而整个订单类型的话题,剥开各种名词之后其实只有一个权衡:你可以确定成交,或者确定价格,但不能两个都要。下面每一种订单类型,都是在这个权衡上选了一个不同的位置。
市价单:要成交,不问价
市价单是以当前最佳可用价格立即买入或卖出的订单。它站在权衡的一端:只要市场上还有对手方,你就能成交——除非市场完全没有流动性,成交是有保证的。代价是价格没有保证:你成交在哪,由那一刻的买一、卖一说了算,不由你。
对流动性好的股票,这通常不是问题,价差窄,你按屏幕上的价格拿到货。但在流动性差的股票或快速波动的行情里,市价单会背叛你:下单时屏幕上是一个价,成交回报回来是另一个价。你看到的价格和实际拿到的价格之间的这个差,叫滑点。单子越大、订单簿越薄,滑点越狠,因为你的单会沿着订单簿一档一档往深处吃——文末的代码就是在算这件事。
所以市价单的使用条件其实很清楚:股票流动性好,而且”现在就成交”比”成交在哪个价”更重要。要立刻进出场的时候,付一点价差换确定性,是笔划算的买卖;反过来,在一只没什么人交易的股票上扔市价单,就是把成交价交给运气。
限价单:要价格,赌成交
限价单站在权衡的正对面:买入限价单以指定价格或更低的价格成交,卖出限价单以指定价格或更高的价格成交。具体挂法是,买入限价单置于当前卖价或以下,你付出的价格不会高于限价;卖出限价单置于当前买价或以上,你不会以低于限价的价格卖出。价格这一端你完全控制。你交出去的是另一端:成交没有任何保证,单子可能一直挂在那里,一股都没成。
而且未成交并不是均匀分布的坏运气。限价单有个不太直观的毛病:它最容易成交的时刻,往往正是你最不想让它成交的时刻。你把买入限价单挂在市价下方几档,股价一路向上,你一股没买着,眼看行情走掉;股价掉头向下砸穿你的限价,单子倒是成交了——你在下跌途中接了货。这不是说限价单不好,而是提醒你”我控制了价格”不等于”我占了便宜”,那张成交回报有时候是市场塞给你的。
什么时候用限价单?当你在意具体价格胜过在意成交确定性的时候——比如你算过这笔交易只有在某个价位以下才值得做,那高于这个价位不成交本来就是正确结果。
止损单:挂了引信的市价单
止损单看起来像第三种选择,其实不是。止损单在指定价格被触及之前不生效,触及之后变成一张市价单。止损卖单在价格跌破止损价时触发卖出,用来限制多头仓位的损失;止损买单在价格涨破止损价时触发买入,用来限制空头仓位的损失,或者在突破时入场。两者的机制完全一样:触发前不成交,触发后按市价单处理,从触发那一刻起没有任何价格保证。
这一点值得多想一步。止损单被触发的时刻,多半正是行情快速移动的时刻——而那恰好是市价单滑点最大的时候。所以用止损单做风险管理是对的,但别把止损价理解成”最多亏到这里”的承诺。它只是一个开关:“从这个价格开始,市价离场。“实际的离场价在开关按下之后才决定,而且往往比开关的位置更差。
订单会过期:有效期
上面三种订单还有一个时间维度:单子挂出去之后活多久。最常见的是当日单,收盘时还没成交就自动取消。取消前有效(GTC)的订单会一直挂着,直到成交或被你手动撤掉——不过大多数券商会给 GTC 设一个 60 到 90 天的上限。另外两种主要是大单和程序在用:即时或取消(IOC)要求立即成交,成不了的部分直接取消;全数或取消(FOK)更严格,必须立即全部成交,否则整单取消,用在那种”要么一次做完、要么干脆不做”的大额订单上。对手动交易的新手来说,真正需要记住的是第一条:你昨天挂的当日限价单,今天已经不在了。
你的订单被递到了哪里
从点下”提交”到账户里多出股票,中间是一条流水线:
- 订单输入: 你把订单发给券商(电话、APP、API)
- 订单路由: 券商把订单发送到交易所或做市商
- 订单撮合: 交易所把你的订单与对手方撮合
- 成交: 交易在某个具体价格完成
- 清算和结算: 证券和现金完成转移
对成交价影响最大的是第二步。零售券商经常把订单路由给特定的做市商,而做市商会为这些订单流付钱给券商——这套安排叫订单流付费。券商拿到一笔收入,你拿到的成交价则可能比订单直接进交易所更差。这不是什么阴谋,是公开的商业模式,但它意味着”免佣金”不等于”免成本”:成本可能藏在成交价里。花几分钟弄清楚你的券商把订单路由到哪里,是值得的。
把权衡算出来
嘴上说”市价单有滑点、限价单可能不成交”,不如算一遍。下面两个函数,第一个模拟一张市价单沿限价订单簿逐档吃单的过程,第二个把限价单与市价单的取舍压成一个期望值比较。
def simulate_market_order(limit_order_book, quantity, side='buy'):
"""
Simulate the expected cost of a market order given current LOB.
Market orders walk up/down the book until filled.
Each level has a specific size and price.
"""
if side == 'buy':
book = limit_order_book[limit_order_book['side'] == 'ask'].sort_values('price')
else:
book = limit_order_book[limit_order_book['side'] == 'bid'].sort_values('price', ascending=False)
remaining = quantity
total_cost = 0
for _, row in book.iterrows():
if remaining <= 0:
break
fill_size = min(remaining, row['size'])
total_cost += fill_size * row['price']
remaining -= fill_size
avg_price = total_cost / (quantity - remaining) if remaining < quantity else None
return {
'filled': quantity - remaining,
'remaining': remaining,
'avg_fill_price': avg_price,
'expected_slippage_bps': (avg_price - book.iloc[0]['price']) / book.iloc[0]['price'] * 10000 if avg_price else None
}
def limit_order_vs_market_order(limit_price, market_cost, probability_fill):
"""
Compare expected value of limit order vs market order.
"""
# Limit order: get limit price if filled, miss opportunity if not
limit_expected = limit_price * probability_fill
# Market order: pay market cost
market_expected = market_cost
return {
'limit_order_expected_cost': limit_expected,
'market_order_cost': market_expected,
'limit_better_if': limit_expected < market_expected
}
提示词
用 pandas 写两个订单执行函数:模拟市价单沿订单簿逐档吃单算平均成交价和滑点;比较限价单和市价单预期成本的决策函数。
第一个函数把前面市价单那节的话变成了数字:单量小于第一档的挂单量时,平均成交价就是买一或卖一,滑点接近零;单量一大,平均价被一档一档推着走,expected_slippage_bps 用基点告诉你被推了多远。第二个函数很粗糙——它没有给未成交那部分的机会成本定价,只把限价乘上成交概率去对比市价成本——但方向是对的:成交概率越低,限价单在纸面上显得越便宜,实际上越不可靠。这正是那个核心权衡的数字版本。
绕了一圈回到开头那句话:市价单用价格买确定性,限价单用确定性买价格,止损单是一张挂了引信的市价单,而路由决定了这一切发生的场地。想把订单和成交这件事真正吃透,Harris 的 Trading and Exchanges 第 3 章把各种订单类型讲得比任何券商帮助文档都清楚;想再往微观结构的实证深处走,接上 Hasbrouck。
参考文献
- Harris, Trading and Exchanges, Ch. 3. Oxford University Press, 2003. ISBN: 978-0-19-514470-3.
- Hasbrouck, Empirical Market Microstructure. Oxford University Press, 2007. ISBN: 978-0-19-530164-9.