MooTdx:通达信数据分析最全指南

栏目分类
你的位置:ag账号 > 新闻动态 > MooTdx:通达信数据分析最全指南
MooTdx:通达信数据分析最全指南
发布日期:2025-11-19 20:49    点击次数:181

mootdx 是一个用于读取通达信数据的 Python 接口库,支持离线数据读取、在线行情获取和财务数据下载。

版本: 0.11.7作者: bopo.wang开源协议: MIT LicensePython 版本要求: 3.8+项目地址: https://github.com/mootdx/mootdx安装方法基础安装# 核心依赖安装pip install mootdx# 包含命令行工具pip install 'mootdx[cli]'# 包含所有扩展依赖(推荐)pip install 'mootdx[all]'升级安装
pip install -U tdxpy mootdx# 或pip install -U 'mootdx[all]'
核心模块

mootdx 主要包含三个核心模块:

Reader - 通达信离线数据读取Quotes - 通达信在线行情数据Affair - 财务数据下载和解析1. Reader 模块 - 离线数据读取基本用法from mootdx.reader import Reader# 创建读取器实例# market: 'std' 标准市场(股票), 'ext' 扩展市场(期货等)# tdxdir: 通达信数据目录路径reader = Reader.factory(market='std', tdxdir='C:/new_tdx')主要方法1.1 读取日线数据
# 读取日线数据daily_data = reader.daily(symbol='600036')print(daily_data)
1.2 读取分钟数据# 读取分钟数据minute_data = reader.minute(symbol='600036')print(minute_data)1.3 读取时间线数据
# 读取时间线数据fzline_data = reader.fzline(symbol='600036')print(fzline_data)
Reader 类详细APIStdReader (标准市场)daily(symbol, **kwargs) - 获取日线数据minute(symbol, suffix=1, **kwargs) - 获取分钟数据fzline(symbol) - 获取时间线数据block(tofile='block.dat', **kwargs) - 获取板块数据block_new(**kwargs) - 获取新板块数据find_path(symbol, subdir='lday', suffix=None, **kwargs) - 查找数据文件路径ExtReader (扩展市场)支持期货、黄金等扩展市场数据读取方法与 StdReader 类似2. Quotes 模块 - 在线行情数据基本用法from mootdx.quotes import Quotes# 创建行情客户端# market: 'std' 标准市场, 'ext' 扩展市场# multithread: 是否多线程# heartbeat: 是否心跳检测client = Quotes.factory(market='std', multithread=True, heartbeat=True)主要方法2.1 获取K线数据
# 获取K线数据# symbol: 股票代码# frequency: 数据频次 (见频次常量)# offset: 获取条数 (最大800)kline_data = client.bars(symbol='600036', frequency=9, offset=100)print(kline_data)
2.2 获取指数数据# 获取指数K线index_data = client.index_bars(symbol='000001', frequency=9)print(index_data)# 或者使用简化方法index_data = client.index(symbol='000001', frequency=9)print(index_data)2.3 获取分时数据
# 获取实时分时数据minute_data = client.minute(symbol='000001')print(minute_data)# 获取历史分时数据history_minute = client.minutes(symbol='000001', date='20231201')print(history_minute)
2.4 获取实时行情# 获取实时行情报价quotes_data = client.quotes(symbol='600036')print(quotes_data)# 批量获取多只股票行情quotes_data = client.quotes(symbol=['600036', '000001', '000002'])print(quotes_data)2.5 获取股票列表
# 获取市场股票数量count = client.stock_count(market=1)  # 1=上海, 0=深圳print(f'股票数量: {count}')# 获取股票列表stocks = client.stocks(market=1)print(stocks)# 获取所有市场股票all_stocks = client.stock_all()print(all_stocks)
2.6 获取分笔成交数据# 获取分笔成交transaction_data = client.transaction(symbol='600036', start=0, offset=100)print(transaction_data)# 获取历史分笔成交history_transactions = client.transactions(symbol='600036', date='20231201', start=0, offset=100)print(history_transactions)2.7 获取F10信息和财务数据
# 获取公司F10信息目录f10_catalog = client.F10C(symbol='600036')print(f10_catalog)# 获取具体F10信息f10_detail = client.F10(symbol='600036', name='公司概况')print(f10_detail)# 获取财务信息finance_data = client.finance(symbol='600036')print(finance_data)# 获取除权除息信息xdxr_data = client.xdxr(symbol='600036')print(xdxr_data)
2.8 获取板块信息# 获取板块信息block_data = client.block(tofile='block.dat')print(block_data)2.9 按日期范围获取K线数据
# 按日期范围获取K线k_data = client.k(symbol='600036', begin='20230101', end='20231201')print(k_data)# 使用get_k_data方法k_data2 = client.get_k_data(code='600036', start_date='20230101', end_date='20231201')print(k_data2)
Quotes 类详细APIStdQuotes (标准市场)

