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) # 返回 95. 工具函数股票市场判断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())本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报。
实盘配资平台提示:文章来自网络,不代表本站观点。