资讯详情

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

📅 2026/10/21 1:32:31 | 华诺云谱 👁 阅读
三行代码把通达信数据读成 DataFrame:Mootdx Python 读取实战指南
三行代码把通达信数据读成 DataFrameMootdx 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(..., adjustqfq)因子来自外部接口财务数据净资产收益率等支持Affair下载并解析通达信财务文件CLI 批量导出支持mootdx bundle直出 csv/xlsx/h5/json扩展市场期货等不稳定作者在源码中标注 ext 接口已失效谨慎使用底层协议由 tdxpy 实现mootdx 本身依赖很轻Python 3.8 即可跑。30 秒跑通下面 5 行可以直接执行不需要本地数据目录需要联网from mootdx.quotes import Quotes # bestipTrue 会自动挑选当前最快的行情服务器 client Quotes.factory(marketstd, bestipTrue) df client.bars(symbol600036, frequency9, offset10) # frequency9 是日线 print(df.tail())跑通后你手上有了什么一个以交易日为索引的 pandas.DataFrame含 open/high/low/close/vol 字段vol 会自动复制一份叫 volume最后一行是最新一根 K 线。frequency 沿用通达信的编码81 分钟、5周线、6月线、9日线写错编码数据就错了第一次用建议先跑一遍 9 确认。拆解四个核心能力读完后你能独立调用四个入口本地读文件、在线拉行情、做复权、取财务数据。把本地 .dat 文件读成 DataFrame解决数据已经在本地、文件却读不了的问题。把通达信安装根目录交给 Reader它会自己定位市场目录和文件from mootdx.reader import Reader reader Reader.factory(marketstd, tdxdir~/your/tdx) # 替换成你的通达信安装目录 daily reader.daily(symbol600036) # 日线 minute reader.minute(symbol600036) # 1 分钟线 print(daily.tail())daily/minute/fzline 返回的是本地文件里的完整历史没有在线 bars 那种每次 800 条的限制适合搭建本地数据仓库。注意 tdxdir 指向安装根目录含 vipdoc/ 的那层某只票本地没文件时返回 None。在线 K 线、分时、分笔一个 client 搞定本地数据太旧或要拿最新一根 bar 时走在线接口标准市场一个客户端覆盖最常用的调用client Quotes.factory(marketstd, bestipTrue) client.bars(symbol600036, frequency9, offset100) # K 线 client.minute(symbol000001) # 今日分时 client.transaction(symbol000001, offset50) # 分笔成交 client.index(symbol000001, frequency9) # 指数 K 线bars 单次最多返回 800 条源码里强制截断拉更长的历史要用 start 分页。要构建股票池的话client.stocks(market0)取深圳代码列表、market1取上海client.stock_all()一次拿两个市场。取前复权qfq/ 后复权hfq数据新手最常踩的坑不复权的 K 线算收益率除权日会出现假摔。Mootdx 最省事的路径是给 bars 传 adjust除权表也可以自己取回来算qfq client.bars(symbol600036, frequency9, offset100, adjustqfq) # 一行前复权 xdxr client.xdxr(symbol600036) # 除权除息信息供自己计算adjust 参数的复权因子来自新浪的 JS 接口见 mootdx/utils/factor.py并带 24 小时磁盘缓存落在~/.mootdx/caches/当天重复调用不会重复请求。它失败时的表现比较安静坑与调优一节会展开。下载并解析财务数据财务指标不在行情协议里而在通达信的财务文件中。Affair 负责拉取加解析指标编号对照表见 docs/api/fields.md解析结果按编号体系返回几百个指标from mootdx.affair import Affair files Affair.files() # 远程财务文件列表 Affair.fetch(downdirtmp, filenamegpcw20230930.zip) # 下载单个文件名从 files() 里取 df Affair.parse(downdirtmp, filenamegpcw20230930.zip)三个递进实战从单只票、到批量加缓存、再到交给策略三段代码都能直接复制运行安装见文末快速参考卡。单标的日线复权优先失败自动兜底目标是任意一只票都能稳定拿到可用日线先试前复权网络或因子失败就退回不复权并留下日志import logging from mootdx.quotes import Quotes logging.basicConfig(levellogging.INFO) client Quotes.factory(marketstd, bestipTrue) def get_daily(symbol, offset500): 优先前复权空数据或异常时退回不复权 try: df client.bars(symbolsymbol, frequency9, offsetoffset, adjustqfq) if df is None or df.empty: raise ValueError(前复权数据为空) return df except Exception as e: logging.warning(f{symbol} 前复权失败退回不复权: {e}) return client.bars(symbolsymbol, frequency9, offsetoffset) 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(marketstd, bestipTrue) pd_cache(expired3600 * 24) # 同参数同函数体直接命中磁盘缓存 def fetch_daily(symbol, offset800): return client.bars(symbolsymbol, frequency9, offsetoffset) out Path(data/daily) out.mkdir(parentsTrue, exist_okTrue) 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改成 offset500 会自动生成新的缓存文件缓存目录是.pd_cache/想重新拉取删掉即可。不想写代码也有命令行版mootdx bundle -s 600036,000001 -a daily -e csv -o data/。把数据交给自己的策略数据是带 datetime 索引的 DataFrame 后就是标准回测流水线的事了。拿双均线举一个最小的例子from mootdx.quotes import Quotes client Quotes.factory(marketstd, bestipTrue) df client.bars(symbol600036, frequency9, offset300) 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_tdxLinux/macOS 上必须自己传。修复ls ~/your/tdx/vipdoc/sh/lday | head # 能看到 sh600036.day 之类的文件才算路径正确reader Reader.factory(marketstd, tdxdir~/your/tdx) # 指向含 vipdoc 的根目录若某只票确实没有本地文件通达信里没下载过返回 None 属正常改走在线 Quotes 即可。在线返回空表或超时现象bars 返回空 DataFrame或连接超时。根因内置服务器列表不少命中的服务器被墙或慢就会超时、返回空。Mootdx 自带服务器测速结果写进~/.mootdx/config.json。修复python -m mootdx bestip # 测速全部行情服务器把最快 IP 写入配置代码里则给客户端传bestipTrue本文示例均如此长任务再加timeout和heartbeatTrue。另有一个容易忽略的点bars 单次上限 800 条拉长历史用start 800循环分页直到某次返回不足 800 条为止。前复权悄悄返回了不复权数据现象adjustqfq的结果和裸数据一模一样没有任何报错。根因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)取除权表category1 的行含分红/配股/送转字段按除权公式自己算复权因子参考公式在 sample/fuquan.py 的注释里更省事的办法是本地reader.daily拿裸数据、从别的源补一份复权因子。上下游衔接喂给 backtrader 的最小适配层任何回测框架要的都是带时间索引的 OHLCV 序列Mootdx 输出已经是这个形状适配通常只是几行列名重命名。backtrader 的最小写法import backtrader as bt from mootdx.quotes import Quotes client Quotes.factory(marketstd, bestipTrue) raw client.bars(symbol600036, frequency9, offset500) # 保留 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(datanamedf))接 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, bestipTrue).bars(symbol600036, frequency9, offset5).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),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