三行代码把通达信数据读成 DataFrame:Mootdx Python 读取实战指南

三行代码把通达信数据读成 DataFrame:Mootdx Python 读取实战指南

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

场景:卡在 .dat 文件上

你机器上装着通达信,K 线却躺在vipdoc/sh/lday/sh600036.day这类二进制文件里,文本编辑器打不开,手动导 CSV 又麻烦——这篇带你用 Mootdx 把本地 .dat 和在线行情都读成 pandas.DataFrame。

看一眼能力表:Mootdx 能做什么

Mootdx 是一个"通达信数据读取"的 Python 封装:一边解析你本机的通达信数据目录,一边直连通达信行情服务器(不装客户端也能拉数据),输出统一为 pandas.DataFrame。读完这节能判断它适不适合你的场景:

数据/能力类别是否支持备注
本地日线(.day 文件)支持Reader.daily,自动匹配 sh/sz 目录
本地 1 分钟 / 5 分钟线支持Reader.minute/Reader.fzline
在线 K 线 / 分时 / 分笔支持Quotes.bars/minute/transaction
前复权 qfq / 后复权 hfq支持bars(..., adjust='qfq'),因子来自外部接口
财务数据(净资产收益率等)支持Affair下载并解析通达信财务文件
CLI 批量导出支持mootdx bundle直出 csv/xlsx/h5/json
扩展市场(期货等)不稳定作者在源码中标注 ext 接口已失效,谨慎使用

底层协议由 tdxpy 实现,mootdx 本身依赖很轻,Python 3.8+ 即可跑。

30 秒跑通

下面 5 行可以直接执行,不需要本地数据目录,需要联网:

from mootdx.quotes import Quotes # bestip=True 会自动挑选当前最快的行情服务器 client = Quotes.factory(market='std', bestip=True) df = client.bars(symbol='600036', frequency=9, offset=10) # frequency=9 是日线 print(df.tail())

跑通后你手上有了什么:一个以交易日为索引的 pandas.DataFrame,含 open/high/low/close/vol 字段(vol 会自动复制一份叫 volume),最后一行是最新一根 K 线。frequency 沿用通达信的编码:8=1 分钟、5=周线、6=月线、9=日线,写错编码数据就错了,第一次用建议先跑一遍 9 确认。

拆解四个核心能力

读完后你能独立调用四个入口:本地读文件、在线拉行情、做复权、取财务数据。

把本地 .dat 文件读成 DataFrame

解决"数据已经在本地、文件却读不了"的问题。把通达信安装根目录交给 Reader,它会自己定位市场目录和文件:

from mootdx.reader import Reader reader = Reader.factory(market='std', tdxdir='~/your/tdx') # 替换成你的通达信安装目录 daily = reader.daily(symbol='600036') # 日线 minute = reader.minute(symbol='600036') # 1 分钟线 print(daily.tail())

daily/minute/fzline 返回的是本地文件里的完整历史,没有在线 bars 那种每次 800 条的限制,适合搭建本地数据仓库。注意 tdxdir 指向安装根目录(含 vipdoc/ 的那层);某只票本地没文件时返回 None。

在线 K 线、分时、分笔一个 client 搞定

本地数据太旧或要拿最新一根 bar 时走在线接口,标准市场一个客户端覆盖最常用的调用:

client = Quotes.factory(market='std', bestip=True) client.bars(symbol='600036', frequency=9, offset=100) # K 线 client.minute(symbol='000001') # 今日分时 client.transaction(symbol='000001', offset=50) # 分笔成交 client.index(symbol='000001', frequency=9) # 指数 K 线

bars 单次最多返回 800 条(源码里强制截断),拉更长的历史要用 start 分页。要构建股票池的话,client.stocks(market=0)取深圳代码列表、market=1取上海,client.stock_all()一次拿两个市场。

取前复权(qfq)/ 后复权(hfq)数据

新手最常踩的坑:不复权的 K 线算收益率,除权日会出现假摔。Mootdx 最省事的路径是给 bars 传 adjust;除权表也可以自己取回来算:

qfq = client.bars(symbol='600036', frequency=9, offset=100, adjust='qfq') # 一行前复权 xdxr = client.xdxr(symbol='600036') # 除权除息信息,供自己计算

