用 mootdx 获取通达信数据:3 行代码打通行情、离线历史与财务报表
【免费下载链接】mootdx通达信数据读取的一个简便使用封装项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx
场景:收盘后 15:05,你要拉取 600036 最近 10 根日 K 线,并和本地通达信文件对一遍。用mootdx(通达信数据读取的简便使用封装)只有一行:client.bars(symbol='600036', frequency=9, offset=10),控制台直接打印出带datetime, open, high, low, close, vol列的 DataFrame。在线行情、离线本地数据、财务数据这三条线写法一致,学一遍会三遍。
解决什么问题
| 典型场景 | 对应做法 | 关键类 |
|---|---|---|
| 盘中监控,要实时价格、批量报价 | Quotes.quotes()一次请求传多只代码 | mootdx/quotes.py |
| 回测要完整历史日 K / 分钟线 | Reader直接解析本地vipdoc文件,不连服务器 | mootdx/reader.py |
| 要季度财报文件并转成表格 | Affair列文件 → 下载 → 解析三步走 | mootdx/affair.py |
| 线上、本地数据对不上,需要核验 | 两类返回同构 DataFrame,按日期对齐比较 | quotes.py + reader.py |
核心取舍只有一条:数据在本地就用 Reader,必须在线才用 Quotes。离线读文件最稳,在线取数最新,两者列名一致,可以互相校验。
最小可运行示例
先装依赖,再跑 4 行代码验证在线链路:
pip install -U 'mootdx[all]' # 安装完整依赖集from mootdx.quotes import Quotes client = Quotes.factory(market='std') # std 表示沪深京股票市场 df = client.bars(symbol='600036', frequency=9, offset=10) # 9 是日 K 线 print(df.tail())能打印出 10 行 K 线,说明服务器连接、协议解析都通了。
在线行情:批量报价与多周期 K 线
client = Quotes.factory(market='std', heartbeat=True, bestip=True, timeout=15) print(client.quotes(symbol=['000001', '600036'])) # 批量实时报价,一次请求 print(client.index(symbol='000001', frequency=9)) # 上证指数日 K print(client.bars(symbol='000001', frequency=0, offset=48)) # 5 分钟线frequency是周期编码,常用值:0=5 分钟、1=15 分钟、3=小时线、5=周线、6=月线、8=1 分钟、9=日线。bestip=True会在创建时自动测速选最快服务器,heartbeat=True维持长连接。
离线数据:本地日 K 与分钟线怎么读
from mootdx.reader import Reader reader = Reader.factory(market='std', tdxdir='C:/new_tdx') # 通达信安装目录 daily = reader.daily(symbol='600036') # 读 vipdoc/sh/lday/sh600036.day minute = reader.minute(symbol='600036') # 读 1 分钟线文件不需要打开通达信软件,只要有数据目录。路径由find_path自动拼:它根据代码前缀判断 sh/sz,88开头的板块指数会自动归到 sh 目录下,你不用手写文件路径。
财务数据:财报文件下载与解析
from mootdx.affair import Affair files = Affair.files() # 远程可下载的财报文件列表(含文件名、大小、hash) Affair.fetch(downdir='tmp', filename='gpcw20240930.zip') # 下载单个季度文件 df = Affair.parse(downdir='tmp', filename='gpcw20240930.zip') # 解析成表格parse发现本地缺文件时会先自动下载再解析,一个方法完成两步。
动手做一个小工具:双源日线数据对账
在线数据方便,本地文件稳定。两者对不上时,多半是某一段数据链路出了问题。目标:对指定股票,把最近 30 根日 K 在线、本地各取一份,逐日比较收盘价,差异行写入 CSV。
测速并固定最快的行情服务器
python -m mootdx bestip -v -l 5 # 测量内置服务器组,显示前 5 快最快 IP 会自动写入config.json,之后创建的任何Quotes客户端都会优先用它,后面所有在线取数都受益。
拉取在线日 K 线
from mootdx.quotes import Quotes client = Quotes.factory(market='std', heartbeat=True) watch = ['000001', '600036', '600519'] # 对账清单 online = {code: client.bars(symbol=code, frequency=9, offset=30) for code in watch} # 每只取最近 30 根日 K30 远低于单次 800 根上限,一次请求就够。
读取本地文件对应段
from mootdx.reader import Reader reader = Reader.factory(market='std', tdxdir='C:/new_tdx') local = {code: reader.daily(symbol=code).tail(30).reset_index() for code in watch} # 本地日线是全量文件,取末尾 30 根本地读取不产生任何网络请求,速度取决于磁盘。
对齐日期并比较收盘价
import pandas as pd def to_date(df): out = df[['datetime', 'close']].copy() out['date'] = pd.to_datetime(out['datetime']).dt.strftime('%Y-%m-%d') # 统一成日期 return out rows = [] for code in watch: a = to_date(online[code]).rename(columns={'close': 'close_on'}) b = to_date(local[code]).rename(columns={'close': 'close_loc'}) joined = a.merge(b, on='date', how='outer') # 按日期外连接 rows.append(joined[joined['close_on'] != joined['close_loc']]) # 只留不一致 diff = pd.concat(rows, ignore_index=True) print(diff) # 空表说明两源一致outer连接保证缺日期的行也会暴露出来:某边有、另一边没有,本身就是差异。
输出对账结果到 CSV
diff.to_csv('recon_diff.csv', index=False, encoding='utf-8') print(f'对账完成:差异 {len(diff)} 条,结果写入 recon_diff.csv')有差异时的排查顺序:先看本地目录是否已更新到最近交易日;再看在线是否用了慢速服务器。两边都正常才轮到怀疑数据本身。
真实环境里容易踩的坑
坑 1:创建客户端偶发超时
- 症状:
Quotes.factory()有时直接报超时,隔一会儿又好了。 - 原因:配置文件里记录的是较早测速的服务器,其中部分节点长期不响应。
- 对策:跑一次
python -m mootdx bestip -v -l 5刷新,最快 IP 会写进config.json。
坑 2:本地读取报「tdxdir 目录不存在」
- 症状:
Reader.factory构造时直接抛异常。 - 原因:
tdxdir要指向通达信安装根目录(里面含vipdoc),很多人把路径写成了vipdoc一层。 - 对策:确认
C:/new_tdx/vipdoc/sh/lday/sh600036.day这条完整路径真实存在。
坑 3:offset 给 2000,只返回 800
- 症状:
bars(symbol=..., offset=2000)拿到的是 800 行。 - 原因:通达信协议单次上限就是 800 根,超出部分被自动截断。
- 对策:用
start参数分页多次取;或改用get_k_data(code, start_date, end_date),它按日期范围内部自动分页。
坑 4:盘中取数突然返回空
- 症状:之前一直正常,某个时间点开始返回空 DataFrame。
- 原因:TCP 连接被服务端断开,心跳没跟上。
- 对策:创建客户端时加
heartbeat=True;库内置自动重试,长任务业务侧再包一层异常捕获、重建客户端即可。
常见疑问
Q:必须装通达信软件、注册账号吗?结论:都不用,免费。在线行情直接连接通达信协议的公开行情服务器;离线读取只需要一个标准数据目录(任何通达信安装下的vipdoc),软件本身不是必需品。
Q:market='ext' 是什么市场?结论:std是沪深京股票市场,ext是扩展市场(期货等)。两者用不同服务器组和数据目录,只做股票数据就保持默认std。
Q:K 线数据是复权的吗?结论:默认不复权,是原始价格。在bars等接口上传adjust='qfq'(前复权)或adjust='hfq'(后复权)即可拿到复权结果,复权因子在库内部计算,不需要自己维护除权表。
Q:配置文件在哪,能手动改吗?结论:能。首次创建客户端时若没有config.json,库会自动跑一次测速生成它。也可以用config.set('TDXDIR', 'C:/new_tdx')、config.set('BESTIP', {'HQ': ('202.108.253.131', 7709)})在代码里集中改,入口在 mootdx/config.py。
Q:能不能不写代码直接导出文件?结论:能。命令行自带导出:python -m mootdx quotes -s 600036 -a daily -o out.csv,支持 CSV、Excel、HDF5 等格式;-a可选daily、minute、fzline。代码里就是 DataFrame 的to_csv,一样方便。
下一步
- 对照 docs/quick.md 各跑一遍离线读取和在线行情,确认两端环境都没问题;
- 把
watch列表换成你自己的代码清单,在每天收盘后跑一次上面那段对账,观察recon_diff.csv是否稳定为空; - 想弄清某个接口细节,直接读 mootdx/quotes.py 的源码和
tests/quotes/下的测试用例,参数怎么传一目了然。
环境配置或解析结果有疑问,可加入项目交流群讨论。
【免费下载链接】mootdx通达信数据读取的一个简便使用封装项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考