☰
3 行代码搞定通达信行情、历史与财务数据:mootdx 完整使用教程
2026/10/21 2:02:19 网站建设 项目流程

3 行代码搞定通达信行情、历史与财务数据:mootdx 完整使用教程

【免费下载链接】mootdx通达信数据读取的一个简便使用封装项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx

核心关键词:mootdx 通达信数据获取长尾关键词:Python 通达信行情接口、通达信历史数据离线解析、通达信财务数据下载、mootdx 行情客户端配置

下面这三段代码,第一段连行情服务器取实时报价,第二段直接解析本地通达信文件读日线,第三段把远程财报包拉下来变成表格。每段返回的都是 pandas DataFrame,你可以复制到自己的环境里直接跑:

from mootdx.quotes import Quotes from mootdx.reader import Reader from mootdx.affair import Affair client = Quotes.factory(market='std', heartbeat=True) # 在线行情客户端 print(client.quotes(['000001', '600519'])) # 批量实时报价 reader = Reader.factory(market='std', tdxdir='C:/new_tdx') print(reader.daily(symbol='600036', adjust='qfq').tail()) # 本地日线(前复权) files = Affair.files() # 远程财报文件列表 print(files[0]['filename'], files[0]['filesize'])

如果你不想手写解析.day二进制文件的代码、也不想为商业接口付费,这篇文章就是给你的。

一分钟认识 mootdx:一个库管完通达信行情、历史、财报

mootdx 是通达信数据读取的 Python 封装库,给做回测、盯盘、基本面研究的你省掉了三件事:手搓二进制解析、对接不稳定的免费 API、来回切换两套数据结构。它把能力收进三个入口——Quotes管在线行情、Reader管本地历史文件、Affair管财务报表下载解析,接口风格统一,返回值几乎全是 DataFrame。核心代码在 mootdx/quotes.py、mootdx/reader.py 和 mootdx/affair.py,Python 3.8+ 即可运行。

安装一条命令的事,不清楚依赖关系就装完整版:

# 安装所有依赖, 新手推荐 pip install -U 'mootdx[all]' # 只需要离线解析, 装核心版就够 pip install 'mootdx'

装好之后别急着写代码,先回答一个问题:你要的数据现在在哪?

数据在哪,决定你走离线还是在线

同一个"600036 的日线",来源可以是本地文件,也可以是行情服务器,走法完全不同:

离线读本地文件(Reader)在线连行情服务器(Quotes)
需要通达信下载过的vipdoc数据目录不需要任何本地数据,网络能通就行
回测、因子计算、批量历史扫描,读多少算多少不花流量盘中监控、收盘后补当日数据
速度快且稳定,文件在本地想读几遍读几遍数据最新,但依赖服务器质量,需要测速和重连兜底
本地没更新就会缺最新一天历史数据也在线取,适合无客户端的 Linux 服务器

对号入座:回测为主、本地有数据目录,优先离线;盯盘、要当天最新价,走在线;两边都有,就把在线当补丁,离线当底仓。想两条腿都走也没关系,后面拆 API 的顺序正好按这条数据流来。

行情客户端怎么建:先选服务器再连

建客户端是第一步,market='std'表示沪深股票市场,heartbeat=True开心跳保活,timeout设成 15 秒比较稳:

from mootdx.quotes import Quotes client = Quotes.factory(market='std', heartbeat=True, timeout=15) print(client) # 能打印说明连接成功

白话:这一行等于"挑好服务器、连上电话、留个保活信号"。服务器挑得好不好直接决定后面每次取数的延迟,所以下一节取数之前,先确保连的是快的那家。

在线行情怎么取:报价、K 线、指数一次拿

客户端建好,取数就是调方法的事。quotes传列表能一次批量取实时报价,bars用start/offset分段拉 K 线,index取指数:

quote = client.quotes(['000001', '600519']) # 一次网络请求取多只 bars = client.bars(symbol='600036', frequency=9, start=10, offset=20) # 第 10 根起共 20 根日 K zs = client.index(symbol='399001', frequency=9, offset=5) # 深证成指最近 5 根 print(quote['code'].tolist()) print(bars.tail())

白话:把quotes理解成"一次问好多只股票现在多少钱",把bars理解成"翻账本,从第几行翻、翻几行"。frequency传的是周期编码,别猜,后面避坑清单里有对照。K 线拿到手之后,自然要和本地文件里的历史对一对。

本地历史 K 线怎么读:Reader 解析 vipdoc 文件

