大家好,我是一名和数据打交道多年的金融分析师。最近有个朋友在做港股量化,跑来问我:“收到的实时成交行情里,怎么有的单子怪怪的,明明成交了却感觉不像是人挂的单?”这其实就涉及港股里两个常见但又有点隐蔽的概念:碎股成交和自动对盘。今天我就把自己在项目中总结的经验和代码分享出来,希望能帮你扫清这个障碍。
痛点:看不懂的成交从哪来
刚接触港股实时数据时,我习惯性地只看价格和成交量。可回测时发现,某些时段的成交特别密集,股价却纹丝不动,仔细排查才发现,很多是系统为了撮合而自动生成的交易,根本不是主动买卖。另一些成交量不到一手的零碎单子,同样会干扰分析。这些“不真实”的成交如果不清洗掉,做策略的时候很容易被误导。手工去翻每条记录?那效率太低了。
先弄清推送里有什么
当我们通过WebSocket订阅股票的成交频道,每条记录通常会包含以下内容:
| 字段名 | 含义 |
|---|---|
| time | 成交时间 |
| price | 成交价格 |
| volume | 成交股数 |
| trade_type | 成交类型标识(可能缺失) |
| match_id | 撮合编号 |
我最初被trade_type这个字段名字迷惑,以为它会清楚地标明“碎股”或“对盘”,结果大部分情况不是空就是默认值。转机在于,我发现可以从三个更底层的特征来判断:
- 成交量:港股一手通常是100的倍数。如果股数小于100或是零散数字,那多半是碎股。
- 时间间隔:自动对盘为了批量处理,常在同一秒甚至几毫秒内连续出现多笔,十分密集。碎股的出现时间就没有这种规律。
- 买卖方信息:如果你用的接口能返回买家、卖家代码,当双方都显示为系统账户时,这笔成交基本就是自动对盘。
用代码实现自动标注
掌握这些规律后,我写了一个Python脚本,实时监听WebSocket,每来一条就自动判别。这里我以ALLTICK API的港股数据源为例,它提供了真实的实时推送。你只需要订阅指定标的,然后根据成交量和对手方打标签即可:
from websocket import create_connection
import json
# 这里填你的 AllTick API Token
API_TOKEN = '你的API_TOKEN'
ws_url = f"wss://ws.alltick.co/stock?token={API_TOKEN}"
ws = create_connection(ws_url)
# 订阅港股 00700.HK 的成交数据
subscribe_msg = {
"action": "subscribe",
"symbol": "00700.HK",
"type": "transaction"
}
ws.send(json.dumps(subscribe_msg))
def check_auto_match(tick):
# 假设系统自动对盘的成交方为 "SYS"
return tick.get('buyer') == 'SYS' and tick.get('seller') == 'SYS'
while True:
data = ws.recv()
tick = json.loads(data)
volume = tick.get('volume', 0)
if volume < 100:
tick['tag'] = '碎股'
elif check_auto_match(tick):
tick['tag'] = '自动对盘'
else:
tick['tag'] = '普通成交'
print(tick['time'], tick['price'], tick['volume'], tick['tag'])
这样跑起来,控制台就会持续输出带标签的成交记录,碎股和自动对盘一目了然。
工作方式的大幅改善
有这套自动判别后,我再也不用手工分拣,直接把标记好的数据输入策略或存储到数据库。在做量价因子分析时,我会只提取“普通成交”来计算,剔除了干扰项,回测的稳定性明显提高。同时,监控盘面时能看到哪些交易是系统产生的,能让我避开假突破的陷阱。希望你也能用这个办法,让你的港股实时数据处理变得更轻松。
共同学习,写下你的评论
评论加载中...
作者其他优质文章
