
从零接通通达信数据一份写给量化新手的Mootdx上手手册【免费下载链接】mootdx通达信数据读取的一个简便使用封装项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx一个每天都在发生的困境你辛辛苦苦装好了通达信客户端却在写第一行取数代码时卡住了网上流传的教程要么是十年前的老脚本要么绕不开那些需要逐字节解析的.day二进制文件。更麻烦的是行情数据散落在线上接口本地文件财务压缩包三个互不相通的孤岛里你要为每一种数据各写一套解析器还没开始做策略光取数据就耗掉了一周。这就是Mootdx通达信数据读取的简便封装要解决的问题。它把通达信线上行情、离线数据文件和财务报表三块能力统一收敛成几行 Python 调用你不需要懂二进制结构也不需要关心服务器地址怎么维护。本文会带你沿着先看清全貌、再逐个击破、最后避开坑的路径用可以照抄的代码把这套工具真正跑起来最终搭出一个本地数据采集与简单策略回测的最小闭环。先建立整体认知这个库到底能干什么动手之前先花一分钟看清 Mootdx 的能力边界。它的核心模块只有四个全部集中在mootdx/目录下模块一句话说明典型场景mootdx.quotes.Quotes走网络连接行情服务器拿实时报价、K线、分笔mootdx.reader.Reader直接解析本地通达信数据文件离线批量读日线/分钟线mootdx.affair.Affair下载并解析财务数据压缩包构建基本面因子mootdx.utils.holiday交易日历与节假日判断回测时跳过非交易日一句话记住它们的分工需要现在的数据找 Quotes需要历史的数据找 Reader需要报表的数据找 Affair需要日历的数据找 holiday。后面的每一节我们都按目标 → 步骤 → 验证结果的节奏来走。环境准备两条命令搞定安装先建一个干净的虚拟环境再装包避免和系统里的其他库打架。python -m venv mootdx_env source mootdx_env/bin/activate pip install -U mootdx[all][all]会一并装好命令行工具和扩展依赖如果你只需要核心数据接口pip install mootdx就够了。想从源码体验最新特性可以git clone https://gitcode.com/GitHub_Trending/mo/mootdx后本地安装。装完验证一下版本号和依赖是否就位import pandas as pd from mootdx import __version__ print(fmootdx {__version__} 已就绪pandas {pd.__version__})第一关把线上行情拽下来实时数据获取目标拿到任意股票的最新报价和日K线并且能在断线后自动恢复。步骤Mootdx 用工厂方法Quotes.factory()创建客户端marketstd表示标准股票市场ext则是期货、黄金等扩展市场。构造时建议打开heartbeat心跳保活和bestip自动选优服务器前者防掉线后者帮你避开慢速节点。from mootdx.quotes import Quotes # 1. 创建连接自动挑选最快的行情服务器 client Quotes.factory( marketstd, bestipTrue, # 启动时自动测速选优 heartbeatTrue, # 心跳保活防止连接被服务端断开 timeout10, ) # 2. 拉取多只股票的最新快照 snapshot client.quotes(symbol[000001, 600000, 000858]) print(snapshot[[code, price, vol]].head()) # 3. 拉取日K线frequency9 表示日线offset 控制返回条数 daily client.bars(symbol000001, frequency9, offset60) print(daily.tail())验证结果snapshot应返回一个含code / price / vol等字段的 DataFramedaily应包含open / high / low / close / vol标准OHLCV列。注意bars()每次最多返回 800 条需要更多历史时用start参数分批翻页例如start800取第二页。拿到数据只是第一步。下一步我们把它接到一个简单的双均线信号上验证数据链路是否完整可用# 简单双均线信号金叉做多、死叉观望 daily[ma5] daily[close].rolling(5).mean() daily[ma20] daily[close].rolling(20).mean() daily[signal] (daily[ma5] daily[ma20]).astype(int) print(daily[[close, ma5, ma20, signal]].tail(10))到这里你已经完成了线上取数 → 本地加工 → 生成信号的最小链路。第二关把本地历史数据读出来离线数据解析目标不联网、不装额外数据库直接从通达信安装目录里读历史数据——这在批量回测时速度远快于逐次网络请求。步骤Reader.factory()需要你传入通达信的安装目录注意是数据目录通常叫vipdoc的上一级README 里的示例是C:/new_tdx。它会自动根据股票代码判断市场前缀定位到vipdoc/sh/lday/sh600036.day这类文件。from mootdx.reader import Reader reader Reader.factory(marketstd, tdxdir/path/to/tdx) # 读取单只股票的日线 df reader.daily(symbol600036) print(df.head()) # 批量读取一批股票并统一裁剪到指定日期之后 symbols [600036, 000001, 600519] pool {} for code in symbols: frame reader.daily(symbolcode) if frame is not None and not frame.empty: pool[code] frame[frame[date] 2023-01-01] print({code: len(f) for code, f in pool.items()})验证结果每只股票的daily()返回一个带date / open / close / high / low / vol的 DataFrame。find_path()源码在mootdx/reader.py会自动处理88开头的板块指数和带#的扩展市场代码你不需要自己拼路径。技巧如果tdxdir目录不存在Reader会直接抛异常而不是静默返回空数据——这在你的采集任务里是好事能第一时间暴露配置错误。第三关把财报数据榨出来财务数据下载与解析目标把历史财务数据如gpcw20231231.zip这类压缩包下载到本地并解析成规整的 DataFrame用于基本面过滤。步骤财务数据有两步下载和解析。Affair.files()先从服务器拉取文件清单含文件名、哈希、大小再按需下载。from mootdx.affair import Affair from pathlib import Path download_dir financial_data Path(download_dir).mkdir(exist_okTrue) # 1. 拉取远程文件清单 manifest Affair.files() print(manifest[:3]) # [{filename: gpcw20231231.zip, hash: ..., filesize: ...}] # 2. 只下载本地缺失的文件断点续传式的增量同步 local {p.name for p in Path(download_dir).glob(*.zip)} for item in manifest: if item[filename] not in local: print(f下载 {item[filename]} ...) Affair.fetch(downdirdownload_dir, filenameitem[filename]) # 3. 解析某份文件headerzh 输出中文列名 data Affair.parse(downdirdownload_dir, filenamegpcw20231231.zip, headerzh) print(data.head())验证结果解析结果以股票代码为索引列名是中文财务字段源码映射表在mootdx/financial/columns.py可以直接按列做筛选比如只保留资产负债率低于 50% 的股票。Affair.parse还内置了 MD5 校验重复下载不会造成浪费。第四关别让复权与节假日毁掉你的回测目标让历史K线可交易送转除权后的价格需要复权处理回测里的日期需要跳过休市日。步骤Mootdx 在mootdx/utils/adjust.py提供了复权因子计算在mootdx/utils/holiday.py提供了交易日历。两个工具配合能避免两个新手最常踩的坑用不复权数据算收益、把周末当交易日。from mootdx.utils.adjust import fq_factor from mootdx.utils.holiday import holiday # 1. 判断某天是不是交易日自动跳过周末与法定节假日 if holiday(2024-10-01): print(10月1日不是交易日回测应跳过) else: print(今天是交易日) # 2. 拉取前复权因子用因子把原始K线换算成前复权价 factor_df fq_factor(methodqfq, symbol600036) print(factor_df.head())验证结果holiday()返回布尔值True表示非交易日含周末和节假日逻辑上正好可以放在回测循环的入口做守卫fq_factor()返回每个除权日对应的因子你用它乘上原始价格即可得到连续可比的价格序列。避坑清单开工前先对照这五条与其等报错了再排查不如在一开始就把下面五条养成习惯能帮你省下大量调试时间先确认数据目录再初始化 Reader。Reader.factory()对目录存在性有硬校验先把通达信的数据路径填对比事后看空 DataFrame 更容易定位问题。bars()的 800 条上限是硬限制。需要更长历史时用start翻页拼接或者干脆改用本地Reader读全量日线。财务文件下载要相信哈希校验。Affair会自动跳过本地已存在且校验通过的文件你不用自己写文件是否已下载的判断。网络请求务必设置超时与重试。Quotes内置了基于 tenacity 的重试与断线重连见mootdx/quotes.py的check_empty逻辑但你自己的批量任务里仍建议捕获MootdxException避免单点失败拖垮整个循环。交易日判断用库别自己硬编码。节假日每年都在变holiday()会自动同步最新日历写死日期列表的脚本第二年就会出错。性能调优同样的任务快十倍的写法网络取数的瓶颈通常在往返延迟而不是解析本身。下面这张对照表总结了实践中该做/不该做场景不推荐的做法推荐的做法收益批量取快照循环里逐个quotes(symbol...)一次性传入symbol[a,b,c]列表网络往返次数降为 1大量历史K线反复调bars()翻页用本地Reader直接读文件不再受 800 条限制重复计算的指标每次重算均线/因子用pd_cache装饰器缓存 DataFrame重复调用命中本地 pickle财报数据每次全量下载增量同步比对文件清单只传输新增文件Mootdx 在mootdx/utils/pandas_cache.py里直接内置了一个pd_cache装饰器能把函数的返回结果序列化到本地并带过期时间非常适合缓存重算成本高、更新频率低的数据from mootdx.utils.pandas_cache import pd_cache pd_cache(expired600) # 结果缓存 10 分钟 def load_ma20(symbol: str): client Quotes.factory(marketstd) daily client.bars(symbolsymbol, frequency9, offset100) return daily[close].rolling(20).mean()另一个容易忽略的点是连接生命周期长任务里不要频繁地新建和销毁Quotes客户端连接池和心跳都建好之后尽量复用任务结束后显式调用client.close()释放连接避免句柄泄漏。下一步把今天的三块能力串成一个小工具我们前面已经分别掌握了实时行情、本地历史、财务数据三个能力。现在把它们串成一个采集器 简单回测的完整脚本作为你继续深入的地基from mootdx.quotes import Quotes from mootdx.reader import Reader from mootdx.utils.holiday import holiday class DailyPump: 一个极简的线上补数据 本地算信号 的采集器 def __init__(self, tdxdir): self.live Quotes.factory(marketstd) self.local Reader.factory(marketstd, tdxdirtdxdir) def sync_latest(self, symbol): 把最新 5 根日线合并进本地 DataFrame tail self.live.bars(symbolsymbol, frequency9, offset5) history self.local.daily(symbolsymbol) return history.dropna().append(tail.dropna(), ignore_indexTrue).drop_duplicates(date) def should_trade_today(self, symbol): 仅在交易日输出信号 if holiday(): return None df self.sync_latest(symbol) return df[close].iloc[-1] df[close].rolling(20).mean().iloc[-1] pump DailyPump(tdxdir/path/to/tdx) print(pump.should_trade_today(600036))跑通这个脚本之后你已经具备了继续深入的两条主线一是去读mootdx/源码理解Quotes的重试与心跳机制、Reader的路径匹配规则mootdx/reader.py的find_path很值得读二是对照tests/目录下的测试用例看官方是如何验证每个接口行为的。如果今天的代码有哪里跑不通优先检查三件事虚拟环境是否激活、通达信数据目录路径是否正确、mootdx版本是否最新pip install -U mootdx[all]。数据管道搭好之后剩下的就是把你的策略想法填进should_trade_today里了——那才是真正属于你的工作。【免费下载链接】mootdx通达信数据读取的一个简便使用封装项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考