三行代码把通达信数据读成 DataFrame:Mootdx Python 读取实战指南【免费下载链接】mootdx通达信数据读取的一个简便使用封装项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx场景:卡在 .dat 文件上你机器上装着通达信,K 线却躺在vipdoc/sh/lday/sh600036.day这类二进制文件里,文本编辑器打不开,手动导 CSV 又麻烦——这篇带你用 Mootdx 把本地 .dat 和在线行情都读成 pandas.DataFrame。看一眼能力表:Mootdx 能做什么Mootdx 是一个"通达信数据读取"的 Python 封装:一边解析你本机的通达信数据目录,一边直连通达信行情服务器(不装客户端也能拉数据),输出统一为 pandas.DataFrame。读完这节能判断它适不适合你的场景:数据/能力类别是否支持备注本地日线(.day 文件)支持Reader.daily,自动匹配 sh/sz 目录本地 1 分钟 / 5 分钟线支持Reader.minute/Reader.fzline在线 K 线 / 分时 / 分笔支持Quotes.bars/minute/transaction前复权 qfq / 后复权 hfq支持bars(..., adjust='qfq'),因子来自外部接口财务数据(净资产收益率等)支持Affair下载并解析通达信财务文件CLI 批量导出支持mootdx bundle直出 csv/xlsx/h5/json扩展市场(期货等)不稳定作者在源码中标注 ext 接口已失效,谨慎使用底层协议由 tdxpy 实现,mootdx 本身依赖很轻,Python 3.8+ 即可跑。30 秒跑通下面 5 行可以直接执行,不需要本地数据目录,需要联网:from mootdx.quotes import Quotes # bestip=True 会自动挑选当前最快的行情服务器 client = Quotes.factory(market='std', bestip=True) df = client.bars(symbol='600036', frequency=9, offset=10) # frequency=9 是日线 print(df.tail())跑通后你手上有了什么:一个以交易日为索引的 pandas.DataFrame,含 open/high/low/close/vol 字段(vol 会自动复制一份叫 volume),最后一行是最新一根 K 线。frequency 沿用通达信的编码:8=1 分钟、5=周线、6=月线、9=日线,写错编码数据就错了,第一次用建议先跑一遍 9 确认。拆解四个核心能力读完后你能独立调用四个入口:本地读文件、在线拉行情、做复权、取财务数据。把本地 .dat 文件读成 DataFrame解决"数据已经在本地、文件却读不了"的问题。把通达信安装根目录交给 Reader,它会自己定位市场目录和文件:from mootdx.reader import Reader reader = Reader.factory(market='std', tdxdir='~/your/tdx') # 替换成你的通达信安装目录 daily = reader.daily(symbol='600036') # 日线 minute = reader.minute(symbol='600036') # 1 分钟线 print(daily.tail())daily/minute/fzline 返回的是本地文件里的完整历史,没有在线 bars 那种每次 800 条的限制,适合搭建本地数据仓库。注意 tdxdir 指向安装根目录(含 vipdoc/ 的那层);某只票本地没文件时返回 None。在线 K 线、分时、分笔一个 client 搞定本地数据太旧或要拿最新一根 bar 时走在线接口,标准市场一个客户端覆盖最常用的调用:client = Quotes.factory(market='std', bestip=True) client.bars(symbol='600036', frequency=9, offset=100) # K 线 client.minute(symbol='000001') # 今日分时 client.transaction(symbol='000001', offset=50) # 分笔成交 client.index(symbol='000001', frequency=9) # 指数 K 线bars 单次最多返回 800 条(源码里强制截断),拉更长的历史要用 start 分页。要构建股票池的话,client.stocks(market=0)取深圳代码列表、market=1取上海,client.stock_all()一次拿两个市场。取前复权(qfq)/ 后复权(hfq)数据新手最常踩的坑:不复权的 K 线算收益率,除权日会出现假摔。Mootdx 最省事的路径是给 bars 传 adjust;除权表也可以自己取回来算:qfq = client.bars(symbol='600036', frequency=9, offset=100, adjust='qfq') # 一行前复权 xdxr = client.xdxr(symbol='600036') # 除权除息信息,供自己计算adjust 参数的复权因子来自新浪的 JS 接口(见 mootdx/utils/factor.py),并带 24 小时磁盘缓存(落在~/.mootdx/caches/),当天重复调用不会重复请求。它失败时的表现比较安静,"坑与调优"一节会展开。下载并解析财务数据财务指标不在行情协议里,而在通达信的财务文件中。Affair 负责拉取加解析,指标编号对照表见 docs/api/fields.md,解析结果按编号体系返回几百个指标:from mootdx.affair import Affair files = Affair.files() # 远程财务文件列表 Affair.fetch(downdir='tmp', filename='gpcw20230930.zip') # 下载单个,文件名从 files() 里取 df = Affair.parse(downdir='tmp', filename='gpcw20230930.zip')三个递进实战从单只票、到批量加缓存、再到交给策略,三段代码都能直接复制运行(安装见文末快速参考卡)。单标的日线:复权优先,失败自动兜底目标是任意一只票都能稳定拿到可用日线:先试前复权,网络或因子失败就退回不复权,并留下日志:import logging from mootdx.quotes import Quotes logging.basicConfig(level=logging.INFO) client = Quotes.factory(market='std', bestip=True) def get_daily(symbol, offset=500): """优先前复权;空数据或异常时退回不复权""" try: df = client.bars(symbol=symbol, frequency=9, offset=offset, adjust='qfq') if df is None or df.empty: raise ValueError('前复权数据为空') return df except Exception as e: logging.warning(f'{symbol} 前复权失败,退回不复权: {e}') return client.bars(symbol=symbol, frequency=9, offset=offset) print(get_daily('600036').tail())except 分支里"任何异常都兜底"的写法可以复用到你自己的数据层:高级数据源失败时永远有原始数据保底,日志里留原因方便回头排查。批量拉取加缓存,落盘留底股票池一长,重复的网络请求是主要成本。用内置的 pd_cache(磁盘 pickle 缓存)加 to_file 把每只票落盘:from pathlib import Path from mootdx.quotes import Quotes from mootdx.utils import to_file from mootdx.utils.pandas_cache import pd_cache client = Quotes.factory(market='std', bestip=True) @pd_cache(expired=3600 * 24) # 同参数同函数体直接命中磁盘缓存 def fetch_daily(symbol, offset=800): return client.bars(symbol=symbol, frequency=9, offset=offset) out = Path('data/daily') out.mkdir(parents=True, exist_ok=True) for s in ['600036', '000001', '000858', '300750']: try: df = fetch_daily(s) to_file(df, str(out / f'{s}.csv')) print(f'{s} 完成, {len(df)} 条') except Exception as e: print(f'{s} 拉取失败: {e}') # 单只失败不阻塞整批缓存键是函数体加参数的 md5(见 mootdx/utils/pandas_cache.py),改成 offset=500 会自动生成新的缓存文件;缓存目录是.pd_cache/,想重新拉取删掉即可。不想写代码也有命令行版:mootdx bundle -s 600036,000001 -a daily -e csv -o data/。把数据交给自己的策略数据是带 datetime 索引的 DataFrame 后,就是标准回测流水线的事了。拿双均线举一个最小的例子:from mootdx.quotes import Quotes client = Quotes.factory(market='std', bestip=True) df = client.bars(symbol='600036', frequency=9, offset=300) df['ma5'] = df['close'].rolling(5).mean() df['ma20'] = df['close'].rolling(20).mean() # 金叉买入信号:ma5 上穿 ma20 df['signal'] = ((df['ma5'] > df['ma20']) & (df['ma5'].shift(1) <= df['ma20'].shift(1))).astype(int) print(df[['close', 'ma5', 'ma20', 'signal']].tail(10)) print(f'金叉信号共 {df["signal"].sum()} 个')索引是 datetime,可以直接按日期切片:df['2024-01':'2024-06']。实际项目里通常按上一节批量拉好落盘,这一步从磁盘读,避免回测时反复打行情服务器。坑与调优三个高频坑都按"现象 → 根因 → 修复"给出,对号入座即可。本地目录错误:Reader 抛异常或返回 None现象:tdxdir 目录不存在,或者 daily 返回 None。根因:tdxdir 指错层级,Reader 是在安装根目录下找vipdoc/{sh,sz}/lday/*.day(逻辑见 mootdx/reader.py 的 find_path),而代码里的默认值是 Windows 示例路径C:/new_tdx,Linux/macOS 上必须自己传。修复:ls ~/your/tdx/vipdoc/sh/lday | head # 能看到 sh600036.day 之类的文件才算路径正确reader = Reader.factory(market='std', tdxdir='~/your/tdx') # 指向含 vipdoc 的根目录若某只票确实没有本地文件(通达信里没下载过),返回 None 属正常,改走在线 Quotes 即可。在线返回空表或超时现象:bars 返回空 DataFrame,或连接超时。根因:内置服务器列表不少,命中的服务器被墙或慢就会超时、返回空。Mootdx 自带服务器测速,结果写进~/.mootdx/config.json。修复:python -m mootdx bestip # 测速全部行情服务器,把最快 IP 写入配置代码里则给客户端传bestip=True(本文示例均如此),长任务再加timeout和heartbeat=True。另有一个容易忽略的点:bars 单次上限 800 条,拉长历史用start += 800循环分页,直到某次返回不足 800 条为止。前复权悄悄返回了不复权数据现象:adjust='qfq'的结果和裸数据一模一样,没有任何报错。根因:qfq/hfq 因子从新浪 JS 接口取(mootdx/utils/factor.py),请求失败时捕获异常返回空因子,to_data 见空因子就静默跳过复权。修复:先单独验证因子:from mootdx.utils.factor import fq_factor factor = fq_factor('600036', 'qfq') print(factor.tail()) # 为空说明因子源当前不可达网络确实不通时,自包含的替代方案是用client.xdxr(symbol)取除权表(category==1 的行含分红/配股/送转字段),按除权公式自己算复权因子,参考公式在 sample/fuquan.py 的注释里;更省事的办法是本地reader.daily拿裸数据、从别的源补一份复权因子。上下游衔接:喂给 backtrader 的最小适配层任何回测框架要的都是带时间索引的 OHLCV 序列,Mootdx 输出已经是这个形状,适配通常只是几行列名重命名。backtrader 的最小写法:import backtrader as bt from mootdx.quotes import Quotes client = Quotes.factory(market='std', bestip=True) raw = client.bars(symbol='600036', frequency=9, offset=500) # 保留 OHLCV 列,vol 改名 volume;索引本身已是 datetime df = raw[['open', 'high', 'low', 'close', 'vol']].rename(columns={'vol': 'volume'}) class MootdxFeed(bt.feeds.PandasData): params = (('open', 'open'), ('high', 'high'), ('low', 'low'), ('close', 'close'), ('volume', 'volume')) cerebro = bt.Cerebro() cerebro.adddata(MootdxFeed(dataname=df))接 vnpy 则是把df.itertuples()逐行转成 BarData,思路相同;自研 pipeline 最轻量的交接方式是df.to_parquet()落盘,策略端只管读文件。快速参考卡:安装、配置、验证安装与验证所需的全部命令都在下面三段里,按顺序执行即可。# 1. 虚拟环境 + 安装(含 cli 与全部扩展依赖) python -m venv .venv && source .venv/bin/activate # Windows 用 .venv\Scripts\activate pip install 'mootdx[all]'# 2. 关键路径 # 通达信安装目录: ~/your/tdx 必须包含 vipdoc/ 与 T0002/ # Mootdx 配置目录: ~/.mootdx/ config.json、复权因子等缓存都在这里 python -m mootdx bestip # 行情服务器测速,最优 IP 写入 ~/.mootdx/config.json# 3. 验证 python -c "from mootdx.quotes import Quotes; print(Quotes.factory('std', bestip=True).bars(symbol='600036', frequency=9, offset=5).tail())" mootdx reader -d ~/your/tdx -s 600036 -a daily -o t.csv # 本地读取并导出 CSV mootdx bundle -s 600036,000001 -a daily -e csv -o data/ # 在线批量导出下一步跑通"30 秒"部分后,先读 docs/quick.md,再按需求翻 docs/api/reader.md 与 docs/api/quote1.md 的完整 API。各功能的可运行示例都在 sample/ 目录,建议按 basic_reader、basic_quotes、basic_adjust 的顺序过一遍。遇到扩展市场接口不稳定、复权因子缺失这类问题,先去项目 issue 区搜关键词,这些基本都有前人记录。【免费下载链接】mootdx通达信数据读取的一个简便使用封装项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
三行代码把通达信数据读成 DataFrame:Mootdx Python 读取实战指南【免费下载链接】mootdx通达信数据读取的一个简便使用封装项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx场景:卡在 .dat 文件上你机器上装着通达信,K 线却躺在vipdoc/sh/lday/sh600036.day这类二进制文件里,文本编辑器打不开,手动导 CSV 又麻烦——这篇带你用 Mootdx 把本地 .dat 和在线行情都读成 pandas.DataFrame。看一眼能力表:Mootdx 能做什么Mootdx 是一个"通达信数据读取"的 Python 封装:一边解析你本机的通达信数据目录,一边直连通达信行情服务器(不装客户端也能拉数据),输出统一为 pandas.DataFrame。读完这节能判断它适不适合你的场景:数据/能力类别是否支持备注本地日线(.day 文件)支持Reader.daily,自动匹配 sh/sz 目录本地 1 分钟 / 5 分钟线支持Reader.minute/Reader.fzline在线 K 线 / 分时 / 分笔支持Quotes.bars/minute/transaction前复权 qfq / 后复权 hfq支持bars(..., adjust='qfq'),因子来自外部接口财务数据(净资产收益率等)支持Affair下载并解析通达信财务文件CLI 批量导出支持mootdx bundle直出 csv/xlsx/h5/json扩展市场(期货等)不稳定作者在源码中标注 ext 接口已失效,谨慎使用底层协议由 tdxpy 实现,mootdx 本身依赖很轻,Python 3.8+ 即可跑。30 秒跑通下面 5 行可以直接执行,不需要本地数据目录,需要联网:from mootdx.quotes import Quotes # bestip=True 会自动挑选当前最快的行情服务器 client = Quotes.factory(market='std', bestip=True) df = client.bars(symbol='600036', frequency=9, offset=10) # frequency=9 是日线 print(df.tail())跑通后你手上有了什么:一个以交易日为索引的 pandas.DataFrame,含 open/high/low/close/vol 字段(vol 会自动复制一份叫 volume),最后一行是最新一根 K 线。frequency 沿用通达信的编码:8=1 分钟、5=周线、6=月线、9=日线,写错编码数据就错了,第一次用建议先跑一遍 9 确认。拆解四个核心能力读完后你能独立调用四个入口:本地读文件、在线拉行情、做复权、取财务数据。把本地 .dat 文件读成 DataFrame解决"数据已经在本地、文件却读不了"的问题。把通达信安装根目录交给 Reader,它会自己定位市场目录和文件:from mootdx.reader import Reader reader = Reader.factory(market='std', tdxdir='~/your/tdx') # 替换成你的通达信安装目录 daily = reader.daily(symbol='600036') # 日线 minute = reader.minute(symbol='600036') # 1 分钟线 print(daily.tail())daily/minute/fzline 返回的是本地文件里的完整历史,没有在线 bars 那种每次 800 条的限制,适合搭建本地数据仓库。注意 tdxdir 指向安装根目录(含 vipdoc/ 的那层);某只票本地没文件时返回 None。在线 K 线、分时、分笔一个 client 搞定本地数据太旧或要拿最新一根 bar 时走在线接口,标准市场一个客户端覆盖最常用的调用:client = Quotes.factory(market='std', bestip=True) client.bars(symbol='600036', frequency=9, offset=100) # K 线 client.minute(symbol='000001') # 今日分时 client.transaction(symbol='000001', offset=50) # 分笔成交 client.index(symbol='000001', frequency=9) # 指数 K 线bars 单次最多返回 800 条(源码里强制截断),拉更长的历史要用 start 分页。要构建股票池的话,client.stocks(market=0)取深圳代码列表、market=1取上海,client.stock_all()一次拿两个市场。取前复权(qfq)/ 后复权(hfq)数据新手最常踩的坑:不复权的 K 线算收益率,除权日会出现假摔。Mootdx 最省事的路径是给 bars 传 adjust;除权表也可以自己取回来算:qfq = client.bars(symbol='600036', frequency=9, offset=100, adjust='qfq') # 一行前复权 xdxr = client.xdxr(symbol='600036') # 除权除息信息,供自己计算adjust 参数的复权因子来自新浪的 JS 接口(见 mootdx/utils/factor.py),并带 24 小时磁盘缓存(落在~/.mootdx/caches/),当天重复调用不会重复请求。它失败时的表现比较安静,"坑与调优"一节会展开。下载并解析财务数据财务指标不在行情协议里,而在通达信的财务文件中。Affair 负责拉取加解析,指标编号对照表见 docs/api/fields.md,解析结果按编号体系返回几百个指标:from mootdx.affair import Affair files = Affair.files() # 远程财务文件列表 Affair.fetch(downdir='tmp', filename='gpcw20230930.zip') # 下载单个,文件名从 files() 里取 df = Affair.parse(downdir='tmp', filename='gpcw20230930.zip')三个递进实战从单只票、到批量加缓存、再到交给策略,三段代码都能直接复制运行(安装见文末快速参考卡)。单标的日线:复权优先,失败自动兜底目标是任意一只票都能稳定拿到可用日线:先试前复权,网络或因子失败就退回不复权,并留下日志:import logging from mootdx.quotes import Quotes logging.basicConfig(level=logging.INFO) client = Quotes.factory(market='std', bestip=True) def get_daily(symbol, offset=500): """优先前复权;空数据或异常时退回不复权""" try: df = client.bars(symbol=symbol, frequency=9, offset=offset, adjust='qfq') if df is None or df.empty: raise ValueError('前复权数据为空') return df except Exception as e: logging.warning(f'{symbol} 前复权失败,退回不复权: {e}') return client.bars(symbol=symbol, frequency=9, offset=offset) print(get_daily('600036').tail())except 分支里"任何异常都兜底"的写法可以复用到你自己的数据层:高级数据源失败时永远有原始数据保底,日志里留原因方便回头排查。批量拉取加缓存,落盘留底股票池一长,重复的网络请求是主要成本。用内置的 pd_cache(磁盘 pickle 缓存)加 to_file 把每只票落盘:from pathlib import Path from mootdx.quotes import Quotes from mootdx.utils import to_file from mootdx.utils.pandas_cache import pd_cache client = Quotes.factory(market='std', bestip=True) @pd_cache(expired=3600 * 24) # 同参数同函数体直接命中磁盘缓存 def fetch_daily(symbol, offset=800): return client.bars(symbol=symbol, frequency=9, offset=offset) out = Path('data/daily') out.mkdir(parents=True, exist_ok=True) for s in ['600036', '000001', '000858', '300750']: try: df = fetch_daily(s) to_file(df, str(out / f'{s}.csv')) print(f'{s} 完成, {len(df)} 条') except Exception as e: print(f'{s} 拉取失败: {e}') # 单只失败不阻塞整批缓存键是函数体加参数的 md5(见 mootdx/utils/pandas_cache.py),改成 offset=500 会自动生成新的缓存文件;缓存目录是.pd_cache/,想重新拉取删掉即可。不想写代码也有命令行版:mootdx bundle -s 600036,000001 -a daily -e csv -o data/。把数据交给自己的策略数据是带 datetime 索引的 DataFrame 后,就是标准回测流水线的事了。拿双均线举一个最小的例子:from mootdx.quotes import Quotes client = Quotes.factory(market='std', bestip=True) df = client.bars(symbol='600036', frequency=9, offset=300) df['ma5'] = df['close'].rolling(5).mean() df['ma20'] = df['close'].rolling(20).mean() # 金叉买入信号:ma5 上穿 ma20 df['signal'] = ((df['ma5'] > df['ma20']) & (df['ma5'].shift(1) <= df['ma20'].shift(1))).astype(int) print(df[['close', 'ma5', 'ma20', 'signal']].tail(10)) print(f'金叉信号共 {df["signal"].sum()} 个')索引是 datetime,可以直接按日期切片:df['2024-01':'2024-06']。实际项目里通常按上一节批量拉好落盘,这一步从磁盘读,避免回测时反复打行情服务器。坑与调优三个高频坑都按"现象 → 根因 → 修复"给出,对号入座即可。本地目录错误:Reader 抛异常或返回 None现象:tdxdir 目录不存在,或者 daily 返回 None。根因:tdxdir 指错层级,Reader 是在安装根目录下找vipdoc/{sh,sz}/lday/*.day(逻辑见 mootdx/reader.py 的 find_path),而代码里的默认值是 Windows 示例路径C:/new_tdx,Linux/macOS 上必须自己传。修复:ls ~/your/tdx/vipdoc/sh/lday | head # 能看到 sh600036.day 之类的文件才算路径正确reader = Reader.factory(market='std', tdxdir='~/your/tdx') # 指向含 vipdoc 的根目录若某只票确实没有本地文件(通达信里没下载过),返回 None 属正常,改走在线 Quotes 即可。在线返回空表或超时现象:bars 返回空 DataFrame,或连接超时。根因:内置服务器列表不少,命中的服务器被墙或慢就会超时、返回空。Mootdx 自带服务器测速,结果写进~/.mootdx/config.json。修复:python -m mootdx bestip # 测速全部行情服务器,把最快 IP 写入配置代码里则给客户端传bestip=True(本文示例均如此),长任务再加timeout和heartbeat=True。另有一个容易忽略的点:bars 单次上限 800 条,拉长历史用start += 800循环分页,直到某次返回不足 800 条为止。前复权悄悄返回了不复权数据现象:adjust='qfq'的结果和裸数据一模一样,没有任何报错。根因:qfq/hfq 因子从新浪 JS 接口取(mootdx/utils/factor.py),请求失败时捕获异常返回空因子,to_data 见空因子就静默跳过复权。修复:先单独验证因子:from mootdx.utils.factor import fq_factor factor = fq_factor('600036', 'qfq') print(factor.tail()) # 为空说明因子源当前不可达网络确实不通时,自包含的替代方案是用client.xdxr(symbol)取除权表(category==1 的行含分红/配股/送转字段),按除权公式自己算复权因子,参考公式在 sample/fuquan.py 的注释里;更省事的办法是本地reader.daily拿裸数据、从别的源补一份复权因子。上下游衔接:喂给 backtrader 的最小适配层任何回测框架要的都是带时间索引的 OHLCV 序列,Mootdx 输出已经是这个形状,适配通常只是几行列名重命名。backtrader 的最小写法:import backtrader as bt from mootdx.quotes import Quotes client = Quotes.factory(market='std', bestip=True) raw = client.bars(symbol='600036', frequency=9, offset=500) # 保留 OHLCV 列,vol 改名 volume;索引本身已是 datetime df = raw[['open', 'high', 'low', 'close', 'vol']].rename(columns={'vol': 'volume'}) class MootdxFeed(bt.feeds.PandasData): params = (('open', 'open'), ('high', 'high'), ('low', 'low'), ('close', 'close'), ('volume', 'volume')) cerebro = bt.Cerebro() cerebro.adddata(MootdxFeed(dataname=df))接 vnpy 则是把df.itertuples()逐行转成 BarData,思路相同;自研 pipeline 最轻量的交接方式是df.to_parquet()落盘,策略端只管读文件。快速参考卡:安装、配置、验证安装与验证所需的全部命令都在下面三段里,按顺序执行即可。# 1. 虚拟环境 + 安装(含 cli 与全部扩展依赖) python -m venv .venv && source .venv/bin/activate # Windows 用 .venv\Scripts\activate pip install 'mootdx[all]'# 2. 关键路径 # 通达信安装目录: ~/your/tdx 必须包含 vipdoc/ 与 T0002/ # Mootdx 配置目录: ~/.mootdx/ config.json、复权因子等缓存都在这里 python -m mootdx bestip # 行情服务器测速,最优 IP 写入 ~/.mootdx/config.json# 3. 验证 python -c "from mootdx.quotes import Quotes; print(Quotes.factory('std', bestip=True).bars(symbol='600036', frequency=9, offset=5).tail())" mootdx reader -d ~/your/tdx -s 600036 -a daily -o t.csv # 本地读取并导出 CSV mootdx bundle -s 600036,000001 -a daily -e csv -o data/ # 在线批量导出下一步跑通"30 秒"部分后,先读 docs/quick.md,再按需求翻 docs/api/reader.md 与 docs/api/quote1.md 的完整 API。各功能的可运行示例都在 sample/ 目录,建议按 basic_reader、basic_quotes、basic_adjust 的顺序过一遍。遇到扩展市场接口不稳定、复权因子缺失这类问题,先去项目 issue 区搜关键词,这些基本都有前人记录。【免费下载链接】mootdx通达信数据读取的一个简便使用封装项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考