adjust 参数的复权因子来自新浪的 JS 接口(见 mootdx/utils/factor.py),并带 24 小时磁盘缓存(落在~/.mootdx/caches/),当天重复调用不会重复请求。它失败时的表现比较安静,"坑与调优"一节会展开。

下载并解析财务数据

财务指标不在行情协议里,而在通达信的财务文件中。Affair 负责拉取加解析,指标编号对照表见 docs/api/fields.md,解析结果按编号体系返回几百个指标:

from mootdx.affair import Affair files = Affair.files() # 远程财务文件列表 Affair.fetch(downdir='tmp', filename='gpcw20230930.zip') # 下载单个,文件名从 files() 里取 df = Affair.parse(downdir='tmp', filename='gpcw20230930.zip')

三个递进实战

从单只票、到批量加缓存、再到交给策略,三段代码都能直接复制运行(安装见文末快速参考卡)。

单标的日线:复权优先,失败自动兜底

目标是任意一只票都能稳定拿到可用日线:先试前复权,网络或因子失败就退回不复权,并留下日志:

import logging from mootdx.quotes import Quotes logging.basicConfig(level=logging.INFO) client = Quotes.factory(market='std', bestip=True) def get_daily(symbol, offset=500): """优先前复权;空数据或异常时退回不复权""" try: df = client.bars(symbol=symbol, frequency=9, offset=offset, adjust='qfq') if df is None or df.empty: raise ValueError('前复权数据为空') return df except Exception as e: logging.warning(f'{symbol} 前复权失败,退回不复权: {e}') return client.bars(symbol=symbol, frequency=9, offset=offset) print(get_daily('600036').tail())

except 分支里"任何异常都兜底"的写法可以复用到你自己的数据层:高级数据源失败时永远有原始数据保底,日志里留原因方便回头排查。

批量拉取加缓存,落盘留底

股票池一长,重复的网络请求是主要成本。用内置的 pd_cache(磁盘 pickle 缓存)加 to_file 把每只票落盘:

from pathlib import Path from mootdx.quotes import Quotes from mootdx.utils import to_file from mootdx.utils.pandas_cache import pd_cache client = Quotes.factory(market='std', bestip=True) @pd_cache(expired=3600 * 24) # 同参数同函数体直接命中磁盘缓存 def fetch_daily(symbol, offset=800): return client.bars(symbol=symbol, frequency=9, offset=offset) out = Path('data/daily') out.mkdir(parents=True, exist_ok=True) for s in ['600036', '000001', '000858', '300750']: try: df = fetch_daily(s) to_file(df, str(out / f'{s}.csv')) print(f'{s} 完成, {len(df)} 条') except Exception as e: print(f'{s} 拉取失败: {e}') # 单只失败不阻塞整批

缓存键是函数体加参数的 md5(见 mootdx/utils/pandas_cache.py),改成 offset=500 会自动生成新的缓存文件;缓存目录是.pd_cache/,想重新拉取删掉即可。不想写代码也有命令行版:mootdx bundle -s 600036,000001 -a daily -e csv -o data/。

把数据交给自己的策略

数据是带 datetime 索引的 DataFrame 后,就是标准回测流水线的事了。拿双均线举一个最小的例子:

from mootdx.quotes import Quotes client = Quotes.factory(market='std', bestip=True) df = client.bars(symbol='600036', frequency=9, offset=300) df['ma5'] = df['close'].rolling(5).mean() df['ma20'] = df['close'].rolling(20).mean() # 金叉买入信号:ma5 上穿 ma20 df['signal'] = ((df['ma5'] > df['ma20']) & (df['ma5'].shift(1) <= df['ma20'].shift(1))).astype(int) print(df[['close', 'ma5', 'ma20', 'signal']].tail(10)) print(f'金叉信号共 {df["signal"].sum()} 个')

索引是 datetime,可以直接按日期切片:df['2024-01':'2024-06']。实际项目里通常按上一节批量拉好落盘,这一步从磁盘读,避免回测时反复打行情服务器。

坑与调优

三个高频坑都按"现象 → 根因 → 修复"给出,对号入座即可。

本地目录错误:Reader 抛异常或返回 None