基础行情方法:

quotes(symbol, **kwargs) - 获取实时行情bars(symbol='000001', frequency=9, start=0, offset=800, **kwargs) - 获取K线数据index_bars(symbol='000001', frequency=9, start=0, offset=800, **kwargs) - 获取指数K线index(symbol='000001', frequency=9, start=0, offset=800, **kwargs) - 获取指数K线(简化方法)minute(symbol, **kwargs) - 获取实时分时数据minutes(symbol, date='20191023', **kwargs) - 获取历史分时数据transaction(symbol='', start=0, offset=800, **kwargs) - 获取分笔成交transactions(symbol='', start=0, offset=800, date='20170209', **kwargs) - 获取历史分笔成交

股票列表方法:

stock_count(market=1) - 获取市场股票数量stocks(market=1) - 获取股票列表stock_all() - 获取所有股票列表

高级功能方法:

F10(symbol='', name='') - 获取公司F10信息详情F10C(symbol='') - 获取公司信息目录finance(symbol='000001', **kwargs) - 获取财务信息block(tofile='block.dat', **kwargs) - 获取证券板块信息k(symbol='', begin=None, end=None, **kwargs) - 获取K线信息(按日期范围)xdxr(symbol='', **kwargs) - 获取除权除息信息get_k_data(code, start_date, end_date) - 获取K线数据(按日期)

连接管理方法:

