告别付费行情软件:利用 QMT 免费“白嫖”全市场 Tick 级数据 (附 Python 代码)

告别付费行情软件:利用 QMT 免费“白嫖”全市场 Tick 级数据 (附 Python 代码)
前言:作为一名量化开发者,我每年最心疼的支出不是服务器费用,而是数据源费用。Wind 终端一年几万,Tushare 积分也要钱,稍微好点的 Tick 数据源动辄上千。但其实,很多散户手里就握着一把“金钥匙”却不自知——那就是券商免费提供的 QMT。今天,我将教你如何把 QMT 变成一个免费、稳定、实时的行情数据中心

为什么 QMT 的数据最“香”?

在数据获取这条路上,我们通常有三个选择:

  1. 爬虫:容易被封 IP,数据不稳定,且有法律风险。
  2. 第三方 API (Tushare/JoinQuant):好用但要钱,免费版有各种限制(如延迟、限流)。
  3. 券商 QMT/PTrade完全免费,速度极快(内网专线),且包含最珍贵的 Tick 级切片数据

很多券商为了推广量化交易,是花了重金向交易所购买 Level-2 行情的。只要你开通了 QMT 权限(通常门槛在 50万-100万资金量),这些数据对你就是免费开放的。不用它,简直是暴殄天物。

核心原理:订阅-推送模式

QMT 获取数据的逻辑和传统的 request-response 不太一样。它采用的是订阅 (Subscribe) 模式:

  1. 你告诉 QMT:“我要订阅茅台的 Tick 数据”。
  2. QMT 客户端会在后台与券商服务器建立长连接。
  3. 一旦有新成交,QMT 会自动把数据推送到你的本地回调函数里。

这种模式的延迟通常在 毫秒级,非常适合做日内高频策略或盘口分析。

实战演示:搭建本地行情录制器

下面我们将用 Python 编写一个简单的脚本,利用 QMT (MiniQMT) 实时订阅全市场(或指定股票)的 Tick 数据,并保存为 CSV。

1. 环境准备

确保你已经登录了 QMT 客户端(极简模式),并记住了 mini_qmt_path(安装路径)。

from xtquant import xtdata import pandas as pd import time import datetime # 设定股票列表 (示例:茅台、宁德时代) stock_list =['600519.SH','300750.SZ']

2. 核心代码:数据订阅与回调

defon_data(datas):""" 这是回调函数,当有新行情推送时会自动触发 """for stock_code in datas: data = datas[stock_code]# 打印实时数据 (你可以改为存入数据库)print(f"[{datetime.datetime.now()}] {stock_code} "f"价格:{data['lastPrice']} 成交量:{data['volume']} "f"买一:{data['bidPrice'][0]} 卖一:{data['askPrice'][0]}")# 简单存个 CSV 做演示# df = pd.DataFrame([data])# df.to_csv(f'./data/{stock_code}.csv', mode='a', header=False)# 1. 订阅全推数据 (全推模式下,不需要指定具体股票,但这需要券商权限)# 如果没有全推权限,只能逐个订阅for stock in stock_list: xtdata.subscribe_quote(stock, period='1m', count=-1)# 订阅 1分钟 K线 xtdata.subscribe_quote(stock, period='tick', count=-1)# 订阅 Tick# 2. 绑定回调函数# 注意:MiniQMT 的数据推送是基于 socket 的,这里直接用 xtdata 的高级接口更简单# 如果需要更高性能,可以使用 xtdata.get_market_data_ex 配合定时轮询print("🚀 数据监听已启动,按 Ctrl+C 停止...")# 3. 阻塞主线程,防止脚本退出whileTrue:# 模拟每 3 秒主动拉取一次最新 Tick (轮询模式,适合存数据) tick_data = xtdata.get_full_tick(stock_list)for stock in stock_list:if stock in tick_data: info = tick_data[stock]print(f"📊 轮询: {stock} 最新价: {info['lastPrice']}") time.sleep(3)

3. 进阶技巧:历史数据下载

除了实时数据,QMT 也是下载历史数据的神器。它的下载速度极快,且不限制流量。

defdownload_history():print("开始下载历史数据...")# 下载最近 100 天的 1分钟 K线 xtdata.download_history_data('600519.SH', period='1m', start_time='20240101', end_time='20241231')# 读取并转为 DataFrame data = xtdata.get_market_data( field_list=[], stock_list=['600519.SH'], period='1m', start_time='20240101', end_time='20241231') df = pd.DataFrame(data['600519.SH']).T print(df.head()) df.to_csv('maotai_1m.csv')if __name__ =="__main__": download_history()

避坑指南:免费的午餐也有刺

虽然 QMT 数据很香,但在实战中我有 2 个血泪教训:

第一,数据缺失问题。
QMT 的历史数据下载是基于 P2P 或券商缓存的,有时候会遇到某一天数据缺失的情况(比如全是 NaN)。

  • 解决方案:下载后务必做一次 dropna() 检查,如果缺失严重,尝试换个时间段重新下载,或者手动去客户端里点一下“补充数据”。