现象:tdxdir 目录不存在,或者 daily 返回 None。根因:tdxdir 指错层级,Reader 是在安装根目录下找vipdoc/{sh,sz}/lday/*.day(逻辑见 mootdx/reader.py 的 find_path),而代码里的默认值是 Windows 示例路径C:/new_tdx,Linux/macOS 上必须自己传。修复:

ls ~/your/tdx/vipdoc/sh/lday | head # 能看到 sh600036.day 之类的文件才算路径正确
reader = Reader.factory(market='std', tdxdir='~/your/tdx') # 指向含 vipdoc 的根目录

若某只票确实没有本地文件(通达信里没下载过),返回 None 属正常,改走在线 Quotes 即可。

在线返回空表或超时

现象:bars 返回空 DataFrame,或连接超时。根因:内置服务器列表不少,命中的服务器被墙或慢就会超时、返回空。Mootdx 自带服务器测速,结果写进~/.mootdx/config.json。修复:

python -m mootdx bestip # 测速全部行情服务器,把最快 IP 写入配置

代码里则给客户端传bestip=True(本文示例均如此),长任务再加timeout和heartbeat=True。另有一个容易忽略的点:bars 单次上限 800 条,拉长历史用start += 800循环分页,直到某次返回不足 800 条为止。

前复权悄悄返回了不复权数据

现象:adjust='qfq'的结果和裸数据一模一样,没有任何报错。根因:qfq/hfq 因子从新浪 JS 接口取(mootdx/utils/factor.py),请求失败时捕获异常返回空因子,to_data 见空因子就静默跳过复权。修复:先单独验证因子:

from mootdx.utils.factor import fq_factor factor = fq_factor('600036', 'qfq') print(factor.tail()) # 为空说明因子源当前不可达

网络确实不通时,自包含的替代方案是用client.xdxr(symbol)取除权表(category==1 的行含分红/配股/送转字段),按除权公式自己算复权因子,参考公式在 sample/fuquan.py 的注释里;更省事的办法是本地reader.daily拿裸数据、从别的源补一份复权因子。

上下游衔接:喂给 backtrader 的最小适配层

任何回测框架要的都是带时间索引的 OHLCV 序列,Mootdx 输出已经是这个形状,适配通常只是几行列名重命名。backtrader 的最小写法:

import backtrader as bt from mootdx.quotes import Quotes client = Quotes.factory(market='std', bestip=True) raw = client.bars(symbol='600036', frequency=9, offset=500) # 保留 OHLCV 列,vol 改名 volume;索引本身已是 datetime df = raw[['open', 'high', 'low', 'close', 'vol']].rename(columns={'vol': 'volume'}) class MootdxFeed(bt.feeds.PandasData): params = (('open', 'open'), ('high', 'high'), ('low', 'low'), ('close', 'close'), ('volume', 'volume')) cerebro = bt.Cerebro() cerebro.adddata(MootdxFeed(dataname=df))

接 vnpy 则是把df.itertuples()逐行转成 BarData,思路相同;自研 pipeline 最轻量的交接方式是df.to_parquet()落盘,策略端只管读文件。

快速参考卡:安装、配置、验证

安装与验证所需的全部命令都在下面三段里,按顺序执行即可。

# 1. 虚拟环境 + 安装(含 cli 与全部扩展依赖) python -m venv .venv && source .venv/bin/activate # Windows 用 .venv\Scripts\activate pip install 'mootdx[all]'
# 2. 关键路径 # 通达信安装目录: ~/your/tdx 必须包含 vipdoc/ 与 T0002/ # Mootdx 配置目录: ~/.mootdx/ config.json、复权因子等缓存都在这里 python -m mootdx bestip # 行情服务器测速,最优 IP 写入 ~/.mootdx/config.json
# 3. 验证 python -c "from mootdx.quotes import Quotes; print(Quotes.factory('std', bestip=True).bars(symbol='600036', frequency=9, offset=5).tail())" mootdx reader -d ~/your/tdx -s 600036 -a daily -o t.csv # 本地读取并导出 CSV mootdx bundle -s 600036,000001 -a daily -e csv -o data/ # 在线批量导出

下一步

跑通"30 秒"部分后,先读 docs/quick.md,再按需求翻 docs/api/reader.md 与 docs/api/quote1.md 的完整 API。各功能的可运行示例都在 sample/ 目录,建议按 basic_reader、basic_quotes、basic_adjust 的顺序过一遍。遇到扩展市场接口不稳定、复权因子缺失这类问题,先去项目 issue 区搜关键词,这些基本都有前人记录。

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

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

相关新闻

vue3-element-admin:Vue 3 + Element Plus 企业级后台管理前端模板

vue3-element-admin:Vue 3 + Element Plus 企业级后台管理前端模板

vue3-element-admin&#xff1a;Vue 3 Element Plus 企业级后台管理前端模板 【免费下载链接】vue3-element-admin &#x1f525;基于 Vue 3 Vite 7 TypeScript element-plus 构建的后台管理前端模板&#xff08;配套后端源码&#xff09;&#xff0c;vue-element-admin 的 …

2026/10/21 1:32:21 阅读更多 →
Vue项目实时语音转文字:WebSocket鉴权、PCM重采样到结果渲染全解析

Vue项目实时语音转文字:WebSocket鉴权、PCM重采样到结果渲染全解析

简介&#xff1a;科大讯飞实时语音转文字Vue.js版本是一份面向前端开发者的集成示例项目&#xff0c;基于Vue.js调用科大讯飞WebAPI&#xff0c;覆盖会议记录、在线教育、直播互动等实时语音转写场景。资源包共8个文件&#xff0c;含7个JavaScript脚本与1个HTML入口页面&#x…

2026/10/21 1:32:21 阅读更多 →
协同过滤在白酒销售系统中的落地:SpringBoot2+Vue3全栈实战

协同过滤在白酒销售系统中的落地:SpringBoot2+Vue3全栈实战

做白酒销售系统的推荐&#xff0c;一开始我是有点怀疑的。白酒消费和买衣服、买书完全不一样&#xff0c;用户的口味极其固定&#xff0c;喝惯浓香的人不太可能因为推荐就切到酱香。那协同过滤算法在这种场景里到底能干什么&#xff1f;等我把整套系统过完一遍才明白&#xff0…

2026/10/21 1:32:21 阅读更多 →

最新新闻

AI辅助STM32开发实战:从提示词设计到代码审查的完整协同流程

AI辅助STM32开发实战:从提示词设计到代码审查的完整协同流程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/21 2:07:44 阅读更多 →
ZCC485高速超低功耗RS485芯片实战解析

ZCC485高速超低功耗RS485芯片实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/21 2:07:44 阅读更多 →
YiShaAdmin部署避坑指南:10分钟修好启动与连接问题

YiShaAdmin部署避坑指南:10分钟修好启动与连接问题

YiShaAdmin部署避坑指南&#xff1a;10分钟修好启动与连接问题 【免费下载链接】YiShaAdmin 基于 .NET Core MVC 的权限管理系统&#xff0c;代码易读易懂、界面简洁美观 项目地址: https://gitcode.com/GitHub_Trending/yi/YiShaAdmin 大多数人卡在两处&#xff1a;dot…

2026/10/21 2:07:44 阅读更多 →
canmatrix解析DBC文件速度差十倍?字节相同但性能迥异的根因与排查

canmatrix解析DBC文件速度差十倍?字节相同但性能迥异的根因与排查

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/21 2:07:44 阅读更多 →
Robomaster硬件基础实战指南:从冒烟故障到系统级校准

Robomaster硬件基础实战指南:从冒烟故障到系统级校准

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/21 2:07:44 阅读更多 →
Sicar-Training-show-V16工业标准程序复习指南:架构、模块化与易错点

Sicar-Training-show-V16工业标准程序复习指南:架构、模块化与易错点

简介&#xff1a;Sicar-Training-show-V16程序是一套面向工业自动化领域学习者的Sicar标准程序训练示例包&#xff0c;适合正在接触西门子PLC编程、PROFINET通信及分布式IO组态的工程师与院校学生&#xff0c;用于理解标准化程序框架与设备描述文件的组织方式。压缩包为rar格式…

2026/10/21 2:06:44 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事&#xff1a;AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里&#xff0c;按宣传口径&#xff0c;本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”&#xff0c;而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起&#xff1a;用户到底在追求什么“封号重开”这四个字&#xff0c;放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流&#xff0c;背后是大量的时间和精力成本。正常情况下&#xff0c;没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”&#xff0c;而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时&#xff0c;就意识到&#xff1a;单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →