【深度学习量化交易21】行情数据获取方式比测(2)——基于miniQMT的量化交易回测系统开发实记

我是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_value
                
                print(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 += 1
        if 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的量化交易回测系统开发实记

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.看海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值