mootdx 版本演进全记录:从 v0.7 到 v0.11 的核心能力变迁与源码解析
发布时间:2026/9/18 2:22:56 锦皓数字建站

mootdx 版本演进全记录从 v0.7 到 v0.11 的核心能力变迁与源码解析【免费下载链接】mootdx通达信数据读取的一个简便使用封装项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx本文以仓库 docs/chlog.md 为主线完整梳理 mootdx通达信数据读取封装库从 v0.7.17 到 v0.10.9 的版本演进脉络并深入到 mootdx/quotes.py、mootdx/utils/adjust.py、mootdx/tools/reversion.py、mootdx/cache/file.py 等核心源码还原每一次修复复权问题添加缓存调整 frequency 参数背后的真实实现。读者读完后既能按版本号快速定位能力变更也能理解复权、缓存、交易日历、服务器选路等关键机制的底层原理。一、版本演进总览一条清晰的实用主义迭代路线mootdx 的变更日志展示了一条非常务实的迭代路线几乎所有版本都在围绕数据准确性复权、分钟线倍数、北交所数据、性能异步下载、缓存化、日志开销控制和易用性frequency 字符化、offset 默认值、server 参数、配置文件三个方向打磨。从时间线上看核心里程碑如下版本时间主题v0.7.17 ~ v0.7.212021-09异步化改造、连接优化、配置修复v0.8.0 ~ v0.8.132021-10 ~ 2022-05兼容 Python 3.6~3.10、新浪复权因子、交易日历、板块增删改查v0.9.02022-05frequency 字符化、server 参数、日志可配置、财务表头中文v0.9.102022-12复权数据缓存化、tdxpy 联动升级v0.10.0 ~ v0.10.92023-05 ~ 2023-06按需安装、holiday 缓存、前复权支持、offset 默认 800、ETF 复权修复当前仓库主版本已迭代至 v0.11.7见 mootdx/init.pychlog 中记录的 v0.10.x 能力在现行代码中均有对应实现下文将逐项对照源码说明。二、复权贯穿多个版本的头号工程复权前复权 qfq / 后复权 hfq是变更日志中出现频率最高的话题从 v0.8.0 到 v0.10.9 几乎每个大版本都在调整演进路径清晰可循v0.8.0增加新浪复权因子数据接口对 TDX 行情接口数据进行复权计算较慢已加缓存机制暂时过渡使用v0.9.0复权算法已经修复v0.9.10复权数据加缓存当天数据不会重复读取除权接口v0.10.0修正前复权计算错误问题v0.10.1修正读取通达信本地数据复权问题v0.10.3k, ohlc 接口支持前复权功能、修正后复权功能xdxr 进行缓存化加速v0.10.9修复 ETF 基金前后复权问题。2.1 复权在接口层的接入方式复权功能通过adjust参数对外暴露该参数在 mootdx/utils/init.py 的to_data函数中被解析adjust kwargs.get(adjust, ).lower() if adjust in [01, qfq, before]: adjust qfq elif adjust in [02, hfq, after]: adjust hfq else: adjust None也就是说无论传入qfq、01还是before最终都会归一化为qfqhfq、02、after归一化为hfq。解析完成后to_data会调用 mootdx/utils/adjust.py 的to_adjust进而走 mootdx/tools/reversion.py 的reversion主函数完成实际计算。对应 v0.10.3 的k, ohlc 接口支持前复权功能实际调用方式为参考 sample/fq.py 与 sample/fuquan.pyfrom mootdx.quotes import Quotes client Quotes.factory(marketstd) # 前复权日 K df_qfq client.k(symbol600036, begin2020-01-01, end2021-01-01, adjustqfq) # 后复权日 Kohlc 是 k 的别名 df_hfq client.ohlc(symbol600036, begin2020-01-01, end2021-01-01, adjusthfq)在 mootdx/quotes.py 中k与ohlc的关系一目了然ohlc只是k的直接别名二者共用get_k_data内部实现按日期区间自动分页拉取日线每页 800 条并去除节假日估算。2.2 xdxr 缓存化v0.9.10 / v0.10.3 的关键改动复权数据加缓存当天数据不会重复读取除权接口v0.9.10与xdxr 进行缓存化加速v0.10.3在源码中的落点是 mootdx/utils/adjust.pydef get_xdxr(symbol): file_cache(filepathPath(get_config_path(fxdxr/{symbol}.plk)), refresh_time3600 * 24) def _xdxr(symbol): xdxr Quotes.factory(std).xdxr(symbolsymbol) ...除权除息信息xdxr被序列化为~/.mootdx/xdxr/{symbol}.plk缓存文件refresh_time3600 * 24表示一天内不重复请求除权接口。这既缓解了行情服务器的压力也让复权计算在重复调用时更快。2.3 复权算法两种路径的分工v0.9.0 修复后的复权算法在 mootdx/tools/reversion.py 中呈现为双路径设计ETF/基金路径etf_reversionv0.10.9 修复 ETF 基金前后复权问题正是修改了这里。reversion中通过symbol[:2] in [15, 16, 50, 51]识别 ETF/基金代码走etf_reversionmootdx/tools/reversion.py。ETF 复权利用 xdxr 中category11的suogu缩股字段前复权把suogu向前移动一天后对 OHLC 做除法后复权则用ffill填充后做乘法。股票路径factor_reversion通过 mootdx/utils/factor.py 获取复权因子对 OHLC 逐列乘因子前复权用bfill填充因子后复权用ffill。另外仓库还保留了一套基于分红/配股/送转股逐日重算的_reversion与baoli_qfq算法mootdx/tools/reversion.py、mootdx/tools/reversion.py计算前日收盘价的公式为preclose (close * 10 - fenhong peigu * peigujia) / (10 peigu songzhuangu)前复权时adj (preclose.shift(-1) / close).fillna(1)[::-1].cumprod()后复权则改为正向cumprod()并做除法——这正是前复权/后复权在数学上的核心差异。相关测试见 tests/test_adjust.py、tests/test_adjust2.py 与 tests/test_xdxr.py。三、缓存机制holiday、xdxr 与复权因子的统一底座v0.10.1 是一个缓存主题的版本holiday 添加缓存并增加测试代码、添加缓存模块并增加测试代码、js_decode 文件分离。3.1 通用缓存装饰器添加缓存模块指 mootdx/cache/file.py 的file_cache装饰器它目前被 holiday、xdxr、复权因子三处共用def file_cache(filepath: PathLike, refresh_time: Optional[float] None): ... if refresh_time is not None and os.path.getmtime(filepath) int(refresh_time) time.time(): raise FileNeedRefresh(f{filepath} 太旧需要刷新) dataframe: pd.DataFrame pd.read_pickle(filepath)核心逻辑缓存文件存在且未超过refresh_time秒时直接read_pickle返回否则执行被装饰函数并to_pickle落盘。数据统一以 pandas pickle.plk格式存储在~/.mootdx配置目录下。3.2 holiday 缓存的落地v0.10.1 给 holiday 加的缓存实现在 mootdx/utils/holiday.pyholidays()内部把拉取新浪交易日历 → JS 解密 → 转 DataFrame整段逻辑用file_cacheretry5 次重试、间隔 2 秒双重装饰缓存文件为~/.mootdx/caches/holidays.plk若远程数据为空还会主动删除缓存文件避免脏缓存。v0.10.4 修复的holiday 缓存异常问题正是围绕这套机制。js_decode 文件分离则指解密脚本被独立为 mootdx/utils/holiday.js运行时由 Python 读取并通过py_mini_racer执行依赖安装说明见 docs/faq/py_mini_racer.md。v0.9.0 提到的恢复了 holiday2对应holiday2()函数用于按日期过滤历史交易日历。3.3 新浪复权因子的过渡性缓存v0.8.0 说明增加新浪复权因子数据接口并对 TDX 行情接口数据进行复权计算较慢已加缓存机制暂时过渡使用。该接口即 mootdx/utils/adjust.py 的fq_factor请求新浪hfq.js/qfq.js接口解析 JSON同样带 5 次重试对应文档为 docs/api/quote1.md。四、行情接口frequency 字符化与 offset 默认值4.1 v0.9.0frequency 由数字改为字符v0.9.0 的说明非常具体调整 K 线数据频次参数frequency的赋值方式原数字方式改成字符例如原 15 分钟线值1改为15m。这一改动的实现位于 mootdx/utils/init.pyFREQUENCY [5m, 15m, 30m, 1h, days, week, mon, ex_1m, 1m, day, 3mon, year] def get_frequency(frequency) - int: try: if isinstance(frequency, str): frequency FREQUENCY.index(frequency) if isinstance(frequency, int): frequency frequency except ValueError: frequency 0 return frequency字符频次会映射到 TDX 协议内部的数字代号索引位置例如15m对应索引 1day/days对应 9日线5m对应 0。bars、index_bars、index、minute(s)等接口统一经过get_frequency归一化见 mootdx/quotes.py。代码中保留的注释FREQUEN [48, 16, 8, 4, 1, ...]正是旧版数字映射的痕迹。4.2 v0.10.8offset 默认值统一为 800v0.10.8 所有接口 offset 默认值调整 800对应 mootdx/quotes.py 中bars、index_bars、index、transaction、transactions等方法的签名统一为offset800。同时可转债和基金分钟线倍数问题在get_stock_marketmootdx/utils/init.py中有迹可循可转债前缀113、132被明确归入沪市12、13、15、16、18、30等基金/转债前缀归入深市保证分钟线与倍数计算时市场归属正确。4.3 v0.10.8 的进度条与 v0.10.1 的分钟线进度条调整为 ASCII 方式stocks()与instruments()中的tqdm(..., asciiTrue)mootdx/quotes.py、mootdx/quotes.py避免在部分终端出现渲染异常v0.10.1 minute 接口数据异常修复使用 minutes 获取当天数据即可minute()内部直接调用minutes(symbol, datetoday)mootdx/quotes.py即当天分时数据统一走历史分时接口。4.4 DataFrame 输出细节v0.8.6 自动以时间作为 index 优化性能与vol 增加别名 volume均在to_data中实现——存在datetime或date列时设为索引存在vol列时自动追加volume列mootdx/utils/init.pyv0.8.4 接口重试失败抛异常改为返回空 DataFrame可用df.empty判断对应to_data的空值分支return pd.DataFrame(dataNone)调用方据此可用df.empty优雅判断。五、服务器选路与连接bestip、server 参数与超时重连5.1 v0.9.0新增 server 参数v0.9.0 给出的示例client Quotes.factory(marketstd, server(127.0.0.1, 7727), verbose0, quietTrue)server参数校验逻辑在 mootdx/quotes.py 的valid_server中接受(ip, port)元组/列表用ipaddress.ip_address校验 IP 合法性格式错误抛出ValueError(Server 格式错误. 例如: server (127.0.0.1, 2272))。指定 server 后StdQuotes.__init__会把它写入配置BESTIP.HQmootdx/quotes.py。5.2 bestip 异步化v0.7.17 / v0.7.18v0.7.17 调整 logger使用异步方式选择最优服务器 ipv0.7.18 bestip 验证最快服务器接口实现异步v0.8.0 修复获取最快服务器 IP在 jupyter 中使用失败问题。bestip 逻辑集中在 mootdx/server.pyBaseQuotes.__init__中bestip and check_server(syncTrue)mootdx/quotes.py可主动触发测速选路配置文件缺失时config.setup()也会自动调用bestip(consoleFalse, limit5, syncFalse)生成配置mootdx/config.py。相关命令行用法见 docs/cli/bestip.md。5.3 超时自动重连v0.7.18 / v0.8.0v0.7.18 增加超时自动重连接机制再也不需要手动重新连接v0.8.0 修正行情服务器连接超时重写连接失败的问题。现行实现有两层StdQuotes构造时通过TdxHq_API(heartbeat..., auto_retry..., raise_exception...)透传自动重试参数mootdx/quotes.pyBaseQuotes提供reconnect()与closed属性mootdx/quotes.py扩展市场接口则统一用retry(waitwait_random(min1, max10), stopstop_after_attempt(3))装饰器包裹空结果还会触发check_empty重连告警mootdx/quotes.py。六、配置与日志从影响性能的抱怨到可配置6.1 日志等级可配置v0.9.0与日志关闭v0.8.4v0.9.0 明确回应了社区反馈日志等级调整为自行可配置之前有反馈说日志等级太低太多无用日志影响性能构造函数调整。v0.8.4 则增加日志关闭参数有人反映打印日志影响性能——即构造参数verbose0同时可配合quietTrue静默。日志实现在 mootdx/logger.pyStdQuotes中self.verbose kwargs.get(verbose, False)控制调试输出mootdx/quotes.py。6.2 配置文件的生成与修复v0.7.20 / v0.7.21v0.7.20 修复配置文件无法找到的问题v0.7.21 修复配置文件无法找到的 BUG上个版本修复不完善。现行 mootdx/config.py 的setup()采用找不到配置 → 自动测速生成 → 再次加载的容错流程配置落盘于~/.mootdx/config.json由 mootdx/utils/init.py 的get_config_path保证目录自动创建。默认settings结构为settings { SERVER: {HQ: HQ_HOSTS, EX: EX_HOSTS, GP: GP_HOSTS}, BESTIP: {HQ: , EX: , GP: }, TDXDIR: C:/new_tdx, }其中TDXDIR是本地通达信数据目录供 reader 读取本地数据使用对应 v0.7.17 多种线路配置方案配置文件环境变量等。七、板块操作、财务数据与数据转换工具7.1 自定义板块增删改查v0.8.13 / v0.9.0v0.8.13 引入自定义版本增删改查v0.9.0 自定义板块函数调整添加增、删、改、查操作。相关实现位于 mootdx/tools/customize.py接口说明见 docs/api/extras.md 的自定义板块章节测试见 tests/tools/test_customize.py。7.2 财务数据表头中文与异步化v0.9.0 / v0.7.17 / v0.7.18v0.9.0 财务数据的表头转为中文使用时更加直观对应 mootdx/financial/columns.py 的中文列名映射v0.7.17 财务数据调整为异步下载方式性能提升十几倍、v0.7.18 财务数据下载更换为异步性能提升 6 倍、重写了专业财务数据接口财务下载逻辑集中在 mootdx/financial/ 模块base.py、financial.py命令行入口为 mootdx/tools/DownloadTDXCaiWu.py命令行文档见 docs/cli/affair.md。7.3 tdx 导出 txt 转 csvv0.7.19v0.7.19 增加将 tdx 导出的 txt 文件转换为标准 csv 文件的接口实现在 mootdx/tools/tdx2csv.py测试见 tests/tools/test_tdx2csv.py。八、兼容性与市场覆盖Python 版本与北交所v0.8.0目前完全兼容 Python 3.6, 3.7, 3.8, 3.9, 3.10 版本v0.10.3Python 版本支持 3.8 ~ 3.11见 pyproject.toml 与 tox.ini 的测试矩阵v0.8.7解决北交所股票不能获取数据问题get_stock_market中4、8开头的代码归入bj市场mootdx/utils/init.py并使用东方财富接口补充京 A 股实时行情stock_bj_av0.7.17中的修复科创板行情数据无法下载问题可转债历史数据获取识别添加 113 开头等条目同样在get_stock_market的前缀规则中固化下来68开头为科创板、113/132开头为可转债归沪市。九、完整版本变更速查表以下为 docs/chlog.md 的完整条目供升级与排查问题时速查版本时间要点v0.10.92023-06-30修复 ETF 基金前后复权问题v0.10.82023-06-30可转债和基金分钟线倍数问题所有接口 offset 默认值调整 800进度条调整为 ASCII 方式v0.10.72023-06-06修正复权问题若干小 bug 修改v0.10.62023-05-29若干小 bug 修改v0.10.52023-05-26若干小 bug 修改v0.10.42023-05-22调整加速获取股票除权信息数据修改 holiday 缓存异常问题v0.10.32023-05-11k、ohlc 接口支持前复权功能Python 版本支持 3.8~3.11修正后复权功能xdxr 进行缓存化加速v0.10.12023-05-10holiday 添加缓存并增加测试代码添加缓存模块并增加测试代码js_decode 文件分离minute 接口数据异常修复使用 minutes 获取当天数据修正读取通达信本地数据复权问题v0.10.02023-05-09移除非必要依赖实现按需安装修正板块文件 incon.dat 路径错误修正前复权计算错误问题v0.9.102022-12-05修复若干小问题修复升级 mootdx 不能自动升级 tdxpy 问题复权数据加缓存当天数据不重复读取除权接口v0.9.02022-05-13自定义板块函数增、删、改、查日志等级可配置frequency 由数字改字符15 分钟线1→15m增加 server 参数日志过滤调整恢复 holiday2财务数据表头转中文复权算法修复v0.8.132022-05-07自定义版本增删改查见 docs/api/extras.mdv0.8.72021-01-28解决北交所股票不能获取数据问题v0.8.62021-01-26修正 holiday 逻辑错误df 类型数据自动以时间作为 index 优化性能vol 增加别名 volumev0.8.42021-12-04接口重试失败改返回空 DataFrame可用 df.empty 判断增加日志关闭参数v0.8.02021-10-25修复最快服务器 IP 在 jupyter 中失败问题重写连接失败逻辑完全兼容 Python 3.6~3.10添加交易日历列表数据增加新浪复权因子数据接口并对 TDX 行情复权带缓存过渡v0.7.212021-09-24修复配置文件无法找到的 BUG上个版本修复不完善v0.7.202021-09-22修复配置文件无法找到的问题清理垃圾代码更新文档增加测试代码v0.7.192021-09-18增加 tdx 导出 txt 转标准 csv 接口v0.7.182021-09-14修正文档错误财务数据下载异步化性能提升 6 倍bestip 异步化增加测试用例增加超时自动重连接机制v0.7.172021-09-12财务数据异步下载性能提升十几倍异步选择最优服务器 IP解决行情服务器超时返回空数据增加同花顺复权数据接口修复分钟线读取 bug优化行情服务器连接自定义板块添加数据增加复权因子接口修复科创板数据下载修复本地数据读取路径增加扩展市场分钟线读取可转债识别113 开头多种线路配置方案重写专业财务数据接口全面支持 Python3通达信客户端文件转换通达信在线行情下载十、小结从变更日志看懂 mootdx 的设计取舍纵观 docs/chlog.md 与现行源码mootdx 的演进始终围绕三条主线正确性优先复权从新浪因子过渡方案逐步收敛为xdxr 缓存 ETF 专路径 因子复权的完整体系这是 v0.8.0 至 v0.10.9 反复迭代的成果性能敏感异步下载、复权/节假日缓存、日志可配置、进度条 ASCII 化处处体现对影响性能反馈的快速响应接口易用frequency 字符化、offset 统一默认值、server 参数、财务中文表头降低了新手使用门槛。如需进一步查看各能力的详细用法可继续阅读 docs/api/quote1.md复权与行情接口、docs/api/extras.md板块等扩展能力、docs/api/affair.md财务数据以及 sample/fq.py、sample/basic_quotes.py 等示例代码。【免费下载链接】mootdx通达信数据读取的一个简便使用封装项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。