我是Mr.看海,我在尝试用信号处理的知识积累和思考方式做量化交易,应用深度学习和AI实现股票自动交易,目的是实现财务自由~
目前我正在开发基于miniQMT的量化交易系统——看海量化交易系统。
之前的文章留下了一个问题:单股订阅数达到上限时(300只),获取数据的效率表现。
一、问题来源
在之前的这篇文章里,我测试了不同数据获取模式下,更新频率、延迟、调用及返回方式等特点:
Mr.看海:【深度学习量化交易19】行情数据获取方式比测(1)——基于miniQMT的量化交易回测系统开发实记
不过在测试单股订阅 subscribe_quote时,仅订阅了10只股票进行测试,测试发现这种订阅方式,由于每只股票数据都要单独触发一次回调函数,该过程变得有些低效。对于少量股票订阅该效率尚可,股票数量多了后,可能会带来不能接受的低效。
对于非研投版的MiniQMT,单股订阅的上线是300只,那么就需要测试一下在订阅了300只股票时,单股订阅的实际表现了。
二、实测方式
使用下述代码,订阅了沪深300的成分股,并在获取到回调数据后打印数据内容,以及获取到数据时的系统时间。
# 测试单股订阅subscribe_quote
from xtquant import xtdata
import time
import datetime
import random# 1.定义回调函数
def on_data(datas):"""数据更新回调函数"""# 获取当前时间(精确到毫秒)current_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3]print(f"\n当前时间: {current_time}")# datas格式为 { stock_code : [data1, data2, ...] }code_list = list(datas.keys())# 遍历所有股票代码及其数据for stock_code in datas:print(f"\n股票: {stock_code}")for data in datas[stock_code]:if 'time' in data:# 将数值时间转换为可读时间(假设time是整数时间戳,单位是秒)time_value = data['time']readable_time = ""# 根据time的格式进行转换if isinstance(time_value, int):if time_value > 10000000000: # 毫秒级时间戳readable_time = datetime.datetime.fromtimestamp(time_value/1000).strftime('%Y-%m-%d %H:%M:%S')else: # 秒级时间戳readable_time = datetime.datetime.fromtimestamp(time_value).strftime('%Y-%m-%d %H:%M:%S')elif isinstance(time_value, str):# 如果是字符串格式,则直接打印readable_time = time_valueprint(f"时间戳: {time_value}, 可读时间: {readable_time}")# 打印完整数据print(data)'''# 在回调中获取完整K线数据klines = xtdata.get_market_data_ex(field_list=["time", "open", "high", "low", "close", "volume"],stock_list=code_list,start_time="20241213",period="1m")print("\n完整K线数据:")print(klines)'''# 2.获取股票列表
# 获取沪深300成分股(如果可用)
stock_codes = xtdata.get_stock_list_in_sector("000300.SH") # 沪深300指数
print(f"已获取沪深300成分股: {len(stock_codes)}只")# 限制股票数量为300
if len(stock_codes) > 300:stock_codes = stock_codes[:300]print(f"最终订阅股票数量: {len(stock_codes)}")# 循环订阅每只股票
subscribed_count = 0
for stock_code in stock_codes:try:xtdata.subscribe_quote(stock_code=stock_code,period="tick", count=1, callback=on_data )subscribed_count += 1if subscribed_count % 50 == 0: # 每订阅50只打印一次进度print(f"已订阅: {subscribed_count}只股票")except Exception as e:print(f"订阅 {stock_code} 失败: {str(e)}")print(f"订阅完成,共订阅 {subscribed_count} 只股票")# 3.保持程序运行
print("开始接收实时数据...")
try:xtdata.run()
except KeyboardInterrupt:print("程序结束")
三、测试结论
经过测试,可以得到以下几条结论:
1. 单股订阅不是等待上一条数据接收完毕后再接收下一条
换句话说就是,在单股订阅模式下,数据不会发生阻塞,短时间内发来的几条数据会分别触发回调:
当前时间: 2025-04-02 11:20:03.210股票: 600085.SH
时间戳: 1743564003000, 可读时间: 2025-04-02 11:20:03
{'time': 1743564003000, 'lastPrice': 36.92, 'open': 37.15, 'high': 37.15, 'low': 36.800000000000004, 'lastClose': 37.12, 'amount': 146697679.0, 'volume': 39717, 'pvolume': 3971666, 'stockStatus': 3, 'openInt': 13, 'transactionNum': 10440, 'lastSettlementPrice': 0.0, 'settlementPrice': 0.0, 'pe': 0.0, 'askPrice': [36.92, 36.93, 36.94, 36.95, 36.96], 'bidPrice': [36.9, 36.89, 36.88, 36.87, 36.86], 'askVol': [9, 5, 18, 16, 25], 'bidVol': [20, 16, 41, 7, 51], 'volRatio': 0.0, 'speed1Min': 0.0, 'speed5Min': 0.0}当前时间: 2025-04-02 11:20:03.210股票: 000002.SZ
时间戳: 1743564003000, 可读时间: 2025-04-02 11:20:03
{'time': 1743564003000, 'lastPrice': 7.07, 'open': 7.09, 'high': 7.1000000000000005, 'low': 7.05, 'lastClose': 7.11, 'amount': 175344092.0, 'volume': 247862, 'pvolume': 24786186, 'stockStatus': 3, 'openInt': 13, 'transactionNum': 11875, 'lastSettlementPrice': 0.0, 'settlementPrice': 0.0, 'pe': 0.0, 'askPrice': [7.07, 7.08, 7.09, 7.1000000000000005, 7.11], 'bidPrice': [7.0600000000000005, 7.05, 7.04, 7.03, 7.0200000000000005], 'askVol': [881, 3555, 6425, 4264, 3830], 'bidVol': [14388, 16736, 5385, 8566, 3809], 'volRatio': 0.0, 'speed1Min': 0.0, 'speed5Min': 0.0}当前时间: 2025-04-02 11:20:03.210股票: 000338.SZ
时间戳: 1743564003000, 可读时间: 2025-04-02 11:20:03
{'time': 1743564003000, 'lastPrice': 16.04, 'open': 15.97, 'high': 16.09, 'low': 15.81, 'lastClose': 15.96, 'amount': 386011919.0, 'volume': 241776, 'pvolume': 24177574, 'stockStatus': 3, 'openInt': 13, 'transactionNum': 27620, 'lastSettlementPrice': 0.0, 'settlementPrice': 0.0, 'pe': 0.0, 'askPrice': [16.05, 16.06, 16.07, 16.080000000000002, 16.09], 'bidPrice': [16.04, 16.03, 16.02, 16.01, 16.0], 'askVol': [589, 678, 1126, 1141, 902], 'bidVol': [61, 108, 93, 123, 1068], 'volRatio': 0.0, 'speed1Min': 0.0, 'speed5Min': 0.0}当前时间: 2025-04-02 11:20:03.210股票: 601398.SH
时间戳: 1743564003000, 可读时间: 2025-04-02 11:20:03
{'time': 1743564003000, 'lastPrice': 6.83, 'open': 6.79, 'high': 6.83, 'low': 6.78, 'lastClose': 6.8, 'amount': 1003551350.0, 'volume': 1474008, 'pvolume': 147400805, 'stockStatus': 3, 'openInt': 13, 'transactionNum': 38867, 'lastSettlementPrice': 0.0, 'settlementPrice': 0.0, 'pe': 0.0, 'askPrice': [6.83, 6.84, 6.8500000000000005, 6.86, 6.87], 'bidPrice': [6.82, 6.8100000000000005, 6.8, 6.79, 6.78], 'askVol': [14254, 91595, 110266, 76208, 48574], 'bidVol': [57609, 73357, 110192, 98915, 132734], 'volRatio': 0.0, 'speed1Min': 0.0, 'speed5Min': 0.0}
就像上边四条数据,其记录的系统时间在毫秒级别是相同的。
不过如果在回调函数里写入了过于复杂的算法,即使回调函数可以并行处理,堆积的处理不完的新的数据和要处理的指令,会使得内存不堪重负。
2.数据的延迟
之前的文章提到过,获取到的数据的标注时间是可能“早于”系统时间的,也可能“晚于”系统时间。
这可能是由于系统时间不准,也可能是服务器发来的数据标记的时间就是超前的。
经过测试,在300只单股订阅的情况下,延迟也在正负几百毫秒的范围,属于上次测试得到的常规结果。
四、下一步考虑
后边还有几件事要做,做完后回测系统就可以跟大家见面了:
- 策略框架标准化定义
- 策略通用工具箱完善
- 策略的项目化管理设置
- 日志管理
- 与成熟的回测软件(比如QMT)进行相同策略的对比,以验证软件的有效性
因此,目前的回测系统还不满足放出来给大家使用的状态,待测试稳定后,快捷的安装包版本以及全部开源代码都会放出来给读者朋友们使用。
近期我尽量加快软件和文章更新的频率,尽早让朋友们使用上这个软件。
回测系统当前的主界面
end、开通miniQMT
上述讲到的系统是基于miniQMT,很多券商都可以开通miniQMT,不过门槛各有不同,很多朋友找不到合适的券商和开通渠道。这里我可以联系券商渠道帮忙开通,股票交易费率是万1,开通成功的朋友都可以免费使用上边开发的“看海量化交易系统”。这个系统还在持续开发的过程中,数据下载的功能已经可以使用,回测部分正在加紧开发,大家可以先开通MiniQMT的权限,这样回测部分的功能放出后就能第一时间用上了~
对于想要开通miniQMT、使用上边开发的“看海量化交易系统”的朋友们,请大家关注一下我的公众号“看海的城堡”,在公众号页面下方点击相应标签即可获取。
相关文章
【深度学习量化交易1】一个金融小白尝试量化交易的设想、畅享和遐想
【深度学习量化交易2】财务自由第一步,三个多月的尝试,找到了最合适我的量化交易路径
【深度学习量化交易3】为了轻松免费地下载股票历史数据,我开发完成了可视化的数据下载模块
【深度学习量化交易4】 量化交易历史数据清洗——为后续分析扫清障碍
【深度学习量化交易5】 量化交易历史数据可视化模块
【深度学习量化交易6】优化改造基于miniQMT的量化交易软件,已开放下载~(已完成数据下载、数据清洗、可视化模块)
【深度学习量化交易7】miniQMT快速上手教程案例集——使用xtQuant进行历史数据下载篇
【深度学习量化交易8】miniQMT快速上手教程案例集——使用xtQuant进行获取实时行情数据篇
【深度学习量化交易9】miniQMT快速上手教程案例集——使用xtQuant获取基本面数据篇
【深度学习量化交易10】miniQMT快速上手教程案例集——使用xtQuant获取板块及成分股数据篇
【深度学习量化交易11】miniQMT快速上手教程——使用XtQuant进行实盘交易篇(一万七千字超详细版本)
【深度学习量化交易12】基于miniQMT的量化交易框架总体构建思路——回测、模拟、实盘通吃的系统架构
【深度学习量化交易13】继续优化改造基于miniQMT的量化交易软件,增加补充数据功能,优化免费下载数据模块体验!
【深度学习量化交易14】正式开源!看海量化交易系统——基于miniQMT的量化交易软件
【深度学习量化交易15】基于miniQMT的量化交易回测系统已基本构建完成!AI炒股的框架初步实现
【深度学习量化交易16】韭菜进阶指南:A股交易成本全解析
【深度学习量化交易17】触发机制设置——基于miniQMT的量化交易回测系统开发实记
【深度学习量化交易18】盘前盘后回调机制设计与实现——基于miniQMT的量化交易回测系统开发实记
【深度学习量化交易19】行情数据获取方式比测(1)——基于miniQMT的量化交易回测系统开发实记
【深度学习量化交易20】量化交易策略评价指标全解析——基于miniQMT的量化交易回测系统开发实记