23、监管与合规:MiFID II最佳执行要求、SEC Reg NMS、做市商报告义务、市场操纵防范
做市商这行,技术再牛,策略再赚钱,一旦踩了监管的红线,那就全完了。我见过不少团队,代码写得漂亮,回测曲线完美,结果上线没几天就被监管约谈。说白了,合规不是束缚,是生存底线。
今天咱们聊聊做市商必须面对的四大监管板块:MiFID II的最佳执行、SEC的Reg NMS、报告义务,以及市场操纵防范。嗯,这里面坑不少,我一个个说。
核心观点:监管不是阻碍,而是做市商长期盈利的护城河。合规做得好,反而能降低交易成本、提升信誉。
一、MiFID II:最佳执行要求
MiFID II是欧盟的金融工具市场指令,2018年生效。它最核心的一条就是「最佳执行」——经纪商必须为客户订单争取最优结果。
什么叫最优结果?不只是价格,还包括速度、执行概率、结算成本、市场影响。我当年在伦敦做项目时,客户要求我们证明每个订单都执行在「最佳」水平。说实话,这很难量化。
1.1 最佳执行的五大维度
| 维度 | 说明 | 我的经验 |
|---|---|---|
| 价格 | 成交价 vs 市场最优价 | 别只看最优价,要考虑滑点 |
| 成本 | 手续费、税费、隐性成本 | 隐性成本往往比显性高3-5倍 |
| 速度 | 订单到成交的延迟 | 微秒级差异就能决定盈亏 |
| 执行概率 | 订单被完全成交的可能性 | 部分成交比不成交更麻烦 |
| 市场影响 | 订单对价格的冲击 | 大单要拆,否则自己打自己 |
1.2 如何证明最佳执行?
MiFID II要求做市商保留所有订单的执行数据,至少保存5年。你需要能回答:为什么这个订单去了A交易所而不是B?为什么用了这个算法而不是那个?
我曾经帮一家做市商搭建执行分析系统,核心逻辑就是对比每个订单的实际执行价格与「基准价格」。基准价格可以是VWAP、TWAP,或者当时的NBBO中间价。
# 一个简单的执行质量评估函数
def evaluate_execution(order_price, benchmark_price, volume):
"""
计算执行偏差
order_price: 实际成交均价
benchmark_price: 基准价格(如NBBO中间价)
volume: 成交量
"""
deviation = (order_price - benchmark_price) / benchmark_price * 10000 # 以bp为单位
cost = deviation * volume
if deviation < 0.5:
return "优秀", cost
elif deviation < 1.0:
return "合格", cost
else:
return "需改进", cost
避坑指南:我曾经遇到一个团队,只记录成交价不记录基准价。监管来查时,他们拿不出对比数据,被罚了50万欧元。记住:基准价必须实时记录,事后补不了。
二、SEC Reg NMS:全美市场体系规则
Reg NMS是美国证券交易委员会2005年推出的规则,核心是保护订单不被「偷跑」。它要求交易所必须执行「最优价格」——也就是NBBO(全国最优买卖价)。
你想想看,如果纽约的交易所挂出100.01的卖单,芝加哥的交易所挂100.02,那你的订单必须去纽约成交。这就是Reg NMS的「订单保护规则」。
2.1 Reg NMS的三大核心
- 订单保护规则(Rule 611):禁止交易所在有更好价格时执行较差价格。说白了,不能「挑单」。
- 接入规则(Rule 610):交易所必须公平接入,不能歧视。
- 市场数据规则(Rule 603):市场数据必须实时、公平分发。
做市商最头疼的是Rule 611。因为你要同时监控多个交易所的报价,确保自己的订单不会「撞上」更优价格。我见过一个高频做市商,因为没处理好跨交易所的NBBO更新,导致大量订单被「trade-through」,被SEC罚了200万美元。
2.2 如何合规处理NBBO?
你需要一个实时NBBO计算引擎。每个交易所的报价进来后,取最优买价和最优卖价,然后跨交易所比较。注意:要考虑延迟,不同交易所的报价到达时间不同。
# NBBO计算示例(简化版)
def calculate_nbbo(exchange_quotes):
"""
exchange_quotes: dict, key=交易所, value=(bid, ask)
返回: (best_bid, best_ask, best_bid_exchange, best_ask_exchange)
"""
best_bid = -float('inf')
best_ask = float('inf')
best_bid_ex = None
best_ask_ex = None
for ex, (bid, ask) in exchange_quotes.items():
if bid > best_bid:
best_bid = bid
best_bid_ex = ex
if ask < best_ask:
best_ask = ask
best_ask_ex = ex
return best_bid, best_ask, best_bid_ex, best_ask_ex
注意:NBBO计算必须考虑交易所的「保护带」。比如NYSE的报价更新后,其他交易所有一定时间(通常1秒)来响应。这个时间窗口内,即使有更优价格,也不算违规。
三、做市商报告义务
做市商不是想怎么做就怎么做。你得向监管机构报告大量数据。MiFID II要求报告交易数据、订单数据、执行质量数据。SEC要求报告Reg SHO(卖空规则)数据、大额交易数据。
我个人习惯把报告义务分成三类:
- 交易报告:每笔交易的细节,包括时间、价格、数量、对手方。
- 订单报告:挂单、撤单、修改的记录。监管要看你有没有「虚假挂单」。
- 风险报告:持仓、敞口、保证金使用情况。
我记得有个做市商朋友,因为报告格式不对,被监管要求重新提交过去两年的数据。那工作量,简直噩梦。所以,报告系统一定要自动化,而且要支持多种格式(XML、CSV、FIX等)。
# 交易报告生成示例
def generate_trade_report(trades):
"""
trades: list of dict, 每笔交易包含:
- trade_id, symbol, side, price, quantity, timestamp, counterparty
返回: 符合MiFID II格式的XML字符串
"""
import xml.etree.ElementTree as ET
root = ET.Element("TradeReport")
root.set("xmlns", "http://www.esma.europa.eu/MiFIDII")
for trade in trades:
trade_elem = ET.SubElement(root, "Trade")
ET.SubElement(trade_elem, "TradeID").text = trade['trade_id']
ET.SubElement(trade_elem, "Instrument").text = trade['symbol']
ET.SubElement(trade_elem, "Side").text = trade['side']
ET.SubElement(trade_elem, "Price").text = str(trade['price'])
ET.SubElement(trade_elem, "Quantity").text = str(trade['quantity'])
ET.SubElement(trade_elem, "Timestamp").text = trade['timestamp']
ET.SubElement(trade_elem, "Counterparty").text = trade['counterparty']
return ET.tostring(root, encoding='unicode')
我的建议:报告系统最好用事件驱动架构。每笔交易、每个订单变更都触发一个事件,自动生成报告。别等月底再补,那时候数据早乱了。
四、市场操纵防范
这是做市商最敏感的领域。监管对市场操纵零容忍,尤其是幌骗(Spoofing)和分层(Layering)。
4.1 幌骗(Spoofing)
幌骗就是挂出大单但不打算成交,目的是诱导其他交易者跟风,然后自己反向操作。比如,你在卖一挂1000手,别人以为要跌,纷纷卖出,你趁机低价买入,然后撤单。
2015年,美国商品期货交易委员会(CFTC)对一家高频交易公司罚款2500万美元,就是因为幌骗。我当年在芝加哥做项目时,亲眼见过一个交易员因为幌骗被FBI带走。嗯,那场面,终身难忘。
4.2 分层(Layering)
分层是幌骗的升级版。交易员在多个价格层级挂单,制造虚假的买卖压力。比如,在买一到买五各挂100手,看起来买盘很强,实际上都是假的。
监管怎么查?看撤单率。如果一个账户的撤单率超过90%,而且挂单时间极短(毫秒级),那基本就是幌骗或分层。
4.3 如何防范?
做市商必须建立内部监控系统。我建议从三个维度入手:
- 撤单率监控:单个策略的撤单率不能超过阈值(比如70%)。
- 挂单时间监控:挂单后短时间内撤单的比例。
- 价格影响监控:挂单是否显著影响了市场价格。
# 幌骗检测示例
def detect_spoofing(order_history, threshold=0.7):
"""
order_history: list of dict, 包含order_id, action, timestamp
threshold: 撤单率阈值
返回: 可疑订单列表
"""
from collections import defaultdict
order_stats = defaultdict(lambda: {'placed': 0, 'cancelled': 0})
for order in order_history:
oid = order['order_id']
if order['action'] == 'PLACE':
order_stats[oid]['placed'] += 1
elif order['action'] == 'CANCEL':
order_stats[oid]['cancelled'] += 1
suspicious = []
for oid, stats in order_stats.items():
if stats['placed'] > 0:
cancel_rate = stats['cancelled'] / stats['placed']
if cancel_rate > threshold:
suspicious.append(oid)
return suspicious
警告:别以为只有「恶意」才算违规。有些做市策略无意中产生了高撤单率,同样会被监管盯上。我曾经有个客户,他的做市策略是「闪电挂单」,挂单后10毫秒内撤单,结果被监管认定为幌骗。后来我们改成了「挂单至少保留500毫秒」,才合规。
五、知识体系框架
下面这张图总结了本章的核心逻辑。你可以看到,监管与合规不是孤立的,而是贯穿做市商整个业务流程。
你看,合规不是单一的技术问题,而是技术、流程、文化的结合。技术层面,你需要实时监控、自动报告、异常检测。流程层面,你需要明确的合规手册、定期审计。文化层面,全员都要有合规意识。
最后说一句:别把合规当成本,把它当投资。合规做得好,你的做市策略才能长期稳定运行。否则,一次罚款就能让你回到解放前。
无相订单流研究社 微信Lucian808555