ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Mootdx 实战:3 行代码把通达信本地行情读成 Pandas DataFrame

Mootdx 实战:3 行代码把通达信本地行情读成 Pandas DataFrame

Mootdx 实战:3 行代码把通达信本地行情读成 Pandas DataFrame

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

Mootdx 是通达信数据读取的简便使用封装:离线文件走Reader,在线行情走Quotes,可以把通达信本地的.day、.lc1行情文件和在线 K 线数据直接读成 Pandas DataFrame,省去手工导出再清洗的流程。本文面向希望把通达信数据接入 Python 量化分析的开发者,按安装、首次取数、常用操作、排错的顺序过一遍完整动线。

安装 Mootdx 并验证数据目录

环境要求与数据目录从哪来

  • Python 3.8 及以上,Windows、macOS、Linux 均可运行。
  • 离线数据目录来自通达信终端的安装目录。以C:/new_tdx为例:
    • vipdoc/sh/lday/存放沪市日线文件,vipdoc/sz/lday/存放深市日线文件;
    • 每只股票一个文件,例如sz000001.day就是平安银行的日线数据;
    • T0002子目录存放板块与缓存文件,供block等接口使用。
  • Reader的默认路径是C:/new_tdx,实际使用时通过tdxdir参数指定任意安装目录;在线的Quotes则不需要数据目录。

用 pip 安装并验证版本

pip install 'mootdx[all]' # 只装核心依赖可用: pip install 'mootdx' python -c "import mootdx; print(mootdx.__version__)"

需要命令行工具(mootdx quotes、mootdx reader等批量导出命令)时,改装pip install 'mootdx[cli]'。

五分钟拿到第一份数据

本地已有通达信数据目录时,最小可运行路径只有三行:

from mootdx.reader import Reader reader = Reader.factory(market='std', tdxdir='C:/new_tdx') df = reader.daily(symbol='600036') print(df.head())

几个值得注意的行为:

  • tdxdir必须指向已存在的目录,否则初始化时直接抛出tdxdir 目录不存在,便于尽早发现路径配错;
  • 市场不用自己传,代码前缀会自动判断,内部自行拼出sh600036.day这样的文件路径;
  • 该股票文件不存在时返回空 DataFrame,而不是None;
  • 返回值以时间为索引,vol列会被复制为volume列。

仓库里的 sample/basic_reader.py 给出了分钟、5 分钟与日线读取的完整示例。

支持的数据类型一览

数据类型接口典型用途
本地日线Reader.daily(symbol=...)回测、指标计算
本地 1 分钟 / 5 分钟线Reader.minute(symbol=..., suffix=1)/Reader.fzline(symbol=...)日内数据分析
在线 K 线Quotes.bars(symbol=..., frequency=9, offset=800)获取最新行情
指数 K 线Quotes.index(symbol='000001', frequency=9)大盘指数走势
扩展市场(期货等)Reader.factory(market='ext')+daily(symbol='29#A1801')非 A 股行情
板块数据Reader.block(symbol='block_zs', group=False)行业、概念、地域板块成分
除权除息Quotes.xdxr(symbol=...)前复权 / 后复权
财务文件Affair.files()/Affair.parse(downdir=...)解析公司财务数据

market='std'是 A 股标准市场,'ext'是扩展市场(期货、期权等),两种Reader相互独立。

三个高频操作

读取在线 K 线

在线接口不依赖数据目录,直接连接行情服务器取数。frequency是周期代码(9 为日线),offset是每次获取的条数,内部单次上限为 800 条:

from mootdx.quotes import Quotes client = Quotes.factory(market='std', multithread=True, heartbeat=True) raw = client.bars(symbol='600036', frequency=9, offset=100) # 不复权 qfq = client.bars(symbol='600036', frequency=9, offset=100, adjust='qfq') # 前复权

不复权与复权数据

上面第二行演示了复权写法:bars的adjust参数会被底层的转换函数透传处理,取'qfq'前复权、'hfq'后复权,不传则不复权。除权系数从公开数据源获取,并写入~/.mootdx/xdxr/下的文件缓存,缓存有效期 24 小时,重复调用不会每次都发起请求。

给取数函数加文件缓存

同一份数据被反复读取的场景(批量回测、生成股票列表),可以用mootdx.utils.pandas_cache里的pd_cache装饰器:结果默认 pickle 到.pd_cache目录,expired参数按秒设置过期时间。

from mootdx.utils.pandas_cache import pd_cache @pd_cache(expired=3600) def load_daily(symbol): return reader.daily(symbol=symbol)

常见问题

数据目录定位:报 "tdxdir 目录不存在" 怎么办

结论:tdxdir要传终端安装根目录(vipdoc的上一级),而不是vipdoc本身。先确认路径是否正确:

python -c "import os; print(os.path.isdir('C:/new_tdx/vipdoc'))

输出False说明路径不对;在磁盘上找到vipdoc目录,取其父目录作为tdxdir即可。

市场代码:sh / sz 会自动判断吗

会。离线Reader与在线Quotes都按代码前缀判断:5、6、9 开头(含 50/51/60/68/90 等)归沪市,00/12/13/15/16/20/30/39 等开头归深市,4、8 开头归北交所(bj);代码本身以sh或sz开头时直接按前缀使用。扩展市场使用带#的代码(如29#A1801),会自动路由到对应数据目录,不需要自己换算市场号。

复权结果出现异常值或 NaN

最常见原因是除权系数缺失:内部逻辑先对缺失值做前向 / 后向传播,剩余位置填 1.0(等价于不复权),所以结果可能"看起来没复权"。排查顺序:

  1. 执行client.xdxr(symbol='600036')看除权除息记录是否为空;
  2. 删除~/.mootdx/xdxr/缓存后重新运行,排除过期缓存的影响;
  3. 回测中对比除权日前后的收盘价,正常除权日应能看出复权带来的连续变化。

继续深入

仓库内 docs/quick.md 提供了上述流程的精简版本,以及bestip服务器测速命令;docs/api/reader.md 覆盖了扩展市场与板块读取等离线接口的完整参数;sample/ 下还有在线行情、复权、财务数据的可运行脚本。命令行工具另外提供bundle批量导出行情、mootdx affair下载财务文件两类命令,用法见 docs/cli/。

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

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

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进