ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

4步用mootdx打通通达信数据读取:亲手搭一个行情小工具

4步用mootdx打通通达信数据读取:亲手搭一个行情小工具 4步用mootdx打通通达信数据读取亲手搭一个行情小工具【免费下载链接】mootdx通达信数据读取的一个简便使用封装项目地址: https://gitcode.com/GitHub_Trending/mo/mootdxmootdx 是一个把通达信数据读取包成三行代码的 Python 封装库覆盖线上行情、本地历史数据与财报下载三条数据线。这篇文章带你以做一个个人行情小工具为主线从安装、选服务器、拉数据到踩坑修复完整走一遍读完后你手上会多一个能实时盯盘、能读本地历史、能看财报的可用脚本。动手之前先看清 mootdx 的三张数据牌mootdx 的接口虽然多但底层只有三件事对应三个类一张表就能说清数据需求入口类数据来源典型用途实时行情、K线、分时Quotes通达信行情服务器在线盯盘、选股、做信号本地历史数据Reader本机通达信vipdoc目录离线复盘、回测、批量清洗财务报表Affair通达信财务服务器基本面筛选、财报对比先说结论你 90% 的需求都落在在线拉实时 本地读历史这两个入口上财报是锦上添花。记住这个分类后面每一步都对应其中一张牌思路不会乱。在线文档可随时查快速上手、API 说明、命令行工具。代码不长遇到不确定的参数直接看源码注释最准。第一步装好依赖并锁定一台最快的行情服务器安装很简单新手直接装全家桶避免后续缺命令行依赖# 推荐包含核心依赖 命令行依赖 全部扩展 pip install -U mootdx[all] # 如果你更想跟踪最新源码也可以拉仓库后本地安装 git clone https://gitcode.com/GitHub_Trending/mo/mootdx pip install -U -e mootdx装完先别急着写代码先做一件事——选服务器。通达信行情服务器有几十台响应速度天差地别mootdx 提供了一键测速命令python -m mootdx bestipbestip会并发测试所有已知服务器把最快的那台写进配置文件位于用户主目录下的.mootdx/config.json。为什么先做这步后续Quotes默认从配置里读最优 IP你手动指定的服务器如果已经失效会直接拖垮整个工具的体验。执行pip install -U mootdx[all]安装执行python -m mootdx bestip完成测速打开.mootdx/config.json确认BESTIP已写入这样做的好处工具启动即连上最快节点后续所有请求的延迟都有保障而且bestip写好的配置是持久化的不用每次启动都重测。第二步三行代码接入实时行情关键参数逐个说先验证最小可用闭环——拉一只股票的最新快照from mootdx.quotes import Quotes # marketstd 表示沪深股票想要期货/黄金等扩展市场就传 ext client Quotes.factory( marketstd, bestipTrue, # 启动时自动测速覆盖配置里的旧 IP heartbeatTrue, # 心跳保活长时间空闲不会被服务器踢下线 timeout15, # 单次请求超时上限单位秒网络差可调到 20 ) # 传入字符串或列表都可以返回 pandas DataFrame snap client.quotes(symbol600036) print(snap[[price, last_close, open, high, low, vol]])为什么这些参数这么设heartbeatTrue是盯盘工具的标配。行情连接空闲几分钟后容易被服务器断开有了心跳就不会出现下午一看数据早就停了的尴尬。timeout15是宁可慢一点、不可直接报错的折中。设太小在弱网下频繁失败设太大又会拖住批量任务。bestipTrue每次启动多花一两秒测速换来的是整个会话期间的稳定低延迟对长跑脚本尤其划算。拿到快照后K 线是更常用的数据形态# frequency9 是日线8 是一分钟线字符串写法也支持如 day bars client.bars(symbol600036, frequency9, offset20) print(bars.tail())offset是单次返回条数上限 800超出会自动截断到 800——这个限制直接决定了下一步我们要做的优化。常见坑如果quotes()返回空 DataFrame第一反应不要怀疑代码先跑一遍python -m mootdx bestip换服务器多数情况是连到了失效节点。这样做的好处用最少的参数拿到标准 DataFrame索引、列名都是约定好的后面接任何 pandas 运算都无缝。第三步把本地通达信数据变成可复盘的 DataFrame在线接口适合要什么拿什么但如果你本机装了通达信客户端里面沉淀着几年甚至十几年的历史数据离线读取才是高效玩法。from mootdx.reader import Reader # tdxdir 指向通达信安装目录注意路径里要有 vipdoc 子目录 reader Reader.factory(marketstd, tdxdirC:/new_tdx) # 日线数据对应 vipdoc/sh/lday/ 或 vipdoc/sz/lday/ daily reader.daily(symbol600036) # 1 分钟线vipdoc/*/minline/ min1 reader.minute(symbol600036) # 5 分钟线vipdoc/*/fzline/ min5 reader.fzline(symbol600036)原理拆解通达信把每只股票的行情存成二进制文件路径规律是vipdoc/市场/类型/代码.扩展名。Reader做的事就是按市场自动判断路径sh/sz/bj/扩展市场ds再调用二进制解析器转成 DataFrame。你完全不用关心字节怎么排传个代码就行。如果你要批量读一堆股票可以这样写import pandas as pd from mootdx.reader import Reader reader Reader.factory(marketstd, tdxdirC:/new_tdx) # 遍历代码批量读日线单只失败不影响整体 def load_pool(symbols): rows [] for code in symbols: df reader.daily(symbolcode) if df is not None and not df.empty: df[code] code rows.append(df) return pd.concat(rows) pool load_pool([600036, 000001, 000858]) print(pool.groupby(code).size())这样做的好处历史数据本地读秒级返回、零网络开销回测和批量清洗跑起来又快又稳。第四步用财报数据给股票做一次基本面体检盯盘看的是价格但基本面数据能帮你过滤掉财报暴雷的标的。mootdx 的Affair负责财报文件的全流程列清单、下载、解析。from mootdx.affair import Affair # 1) 查看服务器上有哪些财报文件文件名带季度日期 md5 校验 files Affair.files() print(files[:3]) # [{filename: gpcw20231231.zip, hash: ..., filesize: ...}] # 2) 下载指定季度断点续传靠 md5 判断文件是否已存在 Affair.fetch(downdirfin, filenamegpcw20231231.zip) # 3) 解析成 DataFrame列名是中文索引是股票代码 df Affair.parse(downdirfin, filenamegpcw20231231.zip) print(df.columns[:8])解析出的表结构是一行一只股票、一列一个财务指标。比如你想看一只股票的每股收益排名df Affair.parse(downdirfin, filenamegpcw20231231.zip) # 选几个关键列做体检 keys [每股收益, 每股净资产, 净资产收益率] row df.loc[600036, keys] print(row)常见坑Affair.parse如果本地没有对应文件会自动先下载但文件名必须和files()返回的完全一致别自己脑补日期比如服务器只有gpcw20231231.zip你却写gpcw2023.zip会查不到文件。这样做的好处财报拉取、校验、解析三件事一次封装完你拿到的直接是带中文表头的 DataFrame可以立刻丢进筛选逻辑。提速一步分段翻页 复权把历史数据一次拉全到这里最小可用闭环已经通了。现在做关键优化——拉全历史 K 线。前面说过offset单次上限 800 根约等于 3 年日线。想拿 10 年数据就得分段翻页import pandas as pd from mootdx.quotes import Quotes client Quotes.factory(marketstd, heartbeatTrue) def pull_full_history(symbol, total2400): 分段翻页拉取日线total 为期望的总根数约等于 10 年 frames [] # start 是偏移量第一次取 0-800第二次 800-1600依此类推 for start in range(0, total, 800): part client.bars(symbolsymbol, frequency9, startstart, offset800) if part is None or part.empty: break frames.append(part) return pd.concat(frames).drop_duplicates().sort_index() full pull_full_history(600036) print(full.shape)为什么这样翻页而不是一次要 10000协议层面单次最大 800硬要更多会被静默截断用start分段既能拿全又方便中途断掉重试。另一个高频需求是复权。股票除权除息后价格会跳空直接用原始价算收益率会失真。mootdx 在bars()里内置了复权开关# 前复权以最新价为基准回溯修正历史价 qfq client.bars(symbol600036, frequency9, adjustqfq) # 后复权以最早价为基准适合长期收益测算 hfq client.bars(symbol600036, frequency9, adjusthfq)复权因子来自新浪的除权除息数据xdxr接口 因子修正具体实现可参考仓库里的复权示例和基础复权脚本。这样做的好处一个start循环 一个adjust参数就把历史数据全不全和价格准不准两个经典问题一次解决后续算 MACD、回测收益时不用再返工。踩坑实录三个真实会炸的问题及解法工具写完后实际运行中你会遇到三类问题逐个给解法1. 连上就报错 / 返回空数据多半是默认服务器失效。解法分两步重新执行python -m mootdx bestip更新配置在Quotes.factory()里保持bestipTrue让每次启动自动兜底2. 长时间运行后行情静默停止连接被服务器回收了。解法是heartbeatTrue保活如果还是断可以在主循环里捕获异常后重建client。具体参数细节见 报价 API 文档。3. M1 芯片 Mac 装不上依赖mootdx 的财报解析依赖mini-racer而它在 M1 上有兼容问题安装会失败。解法是改用扩展安装或跳过该依赖详见官方 FAQdocs/faq/py_mini_racer.md。常见坑不要图省事把timeout设成 100长任务遇到故障节点时会卡到怀疑人生保持 15~20 秒配合重试逻辑才是正解。收尾把四步合成一个一键更新看板脚本所有零件都齐了现在合成一个可运行的脚本。它会更新服务器、拉实时快照、补本地历史并把结果落盘为 CSVfrom mootdx.quotes import Quotes from mootdx.reader import Reader from mootdx.utils import to_file import pandas as pd WATCH [600036, 000001, 000858] # 你的自选池 TDXDIR C:/new_tdx # 换成你的通达信安装目录 def update_board(): # 1) 在线拉自选池实时快照 client Quotes.factory(marketstd, bestipTrue, heartbeatTrue) snap client.quotes(symbolWATCH) to_file(snap, board/live.csv) # to_file 支持 csv/xlsx/json/h5 # 2) 离线补一份本地日线 reader Reader.factory(marketstd, tdxdirTDXDIR) rows [reader.daily(symbols) for s in WATCH] to_file(pd.concat(rows), board/history.csv) print(看板更新完成: board/live.csv, board/history.csv) if __name__ __main__: update_board()to_file会根据扩展名自动选导出格式出自 mootdx/utils比手写to_csv省几行。下一步行动把TDXDIR换成你自己的通达信目录、把WATCH换成你真正在盯的代码跑一遍这个脚本然后用 pandas 对history.csv算一次 20 日均线——跑通这一步你就正式上手 mootdx 了。之后再想加功能按在线/离线/财报三张牌对号入座即可。【免费下载链接】mootdx通达信数据读取的一个简便使用封装项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表