Reader读的是通达信数据目录(tdxdir)下的vipdoc/sh|sz/lday/*.day等文件,不需要打开通达信客户端,目录在就行:

from mootdx.reader import Reader reader = Reader.factory(market='std', tdxdir='C:/new_tdx') daily = reader.daily(symbol='600036', adjust='qfq') # 日线 + 前复权 min1 = reader.minute(symbol='600036', suffix=1) # 1 分钟线 fz = reader.fzline(symbol='600036') # 5 分钟线 print(daily.tail()) print(min1.shape, fz.shape)

白话:daily/minute/fzline就是"日线、一分钟、五分钟"三个抽屉,suffix决定开哪个抽屉,.day、.lc1、.lc5这些二进制格式它内部自己认。离线数据在手,最后一块拼图是基本面。

财务数据怎么下载:先列清单再解析

Affair.files()先拉远程文件清单,Affair.parse负责"下载 + 解析",文件不在本地时会先自动下载:

from mootdx.affair import Affair files = Affair.files() # 远程财报文件列表 target = files[0]['filename'] # 形如 gpcw20170930.zip data = Affair.parse(downdir='cwdata', filename=target) # 不存在则先下载 print(data.shape) print(data.columns[:6])

白话:财报在远程是按"季度压缩包"整包存的,你拿到手后不用翻 PDF,直接是一张表。字段含义(哪一列是每股收益、哪一列是净资产收益率)在 财务字段对照表 里查得到。接口都熟了,咱们串一个真实场景试试手。

实战:给 5 只自选股批量打标签,本地数据兜底

这个场景贴近日常:每只想给自选股贴一个量价标签——放量、缩量、年新高、年新低,数据不够新或拿不到时用本地文件兜底。

第 1 步:在线拉 250 根日 K,算标签

250 根大约覆盖一个交易年,够算年内高低点,offset一次拿够,别循环逐根取:

watch = ['600036', '000001', '600519', '002594', '300750'] def tag(symbol): df = client.bars(symbol=symbol, frequency=9, offset=250) # 约一年日 K vol_ma = df['vol'].rolling(20).mean() # 20 日均量 last, ma = df.iloc[-1], vol_ma.iloc[-1] label = ('放量' if last['vol'] > 2 * ma else '缩量' if last['vol'] < 0.5 * ma else '创年新高' if last['close'] >= df['high'].max() else '创年新低' if last['close'] <= df['low'].min() else '常态') return {'code': symbol, 'close': last['close'], 'label': label} import pandas as pd report = pd.DataFrame([tag(s) for s in watch]) print(report) report.to_csv('tag_report.csv', index=False)

第 2 步:本地文件兜底,顺带交叉验证

在线数据断档时,同代码从Reader取一份本地日线,对齐"行数、最新日期、收盘价"三个点,确认两边数据链路是健康的:

local = reader.daily(symbol='600036') online = client.bars(symbol='600036', frequency=9, offset=1) print(len(local), local.index[-1]) print(len(online), online.index[-1]) print('本地收盘:', local['close'].iloc[-1], '在线收盘:', online['close'].iloc[-1])

三个点全对上,说明本地文件是新的、在线链路也正常,标签结果可以放心落库。到这里,"在线打标 + 离线兜底"的闭环已经跑通,剩下就是避坑和查文档了。

避坑清单:真实会踩的 5 个坑

  1. 先测速再干活。服务器质量直接决定延迟,跑一次python -m mootdx bestip -v -w,最优 IP 会写进~/.mootdx/config.json,之后建客户端自动优先用它。测速输出长什么样,见 bestip 文档。
  2. 断连是常态。行情连接盘中被掐很常见,Quotes底层带自动重试、空结果检测,heartbeat=True能显著降低断连概率,但业务侧最好还是包一层 try/except,失败了降级到离线Reader。
  3. frequency是编码不是秒数。完整对照(0 是 5 分钟、5 周线、6 月线、9 日线、10 季线、11 年线)见 标准行情接口文档。新手最容易踩的:想取日线写了4,拿回来的量纲放大 100 倍(4 是"日 K 小数点 x100"的变体),稳妥做法是用9。
  4. bars单次最多 800 根。源码里offset超过 800 会被截断,想要更早的历史就调大start分段取;批量请求(quotes传列表、offset一次拿够)永远比循环逐只取便宜。
  5. tdxdir必须是"数据目录"而不是安装目录。指向的那个目录下要能直接找到vipdoc,路径不对Reader.factory会直接抛"tdxdir 目录不存在"。另外 Linux/Mac 服务器没装客户端但有vipdoc目录,照样能读;M1 芯片的 PyMiniRacer 有兼容问题,README 里有说明。

坑都列完了,剩下几个高频问题一次说清。

FAQ

Q1:在线 K 线一次最多能取多少?800 根。bars的offset超过 800 会被自动截断,要更早的数据就调大start分段取,或者直接用k(symbol, begin, end)按日期区间取。

Q2:本地文件和在线行情对不上怎么办?先看最新日期。本地文件只有通达信客户端更新行情才刷新,Reader读到的是"最后一次下载时的快照";在线数据是实时的。两边最新日期一致时数据才应该一致。

Q3:复权在哪一步做?在线bars(symbol=..., adjust='qfq')或adjust='hfq',离线daily(symbol=..., adjust='qfq')同理,复权因子库内部会自己拉取,不用手动算。

Q4:财报文件怎么挑?文件名形如gpcwYYYYMMDD.zip,日期就是报告期。先从Affair.files()拿清单挑,parse同时支持.zip和解压后的.dat。

Q5:期货、期权这类扩展市场能读吗?能。Reader.factory(market='ext', tdxdir=...)配合symbol='29#A1801'这种"市场号#代码"格式读日线;在线的 ext 接口目前部分失效,源码里有提示,离线更稳。

延伸阅读

mootdx 就一条主线:在线走Quotes、离线走Reader、财报走Affair,拿到手都是 DataFrame,剩下的交给 pandas。想深入细节,从这两处入手最值:

  • 快速上手:测速、离线、在线、财报的最小示例各一段
  • mootdx/quotes.py:在线行情实现,接口签名都在这里

想找人聊聊踩坑经验?扫上面二维码进交流群。

【免费下载链接】mootdx通达信数据读取的一个简便使用封装项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询