traffic() - 获取流量统计close() - 关闭连接reconnect() - 重新连接ExtQuotes (扩展市场)支持期货等扩展市场的行情数据获取连接参数# 完整的连接参数示例client = Quotes.factory(    market='std',           # 市场类型    server=('127.0.0.1', 7709),  # 自定义服务器    bestip=True,           # 自动选择最佳IP    timeout=15,            # 连接超时时间    heartbeat=True,        # 心跳检测    auto_retry=True,       # 自动重试    raise_exception=False, # 是否抛出异常    verbose=True           # 详细日志)3. Affair 模块 - 财务数据基本用法
from mootdx.affair import Affair
主要方法3.1 获取财务文件列表# 获取远程财务文件列表files = Affair.files()print(files)# 显示文件信息from prettytable import PrettyTablet = PrettyTable(['filename', 'filesize', 'hash'])for file in files:    t.add_row([file['filename'], file['filesize'], file['hash']])print(t)3.2 下载财务数据文件
# 下载单个财务文件Affair.fetch(downdir='./data', filename='gpcw19960630.zip')# 下载所有财务文件Affair.fetch(downdir='./data')
3.3 解析财务数据# 解析财务数据文件financial_data = Affair.parse(downdir='./data', filename='gpcw19960630.zip')print(financial_data)Affair 类详细APIfiles() - 获取财务文件列表fetch(downdir, filename=None) - 下载财务文件parse(downdir, filename, **kwargs) - 解析财务文件4. 常量定义市场常量
from mootdx.consts import MARKET_SH, MARKET_SZ, MARKET_BJMARKET_SZ = 0  # 深市MARKET_SH = 1  # 沪市  MARKET_BJ = 2  # 北交所
数据限制常量from mootdx.consts import MAX_KLINE_COUNT, MAX_TRANSACTION_COUNTMAX_KLINE_COUNT = 800        # K线数据最多800条MAX_TRANSACTION_COUNT = 2000 # 分笔行情最多2000条板块文件常量
from mootdx.consts import BLOCK_DEFAULT, BLOCK_SZ, BLOCK_FG, BLOCK_GNBLOCK_DEFAULT = 'block.dat'     # 默认板块文件BLOCK_SZ = 'block_zs.dat'       # 指数板块BLOCK_FG = 'block_fg.dat'       # 风格板块  BLOCK_GN = 'block_gn.dat'       # 概念板块
K线频次常量from mootdx.consts import *KLINE_5MIN = 0      # 5分钟K线KLINE_15MIN = 1     # 15分钟K线KLINE_30MIN = 2     # 30分钟K线KLINE_1HOUR = 3     # 1小时K线KLINE_DAILY = 4     # 日K线KLINE_WEEKLY = 5    # 周K线KLINE_MONTHLY = 6   # 月K线KLINE_EX_1MIN = 7   # 扩展市场1分钟KLINE_1MIN = 8      # 1分钟K线KLINE_RI_K = 9      # 日K线KLINE_3MONTH = 10   # 季K线KLINE_YEARLY = 11   # 年K线频次字符串
FREQUENCY = ['5m', '15m', '30m', '1h', 'day', 'week', 'mon', 'ex_1m', '1m', 'dk', '3mon', 'year']# 频次转换示例from mootdx.utils import get_frequencyfreq_5m = get_frequency('5m')    # 返回 0freq_day = get_frequency('day')  # 返回 9  freq_num = get_frequency(9)      # 返回 9
5. 工具函数股票市场判断from mootdx.utils import get_stock_market, get_stock_markets# 判断单个股票的市场market = get_stock_market('600036')  # 返回 1 (上海市场)market_str = get_stock_market('600036', string=True)  # 返回 'sh'# 批量判断股票市场markets = get_stock_markets(['600036', '000001'])print(markets)  # [[1, '600036'], [0, '000001']]数据转换
from mootdx.utils import to_data, to_file# 将数据转换为DataFramedf = to_data(data_list)# 导出数据到文件to_file(df, 'output.csv')    # CSV格式to_file(df, 'output.xlsx')   # Excel格式to_file(df, 'output.json')   # JSON格式
复权处理# 获取前复权数据df = client.bars(symbol='600036', adjust='qfq')# 获取后复权数据  df = client.bars(symbol='600036', adjust='hfq')6. 完整示例6.1 获取股票基本信息和K线数据
from mootdx.quotes import Quotesimport pandas as pd# 创建客户端client = Quotes.factory(market='std', heartbeat=True)# 获取股票列表stocks = client.stocks(market=1)  # 上海市场print(f'上海市场股票数量: {len(stocks)}')# 获取特定股票的K线数据symbol = '600036'kline_data = client.bars(symbol=symbol, frequency=9, offset=100)print(f'{symbol} 日K线数据:')print(kline_data.head())# 获取实时行情quotes = client.quotes(symbol=symbol)print(f'{symbol} 实时行情:')print(quotes)# 获取分时数据minute_data = client.minute(symbol=symbol)print(f'{symbol} 分时数据:')print(minute_data.head())# 获取F10信息f10_data = client.F10C(symbol=symbol)print(f'{symbol} F10目录:')print(f10_data)# 获取除权除息信息xdxr_data = client.xdxr(symbol=symbol)print(f'{symbol} 除权除息:')print(xdxr_data.head())# 关闭连接client.close()
6.2 批量获取多只股票数据from mootdx.quotes import Quotesclient = Quotes.factory(market='std')# 定义股票列表symbols = ['600036', '000001', '000002', '600519', '000858']# 批量获取实时行情quotes_data = client.quotes(symbol=symbols)print('批量行情数据:')print(quotes_data)# 批量获取K线数据for symbol in symbols:    kline = client.bars(symbol=symbol, frequency=9, offset=50)    print(f'{symbol} K线数据形状: {kline.shape}')6.3 离线数据读取示例
from mootdx.reader import Reader# 创建读取器(需要本地通达信数据)reader = Reader.factory(market='std', tdxdir='C:/new_tdx')# 读取日线数据daily = reader.daily(symbol='600036')print('日线数据:')print(daily.head())# 读取分钟数据minute = reader.minute(symbol='600036')print('分钟数据:')print(minute.head())
6.4 高级功能综合示例from mootdx.quotes import Quotes# 创建客户端client = Quotes.factory(market='std', timeout=15, heartbeat=True)symbol = '600036'# 招商银行try:    # 1. 获取基本行情    quotes = client.quotes(symbol=symbol)    print(f'=== {symbol} 实时行情 ===')    print(quotes)        # 2. 获取K线数据(多个周期)    print(f'\n=== {symbol} 多周期K线 ===')    daily_k = client.bars(symbol=symbol, frequency=9, offset=30)  # 日K    weekly_k = client.bars(symbol=symbol, frequency=5, offset=20)  # 周K    print(f'日K线: {daily_k.shape}')    print(f'周K线: {weekly_k.shape}')        # 3. 获取F10信息    print(f'\n=== {symbol} F10信息 ===')    f10_catalog = client.F10C(symbol=symbol)    ifnot f10_catalog.empty:        print('F10目录:', f10_catalog.columns.tolist())                # 获取具体F10内容        f10_detail = client.F10(symbol=symbol, name='公司概况')        print('公司概况:', f10_detail.shape ifnot f10_detail.empty else'无数据')        # 4. 获取财务数据    print(f'\n=== {symbol} 财务数据 ===')    finance = client.finance(symbol=symbol)    print('财务数据:', finance.shape ifnot finance.empty else'无数据')        # 5. 获取除权除息    print(f'\n=== {symbol} 除权除息 ===')    xdxr = client.xdxr(symbol=symbol)    print('除权除息:', xdxr.shape ifnot xdxr.empty else'无数据')        # 6. 获取分笔成交    print(f'\n=== {symbol} 分笔成交 ===')    transactions = client.transaction(symbol=symbol, offset=50)    print('分笔成交:', transactions.shape ifnot transactions.empty else'无数据')        # 7. 按日期范围获取数据    print(f'\n=== {symbol} 按日期范围获取 ===')    k_range = client.k(symbol=symbol, begin='20231101', end='20231201')    print('日期范围K线:', k_range.shape ifnot k_range.empty else'无数据')except Exception as e:    print(f'获取数据时出错: {e}')finally:    client.close()6.5 财务数据下载示例
from mootdx.affair import Affairimport os# 创建数据目录data_dir = './financial_data'os.makedirs(data_dir, exist_ok=True)# 获取财务文件列表files = Affair.files()print(f'可用财务文件数量: {len(files)}')# 下载最新的财务文件if files:    latest_file = files[0]['filename']    print(f'下载文件: {latest_file}')    Affair.fetch(downdir=data_dir, filename=latest_file)        # 解析财务数据    financial_data = Affair.parse(downdir=data_dir, filename=latest_file)    print('财务数据:')    print(financial_data.head())
7. 错误处理7.1 连接错误处理from mootdx.quotes import Quotesfrom mootdx.exceptions import MootdxValidationExceptiontry:    client = Quotes.factory(market='std', timeout=10)    data = client.bars(symbol='600036')    print(data)except MootdxValidationException as e:    print(f'验证错误: {e}')except Exception as e:    print(f'连接错误: {e}')finally:    if'client'in locals():        client.close()7.2 数据验证
def safe_get_quotes(symbol):    '''安全获取行情数据'''    try:        client = Quotes.factory(market='std')        data = client.quotes(symbol=symbol)                if data isNoneor data.empty:            print(f'股票 {symbol} 无数据')            returnNone                    return data    except Exception as e:        print(f'获取 {symbol} 数据失败: {e}')        returnNone    finally:        client.close()# 使用示例quotes = safe_get_quotes('600036')if quotes isnotNone:    print(quotes)
8. 性能优化建议8.1 连接复用# 推荐:复用连接client = Quotes.factory(market='std', heartbeat=True)symbols = ['600036', '000001', '000002']for symbol in symbols:    data = client.bars(symbol=symbol)    # 处理数据...client.close()  # 最后关闭连接8.2 批量操作
# 推荐:批量获取行情symbols = ['600036', '000001', '000002']quotes_data = client.quotes(symbol=symbols)  # 一次获取多只股票# 不推荐:逐个获取# for symbol in symbols:#     quote = client.quotes(symbol=symbol)
8.3 数据缓存import picklefrom pathlib import Pathdef cache_data(data, filename):    '''缓存数据到文件'''    with open(filename, 'wb') as f:        pickle.dump(data, f)def load_cached_data(filename):    '''从缓存加载数据'''    if Path(filename).exists():        with open(filename, 'rb') as f:            return pickle.load(f)    returnNone# 使用缓存cache_file = 'stocks_cache.pkl'stocks = load_cached_data(cache_file)if stocks isNone:    client = Quotes.factory(market='std')    stocks = client.stock_all()    cache_data(stocks, cache_file)    client.close()print(f'股票数量: {len(stocks)}')9. 注意事项网络连接: 在线行情需要网络连接,建议设置合适的超时时间数据频率: K线数据单次最多获取800条市场代码: 注意区分上海(1)、深圳(0)、北交所(2)市场资源管理: 使用完毕后及时关闭连接异常处理: 网络不稳定时要做好异常处理数据格式: 返回数据为pandas DataFrame格式复权数据: 需要复权数据时指定adjust参数10. 常见问题Q1: 连接超时怎么办?
# 增加超时时间和重试机制client = Quotes.factory(    market='std',     timeout=30,    auto_retry=True,    bestip=True  # 自动选择最佳IP)
Q2: 如何获取更多历史数据?# 分批获取历史数据def get_more_history(symbol, total_days=2000):    client = Quotes.factory(market='std')    all_data = []        batch_size = 800    for start in range(0, total_days, batch_size):        data = client.bars(symbol=symbol, start=start, offset=batch_size)        if data.empty:            break        all_data.append(data)        client.close()    return pd.concat(all_data, ignore_index=True) if all_data else pd.DataFrame()Q3: 如何处理股票代码格式?
from mootdx.utils import get_stock_market# 自动识别市场def normalize_symbol(symbol):    '''标准化股票代码'''    symbol = symbol.strip().upper()        # 移除市场前缀    if symbol.startswith(('SH', 'SZ')):        symbol = symbol[2:]        # 补齐6位数字    symbol = symbol.zfill(6)        return symbol# 使用示例symbols = ['sh600036', 'SZ000001', '1', '600519']normalized = [normalize_symbol(s) for s in symbols]print(normalized)  # ['600036', '000001', '000001', '600519']
Q4: 如何处理停牌和ST股票?from mootdx.quotes import Quotesimport pandas as pddef check_stock_status(symbols):    '''检查股票状态(停牌、ST等)'''    client = Quotes.factory(market='std')        try:        results = []        for symbol in symbols:            try:                # 获取实时行情                quotes = client.quotes(symbol=symbol)                                if quotes.empty:                    results.append({'symbol': symbol, 'status': '无数据'})                    continue                                stock_info = quotes.iloc[0]                                # 检查是否停牌(成交量为0且价格无变化)                if stock_info.get('vol', 0) == 0:                    results.append({'symbol': symbol, 'status': '可能停牌'})                elif'ST'in stock_info.get('name', ''):                    results.append({'symbol': symbol, 'status': 'ST股票'})                else:                    results.append({'symbol': symbol, 'status': '正常'})                                except Exception as e:                results.append({'symbol': symbol, 'status': f'错误: {e}'})                return pd.DataFrame(results)            finally:        client.close()# 使用示例test_symbols = ['600036', '000001', '000002', '600519']status_df = check_stock_status(test_symbols)print(status_df)Q5: 如何获取涨跌停板数据?
from mootdx.quotes import Quotesimport pandas as pddef find_limit_stocks(market=1):    '''查找涨跌停股票'''    client = Quotes.factory(market='std')        try:        # 获取股票列表        stocks = client.stocks(market=market)                if stocks.empty:            return pd.DataFrame()                limit_up = []    # 涨停        limit_down = []  # 跌停                # 批量获取行情(分批处理避免超时)        batch_size = 50        for i in range(0, len(stocks), batch_size):            batch_stocks = stocks.iloc[i:i+batch_size]['code'].tolist()                        try:                quotes = client.quotes(symbol=batch_stocks)                                ifnot quotes.empty:                    for _, stock in quotes.iterrows():                        change_pct = stock.get('change', 0)                                                # 涨停判断(接近10%或20%)                        if change_pct >= 9.8:                            limit_up.append({                                'code': stock['code'],                                'name': stock.get('name', ''),                                'price': stock.get('price', 0),                                'change': change_pct                            })                                                # 跌停判断                        elif change_pct <= -9.8:                            limit_down.append({                                'code': stock['code'],                                'name': stock.get('name', ''),                                'price': stock.get('price', 0),                                'change': change_pct                            })                        except Exception as e:                print(f'处理第 {i//batch_size + 1} 批股票时出错: {e}')                continue                result = {            'limit_up': pd.DataFrame(limit_up),            'limit_down': pd.DataFrame(limit_down)        }                return result            finally:        client.close()# 使用示例print('查找涨跌停股票...')limit_data = find_limit_stocks(market=1)  # 上海市场print(f'涨停股票 {len(limit_data['limit_up'])} 只:')ifnot limit_data['limit_up'].empty:    print(limit_data['limit_up'].head())print(f'\n跌停股票 {len(limit_data['limit_down'])} 只:')ifnot limit_data['limit_down'].empty:    print(limit_data['limit_down'].head())
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报。