mootdx 使用手记:把通达信数据变成几行 Python 代码
【免费下载链接】mootdx通达信数据读取的一个简便使用封装项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx
如果你做过 A 股量化或数据分析,大概率绕不开一个尴尬的处境:行情软件里的数据很好用,但想用 Python 拿数据,要么依赖第三方接口(限频、要钱、不稳定),要么自己逆向通达信的二进制协议(工作量堪比考古)。mootdx 正是冲着这个痛点来的——它把通达信的线上行情接口和本地vipdoc数据文件都封装成了简洁的 Python API,让你用几行代码就能拿到 K 线、分时、财务和除权信息。这篇文章面向刚开始接触它的人,讲清楚它最值得掌握的几条用法,以及我在实践中踩过的坑。
先建立心智模型:mootdx 有两条数据通道
很多人第一次用 mootdx 会困惑:Quotes和Reader到底有什么区别?其实它们的分工非常清晰:
- Quotes走的是网络通道,实时向通达信行情服务器发起请求,适合拿"当下的"行情,比如最新价、当日分时、最近 N 根 K 线。代价是依赖服务器稳定性和网络。
- Reader走的是本地通道,直接解析你电脑上通达信客户端下载好的
vipdoc目录,适合拿"历史的"全量数据,速度快、不占网络。代价是本地文件需要自己维护更新。
把这两条通道想成"水龙头"和"水库":Quotes 是拧开就能出水的龙头,Reader 是存好水的水库。搞清楚这个前提,后面所有示例都能对号入座。
十分钟跑通第一个脚本
先装包。如果搞不清依赖关系,直接装全量版本即可:
pip install -U 'mootdx[all]'安装完成后,用一行代码验证环境:
from mootdx.quotes import Quotes client = Quotes.factory(market='std') print(client.bars(symbol='600036', frequency=9, offset=5))能打印出一张带datetime、open、close、high、low、vol等列的 DataFrame,就说明通道已经打通。从此刻起,你的 Python 环境和通达信行情之间只隔着一个对象。
用 Quotes 拿线上行情:K 线、指数、分时与分笔
Quotes.factory(market='std')返回的是股票市场客户端,market='ext'则对应期货、期权等扩展市场。日常最常用的几个方法:
from mootdx.quotes import Quotes client = Quotes.factory(market='std', multithread=True, heartbeat=True) # 日 K 线,frequency=9 表示日线,一次最多拉 800 根 daily = client.bars(symbol='600036', frequency=9, offset=800) # 指数行情 index_df = client.index(symbol='000001', frequency=9) # 当日分时数据 minute_df = client.minute(symbol='000001') # 历史某一天的分时 hist_minute = client.minutes(symbol='000001', date='20240115') # 分笔成交 tick_df = client.transaction(symbol='000001', offset=100)几个值得记住的细节:
frequency用数字表示周期:0是 5 分钟、4是日线、9也是日线、7/8是 1 分钟。记不住没关系,get_frequency也接受'day'、'1min'这类可读写法。bars单次最多 800 根,想要更长历史,用start参数分页往前翻。- 返回结果统一是 pandas DataFrame,拿到手就能直接做计算,不需要自己处理字节流。
要批量轮询多只股票时,可以自己写一个简单循环,把结果收进字典:
from mootdx.quotes import Quotes client = Quotes.factory(market='std') pool = {} for code in ['000001', '600000', '000858']: pool[code] = client.quotes(symbol=code)用 Reader 啃本地数据:日线、分钟线与板块
如果你的研究需要几年的完整日线,逐根从网络拉既慢又容易被服务器限流。更聪明的做法是让通达信客户端先下载数据,然后用Reader直接解析本地文件。
本地数据的默认目录结构是vipdoc/sz/lday/sz000001.day这类,Reader会自动帮你把股票代码映射到正确的市场路径:
from mootdx.reader import Reader reader = Reader.factory(market='std', tdxdir='C:/new_tdx') # 日线 df_daily = reader.daily(symbol='600036') # 1 分钟线(suffix=1),5 分钟线传 5 df_min1 = reader.minute(symbol='600036', suffix=1) # 分时走势线(fzline) df_fz = reader.fzline(symbol='600036')需要注意两点。第一,tdxdir必须指向真实的通达信安装目录,否则构造会直接抛异常——它是校验入口,不是可选参数。第二,代码里的市场前缀(sh/sz)可带可不带,Reader会智能补全;但如果股票代码以88开头(板块指数),它会被特殊路由到sh目录,这是通达信自己的目录约定。
想批量读取一批股票做本地回测,把上面的调用包一层循环即可,配合find_path还能先探测文件是否存在,避免读到不存在的代码时抛错。
财务数据与除权除息:做基本面研究的两块拼图
财报数据的拉取
mootdx.affair.Affair负责财务数据的下载与解析。整个流程分两步:先看远端有哪些历史财报文件,再按需下载解析:
from mootdx.affair import Affair # 查看可用的财报文件列表(含文件名、哈希、大小) files = Affair.files() # 下载并解析指定文件 df = Affair.parse(downdir='tmp', filename='gpcw20231231.zip') # 只想下载不想解析,用 fetch Affair.fetch(downdir='tmp', filename='gpcw20231231.zip')files()返回的哈希值很有用:它可以作为本地文件是否过期的判断依据。自己维护增量同步时,比对哈希比比对文件名可靠得多。
除权除息与复权
历史行情最隐蔽的坑是"没复权"。遇到分红送转,股价会跳空,直接用原始数据算收益率会得到离谱结果。mootdx 提供了两条解决路径:
- 用
Quotes的xdxr(symbol=...)拉取除权除息明细,拿到送转、分红记录; - 用
mootdx.utils.adjust里的复权工具,把原始行情按前复权/后复权换算。
社区里常见的做法是:原始数据 + 除权明细 → 计算复权因子 → 生成复权后的 K 线。具体接口的入参格式可以查阅 docs/api/quote2.md 和 docs/api/reader.md,里面给了字段级说明。
让程序更稳更快:服务器、心跳与缓存
自动挑一台好服务器
通达信有大量行情服务器,速度天差地别。mootdx 内置了测速逻辑,启动时传入bestip=True会自动挑选延迟最低的节点:
from mootdx.quotes import Quotes client = Quotes.factory(market='std', bestip=True, timeout=10)也可以在命令行单独跑测速,把结果存进配置,之后所有客户端共享这份"最优服务器"清单:
python -m mootdx bestip -vv心跳与自动重连
长连接挂在后台跑定时任务时,服务器可能静默断开。开启heartbeat=True让客户端定期发送心跳包维持连接;万一断线,reconnect()方法会按保存的服务器地址重连。代码里把这些组合起来,就是一套简单的容错机制。
给高频读取加缓存
本地Reader解析文件本身很快,但如果你在循环里反复读同一只股票,仍然建议加一层缓存。mootdx 的工具模块里有一个pd_cache装饰器,专门缓存 DataFrame 结果,还支持过期时间:
from mootdx.utils.pandas_cache import pd_cache @pd_cache(cache_dir='./cache', expired=600) def load_daily(code): reader = Reader.factory(market='std', tdxdir='C:/new_tdx') return reader.daily(symbol=code)十分钟内的重复读取会直接命中磁盘缓存,不再触碰文件。对回测里反复加载全市场数据这种场景,收益非常明显。
命令行:不写代码也能导出数据
mootdx 不只是库,还带了命令行工具。不想打开编辑器时,直接导出数据:
# 导出个股日线到 CSV python -m mootdx quotes 600036 --action=bars --output=out.csv # 读取本地文件导出 python -m mootdx reader 600036 --action=daily --tdxdir=C:/new_tdx --output=out.csv具体子命令的完整参数可以用python -m mootdx --help查看。另外mootdx/tools/tdx2csv.py提供了批量把通达信数据转成 CSV 的函数,适合一次性迁移整个本地数据目录。这些细节都记录在 docs/cli/quotes.md 中。
容易被绊倒的四个地方
结合社区反馈和我的实际使用,有四个问题出现频率最高:
- 扩展市场接口当前不可用。
market='ext'的行情接口在代码里已明确标注"已经失效",做期货、外盘数据时不要指望它,优先考虑本地Reader的扩展市场解析(market='ext'的Reader仍可读取ds目录)。 tdxdir路径必须真实存在。Reader构造时会校验目录,报错信息是tdxdir 目录不存在。先把通达信客户端装好、数据下载到本地,再传路径。- Mac M1 上的 PyMiniRacer 兼容问题。如果你在 Apple Silicon 上安装失败,通常是
py_mini_racer这个依赖的问题,可参考 docs/faq/py_mini_racer.md 的说明处理。 - 一次拉不全的历史数据。
bars单次上限 800 根,拉多年日线或高频数据时要记得分页累加,不要想当然地传一个超大offset。
下一步:从"能跑"到"能算"
到此为止,你已经掌握了一条完整的数据流水线:线上行情用Quotes,本地历史用Reader,基本面用Affair,稳定性靠心跳、重试与缓存。接下来可以按这个顺序继续深入:
- 把 docs/quick.md 里的示例逐个跑一遍,熟悉每个接口的返回字段;
- 用
Reader攒一份全市场日线数据,配合除权明细做复权回测; - 研究
mootdx/utils/holiday.py的交易日历工具,给你的策略加上交易日判断; - 项目仓库里有完整的测试用例(
tests/目录),读测试是最快的用法学习方式。
数据的获取只是量化的第一步,把数据变成可复现的策略逻辑才是真正的挑战。mootdx 把前面那段最枯燥的路替你铺平了,剩下的,交给你。
【免费下载链接】mootdx通达信数据读取的一个简便使用封装项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考