通达信数据读取,Mootdx 三步跑通
【免费下载链接】mootdx通达信数据读取的一个简便使用封装项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx
做量化分析需要 A 股行情数据时,Mootdx 把通达信的数据读取简化成几行 Python 调用:读本地行情文件、拉线上实时行情,直接返回 pandas DataFrame。
它替你省了什么
以前你要:装通达信 → 手动导出 CSV → 写脚本清洗二进制格式 → 转换成 DataFrame → 再喂给策略代码。现在只需要一个tdxdir路径加一个symbol。
痛点就三个:
- 通达信的
.day、.lc1等文件是私有二进制格式,解析要自己逆向 - 线上行情服务器要自己选 IP、管重连
- 本地文件和线上接口各有各的调用方式
Mootdx 把二进制解析、服务器选择、DataFrame 转换这三步直接砍掉了,剩下的是写业务逻辑。
装好,跑通第一行
环境要求
- Python 3.8 及以上
- Windows / MacOS / Linux 均可
- 读本地数据需要装有通达信(
Reader读它的vipdoc数据目录);只拉线上行情不需要
安装
两种装法,按需选择:
| 命令 | 适合谁 |
|---|---|
pip install 'mootdx' | 只用数据读取 |
pip install 'mootdx[all]' | 依赖关系不清时,一步装全 |
验证
import mootdx from mootdx.quotes import Quotes client = Quotes.factory(market='std') print(mootdx.__version__) # 打印版本号,如 0.11.7 print(client.bars(symbol='600036', frequency=9, offset=5)) # 你应该看到一行 open/high/low/close/vol 列的 DataFrame, # 最近 5 根日线,说明连接和解析都通了跑通这 5 行,第一个 API 调用就成了。
能读到哪些数据
- 日线 / 周线 / 月线 K 线:本地
.day文件或线上bars()拉取 - 分钟线:1、5、15、30、60 分钟及 5/15/30 分钟分时线
- 实时行情:五档买卖盘、最新价
- 指数行情:上证指数、深证成指等
- 逐笔成交:
transaction(),含历史日期回补 - 股票列表与总数:
stocks()、stock_count() - 财务摘要:
finance(),市盈率等基础字段 - 除权除息记录:
xdxr(),复权计算的输入 - 板块数据:行业、概念、地域及自定义板块
- 财务报表:
Affair下载解析,输出到本地
市场支持上,market='std'覆盖 A 股与指数,market='ext'走扩展市场(期货等),两边是同一套bars/minute接口,不用换写法。
核心用法
读取本地通达信日线:Reader 一个路径搞定
思路:Reader.factory拿到StdReader后按股票前缀自动定位 sh/sz 目录下的.day文件,你只负责给代码。
from mootdx.reader import Reader reader = Reader.factory(market='std', tdxdir='/path/to/your/new_tdx') daily = reader.daily(symbol='600036') print(daily[['open', 'high', 'low', 'close', 'volume']].tail()) # 注意:路径指向 vipdoc 所在目录(通达信安装根目录)不想依赖本地文件,就换成线上接口,代码里只剩一行差异:
from mootdx.quotes import Quotes client = Quotes.factory(market='std') bars = client.bars(symbol='600036', frequency=9, offset=800) print(bars.tail()) # 市场代码不用传,内部按前缀自动识别 sh/sz # 港股等扩展市场换一下工厂参数: ext = Quotes.factory(market='ext') bars2 = ext.bars(market=47, symbol='rb2301', frequency=9)拿到 K 线后,复权和指标都是标准 pandas 操作,这是最高频的用法:
# 在线拉日线,adjust='qfq' 自动取除权除息数据做前复权 df = client.bars(symbol='600036', frequency=9, offset=300, adjust='qfq') df['MA5'] = df['close'].rolling(5).mean() df['MA20'] = df['close'].rolling(20).mean() # 金叉信号:MA5 上穿 MA20 cross_up = (df['MA5'] > df['MA20']) & (df['MA5'].shift(1) <= df['MA20'].shift(1)) print(cross_up[cross_up].index) # 金叉发生的日期 # 不想用内置复权,也可手动:client.xdxr(symbol=...) + mootdx.tools.reversion一个完整流程
以"拉近 1600 根日线 → 算双均线 → 输出金叉信号"为例,分四步。
第 1 步,初始化客户端并分块拉历史数据(单次请求上限 800 根):
from mootdx.quotes import Quotes from mootdx.utils import to_file client = Quotes.factory(market='std') symbol = '600036' parts = [client.bars(symbol=symbol, frequency=9, start=i * 800, offset=800) for i in range(2)]第 2 步,合并成完整序列:
import pandas as pd df = pd.concat(parts).drop_duplicates().sort_index() print(len(df), df.index[0], df.index[-1])第 3 步,算指标并生成信号:
df['MA5'] = df['close'].rolling(5).mean() df['MA20'] = df['close'].rolling(20).mean() signal = ((df['MA5'] > df['MA20']) & (df['MA5'].shift(1) <= df['MA20'].shift(1))) print(signal[signal].index)第 4 步,导出结果:
df.to_csv('signal_600036.csv', index_label='date') # 或用内置封装,按扩展名选 csv/xlsx/json: # to_file(df, 'signal_600036.csv')四步走完,数据落盘,可以直接喂给回测或分析脚本。
容易踩的坑
tdxdir 目录不存在直接抛异常
→ 原因:tdxdir要传通达信安装根目录(里面有vipdoc),不是vipdoc本身。
→ 解法:
from pathlib import Path tdxdir = 'D:/new_tdx' assert Path(tdxdir) / 'vipdoc' in list(Path(tdxdir).glob('vipdoc*'))frequency传错字符串,数据"静默"变成 5 分钟线
→ 原因:字符串不在内置周期表里时不会报错,会回退到第一个周期。
→ 解法:直接用数字周期,日线 9、1 分钟 8、周线 5、月线 6:
client.bars(symbol='600036', frequency=9, offset=10)复权结果出现异常值
→ 原因:adjust='qfq'依赖xdxr数据,没有除权记录的股票拿不到复权因子。
→ 解法:先检查再算:
xd = client.xdxr(symbol='600036') print(len(xd)) # 为 0 说明无除权记录,直接用不复权数据往哪走
返回的是标准 DataFrame,接 backtrader 这类回测框架的 PandasData 直接可用;画图交给 mplfinance,不用自己处理 K 线渲染。日常巡检可以装上 CLI 版(mootdx[cli]),命令行直接查行情。更多接口细节见 docs/api/,跑不通时先看 sample/ 下的basic_reader.py和basic_quotes.py。
Mootdx 做的事就一件:把通达信的本地文件和线上行情变成现成的 DataFrame。现在pip install 'mootdx',然后照着 sample/ 跑一遍basic_quotes.py。
【免费下载链接】mootdx通达信数据读取的一个简便使用封装项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考