TDX 适配器使用指南
概述
本文档提供 TDX 适配器的详细使用指南,包括快速入门、常见使用场景和进阶用法。
快速入门
安装依赖
bash
pip install pytdx基本使用
python
from FQData.DataSource.adapters.tdx import TdxStockAdapter
adapter = TdxStockAdapter()
df = adapter.get_stock_day(
code='600000',
start='2024-01-01',
end='2024-12-31',
frequence='day'
)
print(f"获取 {len(df)} 条数据")
print(df.head())股票数据
获取股票列表
python
from FQData.DataSource.adapters.tdx import TdxStockAdapter
adapter = TdxStockAdapter()
# 获取所有 A 股列表
stock_list = adapter.get_stock_list('stock')
# 获取所有 ETF
etf_list = adapter.get_stock_list('etf')
# 获取所有债券
bond_list = adapter.get_stock_list('bond')
# 获取可转债
cb_list = adapter.get_stock_list('bond2')
# 获取北交所股票
bj_list = adapter.get_stock_list('bj')
# 获取退市股票
delist = adapter.get_stock_list('delist')获取日线数据
python
adapter = TdxStockAdapter()
# 日线
daily = adapter.get_stock_day(
code='600000',
start='2024-01-01',
end='2024-12-31',
frequence='day'
)
# 周线
weekly = adapter.get_stock_day(
code='600000',
start='2023-01-01',
end='2024-12-31',
frequence='week'
)
# 月线
monthly = adapter.get_stock_day(
code='600000',
start='2020-01-01',
end='2024-12-31',
frequence='month'
)获取分钟数据
python
adapter = TdxStockAdapter()
# 1 分钟线
min1 = adapter.get_stock_min(
code='600000',
start='2024-01-15',
end='2024-01-16',
frequence='1min'
)
# 5 分钟线
min5 = adapter.get_stock_min(
code='600000',
start='2024-01-01',
end='2024-01-31',
frequence='5min'
)
# 15 分钟线
min15 = adapter.get_stock_min(
code='600000',
start='2024-01-01',
end='2024-01-31',
frequence='15min'
)
# 30 分钟线
min30 = adapter.get_stock_min(
code='600000',
start='2024-01-01',
end='2024-01-31',
frequence='30min'
)
# 60 分钟线
min60 = adapter.get_stock_min(
code='600000',
start='2024-01-01',
end='2024-01-31',
frequence='60min'
)获取股票基本信息
python
adapter = TdxStockAdapter()
info = adapter.get_stock_info('600000')
print(info)获取除权除息信息
python
adapter = TdxStockAdapter()
xdxr = adapter.get_stock_xdxr('600000')
print(xdxr)获取最新 K 线
python
adapter = TdxStockAdapter()
# 单只股票
latest = adapter.get_stock_latest('600000')
# 多只股票
latest = adapter.get_stock_latest(['600000', '000001', '000002'])获取板块数据
python
adapter = TdxStockAdapter()
blocks = adapter.get_stock_block()
print(blocks)
# 过滤概念板块
gn_blocks = blocks[blocks['type'] == 'gn']
# 过滤地区板块
zs_blocks = blocks[blocks['type'] == 'zs']
# 过滤行业板块
hy_blocks = blocks[blocks['type'] == 'fg']指数数据
获取指数列表
python
from FQData.DataSource.adapters.tdx import TdxIndexAdapter
adapter = TdxIndexAdapter()
index_list = adapter.get_index_list()
print(index_list.head())获取指数日线
python
adapter = TdxIndexAdapter()
# 上证指数
daily = adapter.get_index_day(
code='000001',
start='2024-01-01',
end='2024-12-31'
)
# 沪深 300
daily = adapter.get_index_day(
code='000300',
start='2024-01-01',
end='2024-12-31'
)获取指数分钟数据
python
adapter = TdxIndexAdapter()
min_data = adapter.get_index_min(
code='000001',
start='2024-01-15',
end='2024-01-16',
frequence='5min'
)获取 ETF 数据
python
adapter = TdxIndexAdapter()
# ETF 列表
etf_list = adapter.get_etf_list()
# ETF 日线
etf_daily = adapter.get_index_day(
code='510300',
start='2024-01-01',
end='2024-12-31'
)期货数据
获取期货列表
python
from FQData.DataSource.adapters.tdx import TdxFutureAdapter
adapter = TdxFutureAdapter()
# 获取所有期货合约
future_list = adapter.get_extensionmarket_list()
print(future_list.head())
# 过滤特定品种
if_list = future_list[future_list['code'].str.startswith('IF')]获取期货日线
python
adapter = TdxFutureAdapter()
# 股指期货
daily = adapter.get_future_day(
code='IF2401',
start='2024-01-01',
end='2024-12-31',
frequence='day'
)
# 商品期货
daily = adapter.get_future_day(
code='CU2401',
start='2024-01-01',
end='2024-12-31',
frequence='day'
)获取期货分钟数据
python
adapter = TdxFutureAdapter()
min_data = adapter.get_future_min(
code='IF2401',
start='2024-01-15',
end='2024-01-16',
frequence='5min'
)获取期货实时行情
python
adapter = TdxFutureAdapter()
realtime = adapter.get_future_realtime('IF2401')
print(realtime)获取期货成交分笔
python
adapter = TdxFutureAdapter()
# 历史分笔
transaction = adapter.get_future_transaction(
code='IF2401',
start='2024-01-15',
end='2024-01-15'
)
# 实时分笔
realtime_tx = adapter.get_future_transaction_realtime('IF2401')债券数据
获取债券日线
python
from FQData.DataSource.adapters.tdx import TdxBondAdapter
adapter = TdxBondAdapter()
daily = adapter.get_bond_day(
code='019540',
start='2024-01-01',
end='2024-12-31'
)获取债券分钟数据
python
adapter = TdxBondAdapter()
min_data = adapter.get_bond_min(
code='019540',
start='2024-01-15',
end='2024-01-16',
frequence='5min'
)获取可转债数据
python
adapter = TdxBondAdapter()
# 可转债列表
cb_list = adapter.get_bond2stock_list()
# 可转债转股日线
cb_daily = adapter.get_bond2stock_day(
code='113009',
start='2024-01-01',
end='2024-12-31'
)实时行情
获取多只股票实时行情
python
from FQData.DataSource.adapters.tdx import TdxRealtimeAdapter
adapter = TdxRealtimeAdapter()
data = adapter.get_realtime(['600000', '000001', '000002'])
print(data)获取今日全部行情
python
from FQData.DataSource.adapters.tdx import get_today_all
data = get_today_all()
print(data.head())历史成交分笔
获取股票历史分笔
python
from FQData.DataSource.adapters.tdx import TdxTransactionAdapter
adapter = TdxTransactionAdapter()
data = adapter.get_transaction(
code='600000',
start='2024-01-15',
end='2024-01-15'
)获取股票实时分笔
python
adapter = TdxTransactionAdapter()
data = adapter.get_transaction_realtime('600000')IP 选择器
手动选择最优 IP
python
from FQData.DataSource.adapters.tdx import TdxIPSelector
best_ip = TdxIPSelector.select_best_ip()
print(f"股票最优 IP: {best_ip['stock']}")
print(f"期货最优 IP: {best_ip['future']}")获取指定类型 IP 列表
python
# 获取前 5 个最优股票 IP
stock_ips = TdxIPSelector.get_ip_list(type_='stock', n=5)
# 获取前 3 个最优期货 IP
future_ips = TdxIPSelector.get_ip_list(type_='future', n=3)测试 IP 响应时间
python
from datetime import timedelta
delay = TdxIPSelector.ping('1.2.3.4', 7709, 'stock')
print(f"响应时间: {delay.total_seconds():.3f}s")重置 IP 缓存
python
TdxIPSelector.reset()超时设置
设置实例超时
python
from FQData.DataSource.adapters.tdx import TdxStockAdapter
adapter = TdxStockAdapter(timeout=2.0)设置类默认超时
python
from FQData.DataSource.adapters.tdx import TdxBaseAdapter
TdxBaseAdapter.set_default_timeout(1.0)环境变量设置
bash
export TDX_DEFAULT_TIMEOUT=0.7错误处理
基本错误处理
python
from FQData.DataSource.adapters.tdx import TdxStockAdapter
from FQData.DataSource.base import (
DataSourceConnectionError,
DataNotFoundError,
DataSourceAPIError
)
adapter = TdxStockAdapter()
try:
data = adapter.get_stock_day('600000', '2024-01-01', '2024-12-31')
except DataSourceConnectionError as e:
print(f"连接错误: {e.code}, {e.details}")
except DataNotFoundError as e:
print(f"数据未找到: {e.code}")
except DataSourceAPIError as e:
print(f"API 错误: {e.code}")
except Exception as e:
print(f"其他错误: {e}")检查连接状态
python
from FQData.DataSource.adapters.tdx import TdxStockAdapter
adapter = TdxStockAdapter()
if adapter.is_connected:
print("已连接")
data = adapter.get_stock_day('600000', '2024-01-01', '2024-12-31')
else:
print("未连接")健康检查
python
from FQData.DataSource.adapters.tdx import TdxStockAdapter
adapter = TdxStockAdapter()
if adapter.health_check():
print("数据源健康")
else:
print("数据源不可用")数据处理示例
计算收益率
python
import pandas as pd
df = adapter.get_stock_day('600000', '2024-01-01', '2024-12-31')
df['returns'] = df['close'].pct_change()
df['cum_returns'] = (1 + df['returns']).cumprod()
print(df[['date', 'close', 'returns', 'cum_returns']].tail())计算移动平均
python
df['MA5'] = df['close'].rolling(window=5).mean()
df['MA10'] = df['close'].rolling(window=10).mean()
df['MA20'] = df['close'].rolling(window=20).mean()多只股票对比
python
stocks = ['600000', '600036', '601318']
data_dict = {}
for code in stocks:
data_dict[code] = adapter.get_stock_day(
code,
'2024-01-01',
'2024-12-31'
)
for code, df in data_dict.items():
df['normalized'] = df['close'] / df['close'].iloc[0] * 100保存到文件
python
df = adapter.get_stock_day('600000', '2024-01-01', '2024-12-31')
df.to_csv('600000_daily.csv', index=False)
df.to_excel('600000_daily.xlsx', index=False)进阶用法
连接池管理
python
from FQData.DataSource.adapters.tdx.connection_pool import get_tdx_pool
pool = get_tdx_pool()
print(f"HQ 连接数: {pool.hq_count}")
print(f"EX 连接数: {pool.ex_count}")
pool.close_all()批量获取多只股票
python
from FQData.DataSource.adapters.tdx import TdxStockAdapter
adapter = TdxStockAdapter()
codes = ['600000', '600036', '601318', '000001', '000002']
results = {}
for code in codes:
try:
data = adapter.get_stock_day(code, '2024-01-01', '2024-12-31')
results[code] = data
except Exception as e:
print(f"获取 {code} 失败: {e}")
results[code] = None数据重采样
python
df = adapter.get_stock_min('600000', '2024-01-01', '2024-01-31', '1min')
df['datetime'] = pd.to_datetime(df['datetime'])
df.set_index('datetime', inplace=True)
df_resampled = df.resample('5min').agg({
'open': 'first',
'high': 'max',
'low': 'min',
'close': 'last',
'volume': 'sum'
})常见问题
1. 返回 None 或空 DataFrame
可能原因:
- 股票代码不存在
- 日期范围无交易数据
- 网络连接问题
解决方案:
python
data = adapter.get_stock_day('600000', '2024-01-01', '2024-12-31')
if data is None or data.empty:
print("无数据,请检查代码和日期")2. 连接超时
可能原因:
- 网络问题
- TDX 服务器繁忙
- IP 被封禁
解决方案:
python
adapter = TdxStockAdapter(timeout=5.0)3. 数据不完整
可能原因:
- 停牌期间无数据
- 刚上市股票数据不全
解决方案:
python
df = adapter.get_stock_day('600000', '2020-01-01', '2024-12-31')
df = df.dropna()