FEATURED · 精选文章

mootdx 版本演进全解析:从 0.7 到 0.11 的关键技术改进与源码印证

发布时间 / 2026/9/18 13:29:08
来源 / 创域科博编辑部
栏目 / 资讯中心
mootdx 版本演进全解析:从 0.7 到 0.11 的关键技术改进与源码印证 mootdx 版本演进全解析从 0.7 到 0.11 的关键技术改进与源码印证【免费下载链接】mootdx通达信数据读取的一个简便使用封装项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx本文以 mootdx 官方变更历史 docs/history.md 为骨架系统梳理该项目从 v0.7.17 到 v0.11.7 的核心技术演进脉络包括复权算法迭代、缓存与性能优化、服务器选择与自动重连、接口参数调整、财务数据异步化、自定义板块与交易日历等功能改进并结合仓库源码逐一印证每个版本要点的底层实现帮助开发者理解通达信数据读取简便封装这一库的设计意图与最佳用法。一、版本历史总览一条主线四大方向mootdx 是通达信TDX行情数据读取的 Python 封装库核心能力分为在线行情下载Quotes行情接口与通达信客户端本地文件读取Reader两大块。从 docs/history.md 看其版本演进始终围绕四条主线展开复权前复权/后复权算法从 v0.8.0 引入新浪复权因子过渡方案到 v0.10.x 多次修正含 ETF 基金、可转债再到 v0.11.x 收敛为统一的因子复权实现性能优化异步化财务数据、bestip 验证、缓存化holiday、xdxr、复权因子、按需安装依赖稳定性与容错超时自动重连、空数据重试、接口失败返回空 DataFrame、日志可配置接口易用性frequency从数字改为字符、offset默认值统一为 800、server参数支持自定义服务器、财务表头中文化。当前仓库根目录 mootdx/init.py 中__version__ 0.11.7与历史文档最新版本记录2024-05-04完全一致本文介绍的内容即对应仓库当前代码状态。二、复权算法的演进从过渡方案到因子复权复权是行情数据处理中最容易出错的环节也是历史文档中修复次数最多的主题。2.1 v0.8.0引入新浪复权因子过渡方案v0.8.0 首次增加新浪复权因子数据接口并对 TDX 行情接口数据进行复权计算较慢已加缓存机制暂时过渡使用。这一过渡方案在源码中仍有清晰痕迹mootdx/utils/adjust.py 中的fq_factor()直接请求新浪接口https://finance.sina.com.cn/realstock/company/{}/hfq.js后复权与qfq.js前复权解析出复权因子 DataFrame并通过retry(waitwait_fixed(2), ... stopstop_after_attempt(5))做失败重试。同期 v0.8.0 还增加新浪复权因子数据接口并对 TDX 行情接口数据进行复权计算——即to_adjust()函数它先通过get_xdxr(symbol)获取除权除息数据带file_cache缓存再调用 mootdx/tools/reversion.py 中的reversion()完成复权计算。2.2 v0.10.x复权算法密集修复期历史文档记录了这一时期的密集修复v0.10.0修正前复权计算错误问题v0.10.3k、ohlc接口支持前复权功能修正后复权功能xdxr 进行缓存化加速v0.10.7修正复权问题v0.10.9修复 ETF 基金前后复权问题v0.10.10修正基金复权算法v0.10.12修正复权算法开启多线程和自动应答机制pandas 最低版本降至 v1.3.5。这些修复在源码中的落点是 mootdx/tools/reversion.py_reversion(bfq_data, xdxr_data, type_)基于除权除息数据的传统复权算法使用fenhong分红、peigu配股、peigujia配股价、songzhuangu送转股字段计算前收盘价preclose再分别按前复权qfq/01与后复权hfq/02计算累计因子并作用于 OHLC 与成交量etf_reversion(data, xdxr, adjust)针对 ETF 基金使用suogu缩股字段单独处理——前复权用bfill向前传播因子后复权用ffill向后传播对应 v0.10.9/v0.10.10 的基金复权修复factor_reversion(symbol, method, raw)当前主力复权路径从 mootdx/utils/factor.py 的fq_factor()获取新浪复权因子默认前复权qfq对open/high/low/close逐列乘以因子并处理因子空值填充。值得注意的细节reversion()入口处通过if symbol[:2] in [15, 16, 50, 51]判断标的类型——15/16开头为深市基金LOF/ETF50/51开头为沪市 ETF命中即走etf_reversion()否则走通用因子复权。这正是 v0.10.8 修复可转债和基金分钟线倍数问题、v0.10.10修正基金复权算法的实现基础。2.3 v0.8.0 前后同花顺复权数据接口v0.7.17 记录增加同花顺复权数据接口可查看文档辅助函数章节对应源码为 mootdx/contrib/adjust.py 的get_adjust_year()请求http://d.10jqka.com.cn/v2/line/hs_{symbol}/{factor}/{year}.jsfactor支持before/after/01/02四种写法before→01、after→02返回含date/open/high/low/close/volume/amount/adjust列的 DataFrame并带 5 次重试与请求限速time.sleep(0.2)。2.4 复权参数在行情接口中的用法历史文档中复权相关的最终能力通过 mootdx/utils/init.py 的to_data()暴露给用户adjust参数接受01/qfq/before前复权与02/hfq/after后复权三组等价写法命中后自动调用to_adjust()完成复权否则返回不复权原始数据。示例from mootdx.quotes import Quotes client Quotes.factory(marketstd) # 前复权日Kv0.10.3 起 k/ohlc 接口支持 df_qfq client.bars(symbol600036, frequencyday, adjustqfq) # 后复权 df_hfq client.bars(symbol600036, frequencyday, adjusthfq) # 不复权 df_raw client.bars(symbol600036, frequencyday)三、缓存与性能优化holiday、xdxr、复权因子三重缓存性能优化是历史文档的高频主题其核心手段是缓存化 异步化。3.1 缓存模块的诞生与文件化v0.10.1holiday 添加缓存并增加测试代码添加缓存模块并增加测试代码v0.11.5增加 cache、timer、demjson 等几个工具文件。仓库 mootdx/utils 目录下的pandas_cache.py提供pd_cache(cache_dir, expired)装饰器以函数源码 参数的 MD5 值作为缓存键将 DataFrame 序列化为.pkl文件过期时间由expired秒数控制file_expired()判断缓存文件是否过期并自动清理。而真正被各数据接口大量使用的是 mootdx/cache.py通过from mootdx.cache import file_cache引用见 mootdx/utils/factor.py、mootdx/utils/holiday.py、mootdx/utils/adjust.py 等默认refresh_time3600 * 24一天刷新一次缓存文件统一存放在用户主目录~/.mootdx/caches/下mootdx/utils/init.py 的get_config_path()。3.2 holiday 交易日历缓存v0.10.1holiday 添加缓存并增加测试代码对应 mootdx/utils/holiday.pyholidays()通过 mootdx/utils/holiday.js 的解密脚本解析新浪交易日历接口数据带file_cache(filepathget_config_path(caches/holidays.plk), refresh_time3600 * 24)缓存并手动补入1992-05-04这一缺失的交易日_holiday()从tdx.com.cn拉取带节日/国家/交易所的交易日历同样带一天缓存缓存文件为空时自动删除以便下次刷新holiday(date, format_, country, result)判断某日是否休市——not df.empty or date.weekday() 5即命中节日表或周末判定为休市。提示holidays()依赖py_mini_racer执行 JS 解密缺少依赖时会抛出MootdxModuleNotFoundError并提示pip install mini_racer参见 docs/faq/py_mini_racer.md。3.3 xdxr 除权数据缓存v0.10.3xdxr 进行缓存化加速、v0.9.10复权数据加缓存当天数据不会重复读取除权接口对应 mootdx/utils/adjust.py 的get_xdxr(symbol)内部函数_xdxr调用Quotes.factory(std).xdxr(symbolsymbol)拉取除权除息信息以~/.mootdx/xdxr/{symbol}.plk为缓存文件refresh_time3600 * 24保证一天内不重复请求服务器。3.4 复权因子缓存v0.8.0 引入新浪复权因子时即已加缓存机制当前实现见 mootdx/utils/factor.py缓存文件为~/.mootdx/caches/factor/{market}{symbol}.plk同样一天刷新一次若新浪因子数据为空则抛出ValueError交由上层处理。3.5 timer 与 demjson 辅助工具v0.11.5 新增的 mootdx/utils/timer.py 提供timeit装饰器自动打印函数耗时1 秒显示秒、否则显示毫秒便于开发者排查性能瓶颈demjson.py则为 JSON 容错解析提供支持。四、服务器连接机制bestip 优选、server 自定义与自动重连4.1 bestip 最快服务器验证v0.7.18 / v0.8.0v0.7.18bestip 验证最快服务器接口实现异步、v0.8.0修复获取最快服务器 IP 在 jupyter 中使用失败问题以及 v0.7.17调整 logger使用异步方式选择最优服务器 IP。bestip 逻辑在 mootdx/server.py 中实现启动时异步并发测试 mootdx/consts.py 中预置的HQ_HOSTS沪深京广共 38 个行情主站端口多为 7709、EX_HOSTS扩展行情 3 个端口 7720、GP_HOSTS财务数据线路 1 个选出延迟最低的服务器写入配置。在 mootdx/quotes.py 的BaseQuotes.__init__中bestipTrue会触发check_server(syncTrue)同步验证对应历史文档 v0.10.11 修复的初始化市场时候 bestipTrue 异步异常问题。命令行验证方式可参考仓库 CLI 文档 docs/cli/bestip.md也可在代码中直接启用from mootdx.quotes import Quotes # bestipTrue 时自动测速并连接最快服务器 client Quotes.factory(marketstd, bestipTrue)4.2 server 参数自定义服务器v0.9.0v0.9.0 起增加服务器 IP 功能构造函数里添加 server 参数历史文档给出了示例client Quotes.factory(marketstd, server(127.0.0.1, 7727), verbose0, quietTrue)源码侧由 mootdx/quotes.py 的valid_server()把关server必须是(ip, port)二元组/列表IP 通过ipaddress.ip_address()校验端口转 int格式错误抛出ValueError(Server 格式错误. 例如: server (127.0.0.1, 2272))。传入 server 后StdQuotes.__init__会执行config.set(BESTIP, {HQ: self.server})将其写入配置作为首选且连接时默认timeout15秒。提示server 参数与 bestip 的优先级关系——显式传入 server 时以它为准未传时回落到config.json中BESTIP.HQ或SERVER.HQ的默认值mootdx/config.py。4.3 超时自动重连与空数据重试v0.7.18 / v0.8.4v0.7.18增加超时自动重连接机制再也不需要手动重新连接v0.8.0修正行情服务器连接超时重写连接失败的问题v0.8.4修正接口重试失败情况下抛异常改为返回空的 dateFrame 对象可以使用 df.empty 判断是否为空。实现证据BaseQuotes.reconnect()mootdx/quotes.py连接断开时自动调用self.client.connect(*self.bestip)重连StdQuotes构造时TdxHq_API(heartbeatheartbeat, auto_retryauto_retry, raise_exceptionraise_exception)默认auto_retryTrue扩展行情ExtQuotes的各接口统一装饰retry(waitwait_random(min1, max10), stopstop_after_attempt(3), retry_error_callbackreturn_last_value, retry(retry_if_exception_type() | retry_if_result(check_empty)))请求异常或返回空数据时随机等待 1~10 秒重试最多 3 次最终返回最后一次结果而不是抛异常to_data()对空结果统一返回pd.DataFrame(dataNone)调用方可用df.empty判断对应 v0.8.4 的行为约定。五、接口与参数演进frequency、offset、市场识别5.1 frequency从数字到字符v0.9.0v0.9.0 一项破坏性变更调整 K 线数据频次参数frequency的赋值方式原数字方式改成字符例如原 15 分钟线值 1 改为 15m。当前 mootdx/utils/init.py 定义FREQUENCY [5m, 15m, 30m, 1h, days, week, mon, ex_1m, 1m, day, 3mon, year]get_frequency()将字符串转换为下标索引数字与 mootdx/consts.py 的 K 线类型常量一一对应字符参数数字值K 线类型5m05 分钟 K 线15m115 分钟 K 线30m230 分钟 K 线1h31 小时 K 线days4日 K 线week5周 K 线mon6月 K 线ex_1m7扩展市场 1 分钟1m81 分钟 K 线day9日 K 线3mon10季 K 线year11年 K 线为兼容旧用法get_frequency()对 int 类型直接透传因此新旧写法均可工作但推荐统一使用字符形式# 推荐v0.9.0 起 df client.bars(symbol600036, frequency15m, offset800) # 兼容旧版数字写法 df client.bars(symbol600036, frequency1, offset800)5.2 offset 默认值统一为 800v0.10.8v0.10.8所有接口 offset 默认值调整 800。通达信协议单次最多返回 800 条 K 线mootdx/consts.py 的MAX_KLINE_COUNT 800因此 mootdx/quotes.py 中各接口bars、index_bars、index、transaction、transactions、ExtQuotes.instrument等统一默认offset800并对超限值做钳制offset (offset, 800)[offset 800]。若需更多历史数据应通过start分页获取或直接使用k(symbol, begin, end)接口内部按 800 条一页循环拉取并拼接。5.3 股票代码市场识别v0.11.5v0.11.5 修复股票代码识别市场 bug。市场识别规则集中在 mootdx/utils/init.py 的get_stock_market()显式前缀sh/sz/SH/SZ直接判定代码段前缀50/51/60/68/90/110/113/132/204→ 沪市前缀00/12/13/18/15/16/20/30/39/115/1318→ 深市前缀5/6/9/7→ 沪市前缀4/8→ 北交所对应 v0.8.7解决北交所股票不能获取数据问题新增的MARKET_BJ 2返回市场 ID0深 /1沪 /2北交或缩写字符串由string参数控制。from mootdx.utils import get_stock_market get_stock_market(600036) # 1 (沪) get_stock_market(000001) # 0 (深) get_stock_market(830799) # 2 (北交) get_stock_market(sh688001) # 1 (沪, 科创板)5.4 其他接口易用性改进v0.8.6返回 df 类型数据自动以时间作为 index 优化性能vol增加别名volume——见to_data()中result.index pd.to_datetime(result.datetime)与result[volume] result.volv0.8.6修正判断交易日函数 holiday 逻辑错误v0.10.11修复 quotes 未开盘异常问题、财务数据接口 columns 数量不对问题v0.11.2empty check空数据校验配合df.empty使用。六、财务数据异步下载与中文字段历史文档对财务数据接口着墨颇多v0.7.17财务数据调整为异步下载方式性能提升十几倍v0.7.18财务数据下载更换为异步性能提 6 倍v0.9.0财务数据的表头转为中文使用时更加直观v0.10.11修复财务数据接口 columns 数量不对问题。财务数据模块位于 mootdx/financial 目录base.py负责基础下载与解析columns.py维护字段列定义financial.py提供高层接口数据来源为 mootdx/consts.py 中GP_HOSTS指定的财务数据服务器。异步化与中文表头改造后调用方式更符合直觉from mootdx.financial import Financial # 下载并解析财务数据异步、中文字段 fin Financial(marketstd) df fin(symbol600036)说明财务数据的完整字段与下载细节参见 docs/api/fields.md 与 docs/api/extras.md仓库 tests/financial 目录下亦有对应测试用例可参考。七、自定义板块与数据转换工具7.1 自定义板块增删改查v0.9.0 / v0.8.13v0.9.0自定义板块函数调整添加增、删、改、查操作v0.8.13自定义版本增删改查。自定义板块工具位于 mootdx/tools/customize.py提供对通达信板块数据文件的增删改查能力对应测试见 tests/tools/test_customize.py。板块文件的读取底层逻辑可参考 mootdx/reader.py 的block相关方法仓库测试夹具 tests/fixtures/T0002/hq_cache 中保留了block_fg.dat、block_gn.dat、block_zs.dat等真实板块文件样例。7.2 通达信 txt 转 csvv0.7.19v0.7.19增加将 tdx 导出的 txt 文件转换为标准 csv 文件的接口实现见 mootdx/tools/tdx2csv.pytxt2csv(infile, outfile)以gbk编码读取通达信导出的 txt跳过表头 2 行与末尾 1 行列名固定为date/open/high/low/close/volume/amount输出 csvbatch(src, dst)基于asyncio并发批量转换目录内全部 txt 文件对应 v0.7.17/v0.7.18 的异步化改造思路。测试见 tests/tools/test_tdx2csv.py仓库 tests/export 目录保留了转换前后的 SH#601003.csv/txt 等真实样例。7.3 本地数据读取v0.7.17 记录修复本地标准市场和扩展市场不能读取问题增加扩展数据本地分钟线数据读取修复本地数据读取路径错误问题。本地数据读取统一由 mootdx/reader.py 提供日线.day、分钟线.lc1/.lc5、板块等配置文件TDXDIR默认C:/new_tdx见 mootdx/config.py指定通达信安装目录。仓库 tests/fixtures/vipdoc 保留了 sh/sz/ds 各市场的.day、.lc1、.lc5测试数据文件可供验证读取逻辑。八、依赖、兼容性与工程化改进8.1 按需安装与依赖精简v0.10.0 / v0.11.7v0.10.0移除非必要依赖实现按需安装——仓库 pyproject.toml 与 requirements.txt 反映了精简后的依赖面核心为pandas、httpx、tenacity、tqdm、tdxpy等可选能力如 mini_racer、表格导出按需安装v0.10.12pandas 最低版本降至 v1.3.5降低环境门槛v0.11.7调整依赖版本问题——当前 mootdx/init.py 版本号即 0.11.7。8.2 Python 版本兼容v0.8.0完全兼容 Python 3.6 ~ 3.10v0.10.3支持 3.8 ~ 3.11。当前 tox.ini 与 pyproject.toml 定义了多版本测试矩阵安装方式参见 docs/setup.md。8.3 日志可配置v0.9.0 / v0.8.4v0.8.4增加日志关闭参数有人反映打印日志影响性能v0.9.0日志等级调整为自行可配置之前有反馈说日志等级太低太多无用日志影响性能构造函数调整。构造Quotes时可通过verbose控制日志输出client Quotes.factory(marketstd, verbose0, quietTrue)日志模块实现见 mootdx/logger.py工厂方法 mootdx/quotes.py 中logger.debug(kwargs)等调用点均受等级控制避免高频行情请求场景下的日志开销。8.4 配置文件机制v0.7.20 / v0.7.21v0.7.20/v0.7.21连续两个版本修复配置文件无法找到的问题。当前实现为 mootdx/config.pyCONF get_config_path(config.json)指向用户主目录~/.mootdx/config.jsonsetup()启动时加载文件不存在时自动调用bestip(consoleFalse, limit5, syncFalse)生成并写入。配置文件可覆盖行情服务器列表SERVER、最优服务器BESTIP、通达信目录TDXDIR等设置v0.7.17 提到的多种线路配置方案配置文件、环境变量等即在此机制上实现。九、总结从版本历史看 mootdx 的设计哲学回顾 v0.7.17 到 v0.11.7 的演进docs/history.md可以提炼出 mootdx 的三条设计原则数据可靠性优先所有在线接口统一空数据重试 超时自动重连 失败返回空 DataFrame的容错契约让df.empty成为调用方唯一需要关心的异常出口性能与网络友好通过异步化财务、bestip、缓存化holiday/xdxr/复权因子按天刷新、进度条 ASCII 化v0.10.8在反复请求场景下显著降低服务器压力与等待时间API 演进保持兼容frequency数字→字符、offset默认 800、server/bestip双通道选服均保留了旧参数透传能力使升级成本最小化。对于二次开发者建议按以下顺序深入源码先读 mootdx/quotes.py 掌握行情接口全景再读 mootdx/utils/adjust.py 与 mootdx/tools/reversion.py 理解复权链路最后结合 tests 目录下的测试用例如 tests/test_adjust.py、tests/test_xdxr.py、tests/test_bestip.py验证各版本修复点的实际行为。【免费下载链接】mootdx通达信数据读取的一个简便使用封装项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