第二,客户端必须常驻。
xtdata 库的所有功能都依赖于 QMT 客户端的运行。如果你把客户端关了,Python 脚本就会立刻报错。

  • 建议:在服务器上跑的时候,不要为了省资源关掉 GUI 界面。

结语

在这个数据即资产的时代,善用手中的工具,就是最大的降本增效。
通过 QMT,我们不仅省下了购买数据的费用,更拥有了一套自主可控的实时行情系统

把省下来的钱,去买两本书,或者请自己喝杯咖啡,它不香吗?

Read more

2026最新 Python+AI 入门指南:0基础也能快速上手,避开90%新手坑

2026最新 Python+AI 入门指南:0基础也能快速上手,避开90%新手坑

🎁个人主页:User_芊芊君子 🎉欢迎大家点赞👍评论📝收藏⭐文章 🔍系列专栏:AI 文章目录: * 【前言】 * 一、为什么2026年入门AI,首选Python?(新颖热点解读) * 二、Python+AI入门必备:前提+环境搭建(10分钟搞定) * 2.1 核心前提(不用啃硬骨头) * 2.2 环境搭建(Windows/Mac通用,避版本冲突) * 三、Python+AI入门实战:3个热门案例(附完整代码) * 案例1:数据处理(AI入门必备,80%AI开发第一步) * 案例2:机器学习入门(线性回归,房价预测) * 案例3:2026热门·大模型对接(LangChain快速调用) * 四、

By Ne0inhk
【 C/C++ 算法】入门动态规划-----一维动态规划基础(以练代学式)

【 C/C++ 算法】入门动态规划-----一维动态规划基础(以练代学式)

每日激励:“不设限和自我肯定的心态:I can do all things。 — Stephen Curry” 绪论 : 本章是动态规划算法的基础入门篇,我将通过三道简单题 + 一道中等难度的一维动态规划题来带你对动态规划有个初认识,并基本了解动态规划的最基本常见的写法,只有将基本写法了解了,对后续的难的题目自然也不会毫无头绪,后续还将持续更新更多相关的动规算法,敬请期待~🙃 ———————— 早关注不迷路,话不多说安全带系好,发车啦(建议电脑观看)。 👻动态规划🌥️ 这里通过大量练习得出下面动态规划做题步骤 简单的说动态规划理解成:某种状态的公式 + 提前求出来值的容器 求出当前位置的值然后放到容器中后后续使用 因为最开始的值一般是会看见的所以就能有初始值,从而启动动态规划 从上中可以主要提炼出: * 状态 * 容器的重要性 * 公式,可以换种说法:状态转移方程 这样严格😈的说:动态规划 = 状态定义 + 状态转移方程 + 初始条件 + 状态存储(容器) 下述步骤是通过写完下述四道题后的总结,所以同样需要道友🗡️大量的练习沉淀最终就能对动态规划的题目

By Ne0inhk
蓝桥杯(C 语言 / C++)备考全攻略:3-6 个月从入门到上岸,语法 / 算法 / 真题 + 模板直接用

蓝桥杯(C 语言 / C++)备考全攻略:3-6 个月从入门到上岸,语法 / 算法 / 真题 + 模板直接用

蓝桥杯作为国内极具含金量的编程竞赛,是大学生提升编程能力、丰富简历的重要选择。本文针对 C 语言 / C++ 方向,打造 3-6 个月备考计划,从语法基础到算法进阶,再到真题实战,梳理高频考点并提供可直接复用的代码模板,帮你高效备考、稳步上岸。 一、备考规划:3-6 个月阶段拆解(零基础友好) 1. 基础阶段(1-2 个月):夯实语法与工具         核心目标:掌握 C/C++ 基础语法,熟练使用编译器(Dev-C++/VS Code),能独立编写简单程序。         每日学习时长:2-3 小时。 (1)语法重点(按优先级排序) * 核心语法:变量 / 常量、数据类型(int/long long/double/

By Ne0inhk
【编程语言】理解C/C++当中的指针

【编程语言】理解C/C++当中的指针

指针是C/C++语言中一个非常强大且重要的概念,也是编写高效程序的基础之一。对于没有编程背景的初学者来说,理解指针可能有些难度,但通过本篇文章的介绍,相信你会对指针有一个清晰的认识。本文将从指针的基本概念、作用、代码示例、注意事项等方面,带你一步步了解指针的世界。 什么是指针? 在C/C++中,指针是一种特殊的变量,它存储的是另一个变量的内存地址,而不是一个普通的数值。 * 举例来说,如果我们有一个变量int a = 5;,那么指针变量的值可以是a所在的内存地址。通过指针,我们可以访问或修改这个地址所存储的数值。 简单来说,指针是指向一个内存位置的变量,它可以帮助我们在程序中更灵活地操控数据。 为什么需要指针? 指针的出现主要是为了实现灵活的数据操作和优化内存使用。以下是指针的几个常见用途: 1. 间接访问和修改变量:通过指针,可以在函数中修改传入的变量。 2. 动态内存管理:指针是动态分配内存(如malloc和new)的关键。 3. 提高性能:指针可以直接访问内存,从而提高程序性能。 4. 实现复杂的数据结构:如链表、树和图等数据结构的实现,

By Ne0inhk