
Tdxquant
- 145 installs
- 169 repo stars
- Updated June 29, 2026
- lzwme/finance-quant-skills
Helps with ai & agent building tasks.
About
tdxquant is a Claude Code skill for ai & agent building. It helps solo builders move faster with AI-assisted coding.
- tdxquant
- AI & Agent Building
- AI-coding skill
Tdxquant by the numbers
- 145 all-time installs (skills.sh)
- +10 installs in the week ending Aug 2, 2026 (Skillselion tracking)
- Ranked #3,440 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 2, 2026 (Skillselion catalog sync)
npx skills add https://github.com/lzwme/finance-quant-skills --skill tdxquantAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 145 |
|---|---|
| repo stars | ★ 169 |
| Last updated | June 29, 2026 |
| Repository | lzwme/finance-quant-skills ↗ |
What it does
Helps with ai & agent building tasks.
Files
通达信量化数据获取技能
任务目标
- 本 Skill 用于:通过通达信 TdxQuant (tqcenter) 接口获取A股市场数据、执行技术分析和查询交易相关信息
- 能力包含:行情快照、K线数据、证券基本信息、专业财务数据、股票/板块/市场交易数据、板块与成份股、可转债/ETF/新股信息、交易日历、通达信公式执行、行情订阅、交易下单
- 触发条件:用户提到 tdxquant、通达信、TdxQuant、tqcenter、获取A股数据、K线查询、财务数据、板块分析等
前置准备
- tqcenter 模块说明:tqcenter 位于通达信安装目录的
PYPlugins\user\tqcenter.py。脚本通过_tdx_init.py自动检测安装目录并将路径加入sys.path。用户也可以通过设置环境变量TDX_ROOT指定安装目录。 - 环境要求:需安装通达信金融终端(支持 TQ 策略功能的专业研究版、量化模拟版或期货通),并预先启动客户端
- Python 版本:支持 64 位 Python 3.7~3.14,建议 3.13
- 数据准备:部分数据(如专业财务数据、交易数据)需先在客户端中下载对应数据包
核心概念
- 证券代码格式:6位数字 + 市场后缀(大小写均可),如
600519.SH(上海)、000001.SZ(深圳)、430047.BJ(北交所) - 周期参数:
1m/5m/15m/30m/1h/1d/1w/1mon/1q/1y/tick - 复权类型:
none不复权、front前复权、back后复权 - 市场类型后缀:
.SH上海.SZ深圳.BJ北交所.HK港股.US美股.CSI中证指数.CNI国证指数.CFF中金期货 等
安装目录结构:
通达信安装目录\
├── TdxW.exe # 主程序
├── PYPlugins\
│ ├── TPyth.dll # 通信DLL
│ ├── TPythClient.dll # 通信DLL
│ ├── user\
│ │ └── tqcenter.py # TdxQuant 核心模块
│ ├── data\ # 下载数据目录
│ └── file\ # 发送文件目录操作步骤
1. 确定数据需求 — 智能体理解用户意图 2. 调用对应脚本 — 根据数据类型选择脚本 3. 解析结果 — 智能体分析返回的 JSON 格式数据
意图识别映射示例
| 用户提问 | 对应功能模块 | 调用参数 |
|---|---|---|
| "贵州茅台实时股价" | market_data.py snapshot | --code 600519.sh |
| "平安银行K线数据" | market_data.py kline | --code 000001.sz --period 1d |
| "招商银行基本信息" | market_data.py stock_info | --code 600036.sh |
| "招商银行财务指标" | financial_data.py financial | --code 600036.sh --fields fn193,fn197 |
| "半导体板块成分股" | sector_data.py sector_stocks | --block_name 半导体 |
| "今日新股申购" | etf_bond_data.py ipo_info | --ipo_type 2 --ipo_date 1 |
| "市场融资融券数据" | trading_data.py scjy | --fields sc1,sc25 |
| "MACD指标" | formula.py zb | --name MACD --arg 12,26,9 |
| "连涨3天选股" | formula.py xg | --name UPN --arg 3 |
使用示例
- 示例1:获取股票实时行情快照
- 场景/输入:用户说"查看贵州茅台的实时行情"
- 预期产出:返回股票代码、名称、现价、涨跌幅、成交量、五档买卖等信息
- 关键要点:调用
python scripts/market_data.py snapshot --code 600519.sh - 示例2:获取日K线数据
- 场景/输入:用户说"获取平安银行最近100天的日K线数据"
- 预期产出:返回日期、开盘价、最高价、最低价、收盘价、成交量等OHLCV数据
- 关键要点:调用
python scripts/market_data.py kline --code 000001.sz --period 1d --count 100 - 示例3:查询专业财务数据
- 场景/输入:用户说"查看招商银行最近的成本费用利润率和营业利润率"
- 预期产出:返回fn193成本费用利润率、fn194营业利润率等财务指标
- 关键要点:调用
python scripts/financial_data.py financial --code 600036.sh --fields fn193,fn194 --start 20240101
脚本调用映射参考
- 行情快照 →
python scripts/market_data.py snapshot --code 600519.sh - K线数据 →
python scripts/market_data.py kline --code 600519.sh --period 1d --count 100 - 证券基本信息 →
python scripts/market_data.py stock_info --code 600519.sh - 股票更多信息 →
python scripts/market_data.py more_info --code 600519.sh - 分红配送 →
python scripts/market_data.py divid_factors --code 600519.sh - 股本数据 →
python scripts/market_data.py gb_info --code 600519.sh --dates 20250101,20250601 - 专业财务数据 →
python scripts/financial_data.py financial --code 600519.sh --fields fn193,fn194,fn197 --start 20250101 - 指定日期财务数据 →
python scripts/financial_data.py financial_by_date --code 600519.sh --fields fn193,fn197 --year 0 --mmdd 0 - 单个财务指标 →
python scripts/financial_data.py gp_one_data --code 600519.sh --fields go1,go3,go5 - 股票交易数据 →
python scripts/trading_data.py gpjy --code 600519.sh --fields gp1,gp2,gp3 --start 20250101 - 板块交易数据 →
python scripts/trading_data.py bkjy --code 880660.sh --fields bk5,bk6,bk9 --start 20250101 - 市场交易数据 →
python scripts/trading_data.py scjy --fields sc1,sc2,sc3 --start 20250101 - 系统分类成份股 →
python scripts/sector_data.py stock_list --list_type 5 - 板块代码列表 →
python scripts/sector_data.py sector_list --with_name - 板块成份股 →
python scripts/sector_data.py sector_stocks --block_code 880081.sh - 股票所属板块 →
python scripts/sector_data.py stock_relation --code 688318.sh - 自定义板块操作 →
python scripts/sector_data.py user_sector --action list - 可转债信息 →
python scripts/etf_bond_data.py kzz_info --code 123039.sz - ETF跟踪指数 →
python scripts/etf_bond_data.py trackzs_etf --zs_code 950162.csi - 新股申购 →
python scripts/etf_bond_data.py ipo_info --ipo_type 2 --ipo_date 1 - 交易日列表 →
python scripts/calendar.py --start 20250101 --end 20250601 - 通达信公式(指标) →
python scripts/formula.py zb --name MACD --arg 12,26,9 --code 688318.sh --period 1d --count 100 - 通达信公式(选股) →
python scripts/formula.py xg --name UPN --arg 3 --code 688318.sh --period 1d --count 100 - 批量选股公式 →
python scripts/formula.py mul_xg --name UPN --arg 3 --codes 688318.sh,600519.sh --period 1d --count 20
资源索引
数据获取脚本
- scripts/market_data.py (用途与参数:行情快照snapshot、K线kline、基本信息stock_info、更多信息more_info、分红divid_factors、股本gb_info)
- scripts/financial_data.py (用途与参数:专业财务financial、指定日期财务financial_by_date、单个指标gp_one_data)
- scripts/trading_data.py (用途与参数:股票交易gpjy、板块交易bkjy、市场交易scjy及其by_date变体)
- scripts/sector_data.py (用途与参数:系统分类stock_list、板块列表sector_list、板块成份股sector_stocks、股票所属板块stock_relation、自定义板块user_sector)
- scripts/etf_bond_data.py (用途与参数:可转债kzz_info、ETF跟踪trackzs_etf、新股申购ipo_info)
- scripts/calendar.py (用途与参数:获取交易日列表,支持 --start/--end/--count)
- scripts/formula.py (用途与参数:通达信公式执行,支持zb指标/xg选股/exp专家/mul批量)
- scripts/trade.py (用途与参数:交易下单、查询持仓/委托/资产、撤单)
扩展参考
- Python 初始化指引 (何时读取:需要写 python 脚本自定义获取更多的数据时)
- API 使用示例与故障排除 (何时读取:需要查看常见用法时。提供了八种常见数据查询示例)
- tqcenter API (何时读取:需要查看完整API参数、字段说明、初始化配置时,此为最核心参考文档)
- 常量字典 (何时读取:需要查看市场类型、周期、复权类型等常量映射时)
- 策略开发与回测指引 (何时读取:需要写策略、执行策略回测时)
注意事项
- 运行脚本前,必须先启动通达信金融终端(支持TQ策略功能的版本),且 TdxW.exe 进程正在运行
- 如果安装目录下不存在
tqcenter.py,说明当前客户端不支持TQ策略,需升级通达信终端 - 证券代码必须带市场后缀(如
.SH、.SZ、.BJ),大小写均可,但不可省略 - 专业财务数据和交易数据需先在客户端中下载对应数据包
- 部分数据(如交易数据中的融资融券、陆股通等)仅展示特定日期之后的数据
- K线数据一次最多返回24000条,获取完整分钟线需多次分批获取
- 通达信公式执行时,公式名称和参数需符合通达信语法规范
- 后复权数据与获取的数据个数有关,只在返回的数据中进行后复权
- 使用
sys.path.insert(0, ...)而非append(),确保优先加载通达信安装目录的 tqcenter.py
策略开发与回测
快速开始
策略开发需要先初始化 tqcenter,参考 tdx_quant.md 中的「重要:Python 文件路径配置」章节。
import sys, os, winreg
# 自动获取通达信安装目录
key_path = r"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\通达信金融终端64"
with winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, key_path) as key:
tdx_root, _ = winreg.QueryValueEx(key, "InstallLocation")
sys.path.insert(0, os.path.join(tdx_root, 'PYPlugins', 'user'))
from tqcenter import tq
tq.initialize(__file__)策略代码结构模板
import pandas as pd
import vectorbt as vbt
from tqcenter import tq
tq.initialize(__file__)
pd.set_option('future.no_silent_downcasting', True)
# 1. 配置参数
CONFIG = {
'start_time': '20240101',
'end_time': '20241231',
'stock_list': ['600519.SH'],
'window': 5,
'init_cash': 100000,
'fees': 0.0003
}
# 2. 获取数据
df = tq.get_market_data(
field_list=['Close', 'Open'],
stock_list=CONFIG['stock_list'],
start_time=CONFIG['start_time'],
end_time=CONFIG['end_time'],
dividend_type='front',
period='1d'
)
close_df = tq.price_df(df, 'Close', column_names=CONFIG['stock_list'])
open_df = tq.price_df(df, 'Open', column_names=CONFIG['stock_list'])
# 3. 生成信号
ma = vbt.MA.run(close_df, window=CONFIG['window'])
entries = close_df.vbt.crossed_above(ma.ma)
exits = close_df.vbt.crossed_below(ma.ma)
entries = entries.shift(1).fillna(False)
exits = exits.shift(1).fillna(False)
# 4. 执行回测
portfolio = vbt.Portfolio.from_signals(
close=close_df,
entries=entries,
exits=exits,
price=open_df,
init_cash=CONFIG['init_cash'],
fees=CONFIG['fees'],
freq='D',
size_granularity=100
)
# 5. 结果分析
print(portfolio.stats())
print(portfolio.trades.records_readable)
tq.close()关键统计指标
# 总收益率
total_return = (final_value - init_cash) / init_cash
# 年化收益率
annual_return = (1 + total_return) ** (252 / trading_days) - 1
# 夏普比率
import numpy as np
sharpe_ratio = np.sqrt(252) * (daily_returns.mean() / daily_returns.std())
# 最大回撤
cum_returns = (1 + daily_returns).cumprod()
peak = cum_returns.cummax()
drawdown = (cum_returns - peak) / peak
max_drawdown = drawdown.min()常用信号生成
# 金叉信号
entries = close_df.vbt.crossed_above(ma_line)
# 死叉信号
exits = close_df.vbt.crossed_below(ma_line)
# 信号移位(次日开盘成交)
entries = entries.shift(1).fillna(False)
# 去除重复信号
entries = entries & ~entries.shift(1).fillna(False)更多示例
完整的策略开发与回测示例,包括:
- MACD全市场批量选股
- 连涨N日选股
- 实时行情订阅预警
- MA均线调仓信号
- 发送回测数据到通达信客户端
请参考 tq_use_case.md 的使用示例章节。
常量字典
1. 市场类型(证券代码后缀)
| 后缀 | 市场编号 | 说明 |
|---|---|---|
| .SZ | 0 | 深圳交易所 |
| .SH | 1 | 上海交易所 |
| .BJ | 2 | 北京交易所 |
| .SHO | 8 | 上海个股期权 |
| .SZO | 9 | 深圳个股期权 |
| .CFF | 47 | 中金期货 |
| .CZC | 28 | 郑州期货 |
| .DCE | 29 | 大连期货 |
| .SHF | 30 | 上海期货/上海能源 |
| .GFE | 66 | 广州期货 |
| .HK | 31 | 香港交易所 |
| .HI | 27 | 港股指数 |
| .US | 74 | 美国股票 |
| .CSI | 62 | 中证指数 |
| .CNI | 102 | 国证指数 |
| .NQ | 44 | 新三板 |
| .HG | 38 | 国内宏观指标 |
| .OF | 33 | 开放式基金净值 |
| .QHZ | 42 | 期货类指数 |
2. K线周期(period)
| 值 | 说明 |
|---|---|
1m | 1分钟 |
5m | 5分钟 |
15m | 15分钟 |
30m | 30分钟 |
1h | 60分钟 |
1d | 日线 |
1w | 周线 |
1mon | 月线 |
1q | 季线 |
1y | 年线 |
tick | 分笔 |
3. 复权类型(dividend_type)
get_market_data 使用(字符串)
| 值 | 说明 |
|---|---|
none | 不复权 |
front | 前复权 |
back | 后复权 |
公式接口使用(整数)
| 值 | 说明 |
|---|---|
| 0 | 不复权 |
| 1 | 前复权 |
| 2 | 后复权 |
4. 委托类型(order_type / tqconst)
| 常量 | 值 | 说明 |
|---|---|---|
| STOCK_BUY | 0 | 买入 |
| STOCK_SELL | 1 | 卖出 |
| CREDIT_BUY | 0 | 担保品买入(信用账户) |
| CREDIT_SELL | 1 | 担保品卖出(信用账户) |
| CREDIT_FIN_BUY | 69 | 融资买入 |
| CREDIT_SLO_SELL | 70 | 融券卖出 |
| ETF_PURCHASE | 45 | 基金申购 |
| ETF_REDEMPTION | 46 | 基金赎回 |
| FUTURE_OPEN_LONG | 101 | 期货开多 |
| FUTURE_OPEN_SHORT | 102 | 期货开空 |
| FUTURE_CLOSE_LONG | 103 | 期货平多 |
| FUTURE_CLOSE_SHORT | 104 | 期货平空 |
| OPTION_OPEN_LONG | 201 | 期权开多 |
| OPTION_OPEN_SHORT | 202 | 期权开空 |
| OPTION_CLOSE_LONG | 203 | 期权平多 |
| OPTION_CLOSE_SHORT | 204 | 期权平空 |
5. 报价类型(price_type / tqconst)
| 常量 | 值 | 说明 |
|---|---|---|
| tqconst.PRICE_MY | 0 | 自填价格 |
| tqconst.PRICE_SJ | 1 | 市价 |
| tqconst.PRICE_ZTJ | 2 | 涨停价/笼子上限 |
| tqconst.PRICE_DTJ | 3 | 跌停价/笼子下限 |
6. 委托状态(status)
| 常量 | 值 | 说明 |
|---|---|---|
| WTSTATUS_NULL | 0 | 无效单 |
| WTSTATUS_NOCJ | 1 | 未成交 |
| WTSTATUS_PARTCJ | 2 | 部分成交 |
| WTSTATUS_ALLCJ | 3 | 全部成交 |
| WTSTATUS_BCBC | 4 | 部分成交部分撤单 |
| WTSTATUS_ALLCD | 5 | 全部撤单 |
7. 买卖标志(bs_flag)
| 值 | 说明 |
|---|---|
| 0 | 买(红色B) |
| 1 | 卖(绿色S) |
| 2 | 未知(黄色) |
8. get_stock_list market 参数
| 值 | 说明 |
|---|---|
| 0 | 自选股 |
| 1 | 持仓股 |
| 5 | 所有A股 |
| 6 | 上证指数成份股 |
| 7 | 上证主板 |
| 8 | 深证主板 |
| 9 | 重点指数 |
| 10 | 所有板块指数 |
| 11 | 缺省行业板块 |
| 12 | 概念板块 |
| 13 | 风格板块 |
| 14 | 地区板块 |
| 16 | 研究行业一级 |
| 17 | 研究行业二级 |
| 18 | 研究行业三级 |
| 23 | 沪深300 |
| 24 | 中证500 |
| 25 | 中证1000 |
| 31 | ETF基金 |
| 32 | 可转债 |
| 50 | 沪深A股 |
| 51 | 创业板 |
| 52 | 科创板 |
| 53 | 北交所 |
| 91 | ETF追踪的指数 |
| 92 | 国内期货主力合约 |
| 101 | 国内期货 |
| 102 | 港股 |
| 103 | 美股 |
9. refresh_cache market 参数
| 值 | 说明 |
|---|---|
| AG | A股(默认) |
| HK | 港股 |
| US | 美股 |
| QH | 国内期货 |
| 股票期权 | |
| NQ | 新三板 |
| ZZ | 中证指数 |
| ZS | 综合指数 |
| OF | 开放式基金 |
Python 脚本初始化
重要:Python 文件路径配置
文件目录结构
通达信安装目录\
├── Tdxw.exe # 主程序
├── PYPlugins\ # 插件目录
│ ├── TPyth.dll # 通达信Python通信DLL
│ ├── TPythClient.dll # 通达信Python通信DLL
│ ├── user\ # 用户策略目录
│ │ └── tqcenter.py # TdxQuant核心模块
│ ├── data\ # 下载数据目录
│ └── file\ # 发送文件目录Python 策略文件可以放在任意位置。
导入 tqcenter 前,必须将通达信安装目录的 PYPlugins\user 路径添加到 sys.path。使用 `sys.path.insert(0, ...)` 确保加载正确的 `tqcenter.py`。
获取通达信安装目录
通达信Tdxw的安装目录存储在 Windows 注册表中:
- 注册表路径:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\通达信金融终端64 - 键名:
InstallLocation
可参考以下 Python 代码自动读取安装目录。示例:
import sys, winreg, os
# 从注册表获取安装目录
key_path = r"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\通达信金融终端64"
with winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, key_path) as key:
tdx_root, _ = winreg.QueryValueEx(key, "InstallLocation")
# 添加 PYPlugins/user 到 sys.path
sys.path.insert(0, os.path.join(tdx_root, 'PYPlugins', 'user'))
from tqcenter import tq
tq.initialize(__file__)关键说明:
tqcenter.py会在其上上级目录(PYPlugins/)自动定位TPythClient.dll- 使用
sys.path.insert(0, ...)而非sys.path.append(),优先加载通达信安装目录的tqcenter.py __file__为当前 Python 文件路径,用作策略唯一标识符- 允许用户通过环境变量
TDX_ROOT自定义安装目录。
初始化要点:
- 本技能必须检测到进程中有运行的TdxW.exe进程。
- 进程路径所在的程序目录即为通达信安装目录。
- python 文件示例中,请将
tdx_root替换为通达信安装目录。 - 如果检测不到tdxw.exe进程,请提示用户先运行通达信客户端。
- 通达信安装目录下面指定位置如果不存在tqcenter.py 文件,提示用户当前的客户端不支持TQ策略,需升级。
- 如果有多个TdxW.exe进程,请依次寻找,直到找到第一个含有tqcenter.py 文件的进程。
- 找到之后,请记住这个位置,作为
tdx_root,不用每次都查找,除非这个位置失效。
个人行情数据离线下载
首次安装通达信客户端后,可通过如下方式快速下载官方日线数据。
1. 适用范围:适用于通达信个人版PC端软件的盘后数据下载。 2. 文件包含:沪深京日线数据完整包(A股、B股、交易所指数和板块指数、回购、可交易基金、可转债等)。 3. 适用场景:首次安装通达信PC端软件或有较长时间没有下载日线时,可以下载此zip文件。 4. 使用方法:放置在客户端的vipdoc目录下,在vipdoc下解压文件覆盖。 5. 注意事项:如需下载包括当日的,请在更新日期变为当日之后再下载。
下载地址:https://data.tdx.com.cn/vipdoc/hsjday.zip
股票代码格式
- 上交所:
600000.SH - 深交所:
000001.SZ - 北交所:
430047.BJ - 港股:
00700.HK - 美股:
AAPL.US - 新三板:
430047.NQ - 股票期权:
10004073.SZO/10004073.SHO - 国内期货:代码.CFF / .SHF / .DCE / .CZC / .INE / .GFE
- 中证指数:
000300.CSI - 开放式基金净值:代码.OF
时间格式
- 仅日期:
YYYYMMDD(如20231231) - 含时间:
YYYYMMDDHHMMSS(如20231231150000)
相关参考
- 常量字典
- tqcenter API
- API 使用示例与故障排除
- 策略开发与回测指引
tqcenter API
TdxQuant 是由深圳市财富趋势科技股份有限公司研发的专业量化投研平台,支持通过 tqcenter.py 模块的 tq 类提供与通达信客户端交互的完整接口。本文档提供 tq 类核心 API 的详细说明。
一、技术说明
版本信息
- tqcenter.py 版本:1.0.6(2026-03-27)
- Python 支持:3.7 ~ 3.14(64位),推荐 3.13
依赖项
- TPyth.dll / TPythClient.dll:与通达信客户端通信,位于
PYPlugins/目录下(tqcenter.py所在目录的上级目录) - Python库:
json,ctypes,numpy,pandas,weakref,sys,os,shutil,time,pathlib,typing,collections,datetime,re,atexit,inspect,concurrent.futures,threading - 可选第三方库:
vectorbt(回测),plotly(图形)
二、行情数据接口
2.1 获取K线行情 get_market_data
tq.get_market_data(
field_list: List[str] = [],
stock_list: List[str] = [],
period: str = '',
start_time: str = '',
end_time: str = '',
count: int = -1,
dividend_type: Optional[str] = None,
fill_data: bool = True
) -> Dict根据股票列表获取历史 K 线数据。
参数说明:
| 参数 | 必填 | 类型 | 说明 |
|---|---|---|---|
| field_list | N | List[str] | 需返回的字段列表;空列表返回所有字段 |
| stock_list | Y | List[str] | 股票代码列表 |
| period | Y | str | K线周期 |
| start_time | N | str | 开始时间 |
| end_time | N | str | 结束时间;未传则默认当前时间 |
| count | N | int | count>0:取截止 end_time 最近 n 条;count<=0:使用 start_time/end_time 区间 |
| dividend_type | N | str | 复权类型:'none'(不复权)、'front'(前复权)、'back'(后复权) |
| fill_data | N | bool | 是否向前填充缺失数据,默认 True |
返回字段:
| 字段 | 类型 | 说明 |
|---|---|---|
| Date | str | 日期 |
| Time | str | 时间 |
| Open | str | 开盘价(元) |
| High | str | 最高价(元) |
| Low | str | 最低价(元) |
| Close | str | 收盘价(元) |
| Volume | str | 成交量(手) |
| Amount | str | 成交额(万元) |
| ForwardFactor | str | 前复权因子(仅 dividend_type=none 时有效) |
返回值: Dict,键为字段名,值为 pd.DataFrame(行=时间,列=股票代码)
重要注意:
count>0时start_time失效,end_time若未传默认为当前时间- 一次最多返回 24000 条数据,获取完整分钟线需分批
- 后复权数据与取的数据个数有关,只在返回的数据中进行后复权
dividend_type=None(Python None,非字符串)时默认不复权
数据样本:
{'Close': 688318.SH
2025-12-24 131.58,
'Volume': 688318.SH
2025-12-24 2257325.0}---
2.2 获取实时行情快照 get_market_snapshot
tq.get_market_snapshot(
stock_code: str,
field_list: List = []
) -> Dict获取指定股票的最新行情快照数据。
参数说明:
stock_code:单个股票代码,如'300505.SZ'field_list:可选,指定返回字段(大小写不敏感);空列表返回所有字段
完整返回字段:
| 字段 | 类型 | 说明 |
|---|---|---|
| ItemNum | str | 快照笔数 |
| LastClose | str | 前收盘价 |
| Open | str | 开盘价 |
| Max | str | 最高价 |
| Min | str | 最低价 |
| Now | str | 现价 |
| Volume | str | 总手 |
| NowVol | str | 现手 |
| Amount | str | 总成交金额 |
| Inside | str | 内盘(板块指数时为跌停家数) |
| Outside | str | 外盘(板块指数时为涨停家数) |
| TickDiff | str | 笔涨跌 |
| InOutFlag | str | 内外盘标志:0=Buy, 1=Sell, 2=Unknown |
| Jjjz | str | 基金净值 |
| Buyp | List[str] | 五档买价列表 |
| Buyv | List[str] | 五档买盘量列表 |
| Sellp | List[str] | 五档卖价列表 |
| Sellv | List[str] | 五档卖盘量列表 |
| UpHome | str | 上涨家数(对指数有效) |
| DownHome | str | 下跌家数(对指数有效) |
| Before5MinNow | str | 5分钟前价格 |
| Average | str | 均价 |
| XsFlag | str | 小数位数 |
| Zangsu | str | 涨速 |
| ZAFPre3 | str | 3日涨幅 |
数据样本:
{'ItemNum': '3342', 'LastClose': '34.21', 'Open': '33.78', 'Max': '36.49',
'Min': '32.50', 'Now': '35.06', 'Volume': '122881', 'NowVol': '1449',
'Amount': '43068.48', 'Inside': '60373', 'Outside': '62509',
'Buyp': ['35.05', '35.04', '35.02', '35.01', '35.00'],
'Buyv': ['154', '9', '49', '136', '154'],
'Sellp': ['35.06', '35.07', '35.08', '35.09', '35.10'],
'Sellv': ['4', '31', '139', '4', '4'],
'Average': '35.05', 'Zangsu': '-0.25', 'ZAFPre3': '-1.83', 'ErrorId': '0'}---
2.3 获取股票基础信息 get_stock_info
tq.get_stock_info(
stock_code: str,
field_list: List = []
) -> Dict注意:`field_list` 不能为空,必须明确指定字段列表。
完整返回字段(84个):
基础信息
| 字段 | 说明 |
|---|---|
| Name | 证券名称 |
| Unit | 交易单位 |
| VolBase | 量比的基量 |
| MinPrice | 最小价格变动 |
| XsFlag | 价格小数位数 |
| Fz | 开收市时间(4段,8元素列表) |
| DelayMin | 延时分钟数 |
| QHVolBaseRate | 期货期权的每手乘数 |
| HKVolBaseRate | 港股/日股/新加坡股每手股数 |
| BelongHS300 | 是否属于沪深300 |
| BelongHasKQZ | 是否含可转债 |
| BelongRZRQ | 是否是融资融券标的 |
| BelongHSGT | 是否属于沪深股通 |
| IsHKGP | 是否是港股 |
| IsQH | 是否是期货 |
| IsQQ | 是否是期权 |
| IsSTGP | 是否是ST股票 |
| IsQuitGP | 是否是退市整理板股票 |
| TodayDRFlag | 当天是否有除权除息(沪深京) |
| HSStockKind | 沪深京品种类型:0=指数,1=A股主板,2=北证A股,3=创业板,4=科创板,5=B股,6=债券,7=基金,8=权重,9=其它,10=非沪深京品种 |
股本数据
| 字段 | 说明 |
|---|---|
| ActiveCapital | 流通股本(万股) |
| J_zgb | 总股本(万股) |
| J_bg | B股(万股) |
| J_hg | H股(万股) |
财务数据(万元)
| 字段 | 说明 |
|---|---|
| J_zzc | 总资产 |
| J_ldzc | 流动资产 |
| J_gdzc | 固定资产 |
| J_wxzc | 无形资产 |
| J_ldfz | 流动负债 |
| J_cqfz | 少数股东权益 |
| J_zbgjj | 资本公积金 |
| J_jzc | 股东权益/净资产 |
| J_yysy | 营业收入 |
| J_yycb | 营业成本 |
| J_yszk | 应收账款 |
| J_yyly | 营业利润 |
| J_tzsy | 投资收益 |
| J_jyxjl | 经营现金净流量 |
| J_zxjl | 总现金净流量 |
| J_ch | 存货 |
| J_lyze | 利润总额 |
| J_shly | 税后利润 |
| J_jly | 净利润 |
| J_wfply | 未分配利益 |
每股指标
| 字段 | 说明 |
|---|---|
| J_jyl | 净资产收益率 |
| J_mgwfp | 每股未分配 |
| J_mgsy | 每股收益(折算为全年) |
| J_mgsy2 | 季报每股收益 |
| J_mggjj | 每股公积金 |
| J_mgjzc | 每股净资产 |
| J_mgjzc2 | 季报每股净资产 |
| J_gdqyb | 股东权益比 |
| J_gdrs | 股东人数 |
| J_HalfYearFlag | 报告期月份(3,6,9,12) |
| J_start | 上市日期 |
行业与地域
| 字段 | 说明 |
|---|---|
| tdx_dycode | 通达信地域代码 |
| tdx_dyname | 通达信地域 |
| rs_hycode_sim | 通达信行业代码 |
| rs_hyname | 通达信行业 |
| blockzscode | 所属的行业板块指数代码 |
| underly_setcode | 标的市场代码(如ETF跟踪的指数市场) |
| underly_code | 标的代码(如ETF跟踪的指数代码) |
数据样本:
{
'Name': '财富趋势', 'Unit': '100', 'VolBase': '102.22', 'MinPrice': '0.01',
'XsFlag': '2', 'Fz': ['570', '690', '780', '900', '900', '900', '900', '900'],
'DelayMin': '0', 'QHVolBaseRate': '0', 'HKVolBaseRate': '0',
'BelongHS300': '0', 'BelongHasKQZ': '0', 'BelongRZRQ': '1',
'BelongHSGT': '1', 'IsHKGP': '0', 'IsQH': '0', 'IsQQ': '0',
'IsSTGP': '0', 'IsQuitGP': '0', 'TodayDRFlag': '0', 'HSStockKind': '4',
'ActiveCapital': '25611.94', 'J_zgb': '25611.94', 'J_bg': '0.00', 'J_hg': '0.00',
'J_zzc': '389036.97', 'J_ldzc': '235598.84', 'J_gdzc': '972.62',
'J_wxzc': '1184.64', 'J_ldfz': '17412.97', 'J_cqfz': '73.15',
'J_zbgjj': '157998.02', 'J_jzc': '370454.03', 'J_yysy': '19827.85',
'J_yycb': '4258.70', 'J_yszk': '2726.99', 'J_yyly': '20836.07',
'J_tzsy': '5091.96', 'J_jyxjl': '5432.08', 'J_zxjl': '9779.30',
'J_ch': '61.84', 'J_lyze': '20829.85', 'J_shly': '18421.45',
'J_jly': '18421.34', 'J_wfply': '175521.63', 'J_jyl': '4.97',
'J_mgwfp': '6.85', 'J_mgsy': '0.96', 'J_mgsy2': '0.00',
'J_mggjj': '6.17', 'J_mgjzc': '14.46', 'J_mgjzc2': '14.46',
'J_gdqyb': '0.95', 'J_gdrs': '24154.00', 'J_HalfYearFlag': '9',
'J_start': '20200427', 'tdx_dycode': '18', 'tdx_dyname': '深圳板块',
'rs_hycode_sim': 'X4202', 'rs_hyname': '软件服务',
'blockzscode': '881355', 'underly_setcode': '0', 'underly_code': '',
'ErrorId': '0'
}---
2.4 获取股票所属板块 get_relation
tq.get_relation(stock_code: str = '') -> List[Dict]获取指定股票所属的全部板块信息。
参数说明:
stock_code:股票代码,如'688318.SH'
返回字段:
| 字段 | 说明 |
|---|---|
| BlockCode | 板块代码(无板块代码的板块返回 "0") |
| BlockName | 板块名称 |
| BlockType | 板块类型(行业、地区、概念、风格、指数等) |
| GPNume | 成份股数量 |
数据样本:
[{'BlockCode': '881355.SH', 'BlockName': '软件服务', 'BlockType': '行业', 'GPNume': '234'},
{'BlockCode': '880218.SH', 'BlockName': '深圳板块', 'BlockType': '地区', 'GPNume': '427'},
{'BlockCode': '880592.SH', 'BlockName': '互联金融', 'BlockType': '概念', 'GPNume': '211'},
{'BlockCode': '880948.SH', 'BlockName': '人工智能', 'BlockType': '概念', 'GPNume': '1049'},
{'BlockName': '沪股通标的', 'BlockType': '风格', 'GPNume': '1763'},
{'BlockName': '中证500', 'BlockType': '指数', 'GPNume': '500'}]from tqcenter import tq
tq.initialize(__file__)
gp_block_res = tq.get_relation(stock_code='688318.SH')
print(gp_block_res)---
2.6 获取分红配送数据 get_divid_factors
tq.get_divid_factors(
stock_code: str,
start_time: str,
end_time: str
) -> pd.DataFrame返回 DataFrame 列:
Type:类型;Bonus:每10股分红;AllotPrice:配股价;ShareBonus:送股比例;Allotment:配股比例
---
2.7 获取更多股票信息 get_more_info
tq.get_more_info(
stock_code: str = '',
field_list: List = []
) -> Dict获取股票更多扩展信息,包含涨幅系列、主力净额、L2数据、封单、PE/PB/市值等上百个字段。field_list 为空返回所有字段。
完整返回字段(100+个):
基本信息
| 字段 | 说明 |
|---|---|
| MainBusiness | 主营构成 |
| SafeValue | 安全分 |
| ShineValue | 亮点数 |
| ShapeValue | 短期形态+中期形态+长期形态编号 |
| TPFlag | 停牌标识 |
| ZTPrice | 涨停价 |
| DTPrice | 跌停价 |
| HqDate | 行情日期 |
行情指标
| 字段 | 说明 |
|---|---|
| fHSL | 换手率 |
| fLianB | 量比 |
| Wtb | 委比 |
| Zsz | 总市值(亿) |
| Ltsz | 流通市值(亿) |
| vzangsu | 量涨速 |
| Fzhsl | 分钟换手率 |
| FzAmo | 2分钟金额(万元) |
| VOpenZAF | 抢筹涨幅 |
涨幅系列
| 字段 | 说明 |
|---|---|
| ZAF | 涨幅 |
| ZAFYesterday | 昨日涨幅 |
| ZAFPre2D | 前天涨幅 |
| ZAFPre5 | 5日涨幅 |
| ZAFPre10 | 10日涨幅 |
| ZAFPre20 | 20日涨幅 |
| ZAFPre30 | 30日涨幅 |
| ZAFPre60 | 60日涨幅 |
| ZAFYear | 年初至今涨幅 |
| ZAFPreMyMonth | 涨幅(本月来) |
| ZAFPreOneYear | 涨幅(一年来) |
主力资金
| 字段 | 说明 |
|---|---|
| Zjl | 主买净额(万元) |
| Zjl_HB | 主力净流入(万元) |
L2数据
| 字段 | 说明 |
|---|---|
| TotalBVol | 总买量 |
| TotalSVol | 总卖量 |
| BCancel | 总撤买量 |
| SCancel | 总撤卖量 |
| L2TicNum | L2逐笔成交数 |
| L2OrderNum | L2逐笔委托数 |
封单与竞价
| 字段 | 说明 |
|---|---|
| FCAmo | 封单额(万元) |
| FCb | 封成比 |
| OpenAmo | 开盘金额(万元)(A股和板块指数有效) |
| OpenZTBuy | 竞价涨停买入金额(万元) |
| OpenFDE | 开盘封单额(万元) |
| OpenAmoPre1 | 昨开盘金额(万元) |
| OpenVolPre1 | 昨开盘量 |
| CJJEPre1 | 昨成交额(万元) |
| CJJEPre3 | 3日成交额(万元) |
| FDEPre1 | 昨封单额(万元) |
| FDEPre2 | 前封单额(万元) |
涨停相关
| 字段 | 说明 |
|---|---|
| ZTGPNum | 板块指数的涨停家数 |
| LastStartZT | 几天 |
| LastZTHzNum | 几板 |
| EverZTCount | 连板天 |
| ConZAFDateNum | 连涨天数 |
| YearZTDay | 年涨停天数 |
估值与价格
| 字段 | 说明 |
|---|---|
| MA5Value | 5日均价 |
| HisHigh | 52周最高 |
| HisLow | 52周最低 |
| IPO_Price | 发行价 |
| More_YJL | ETF,LOF溢价率 |
| BetaValue | 贝塔系数 |
| DynaPE | 动态市盈率 |
| MorePE | 市盈率(港股:动,其他扩展:静) |
| StaticPE_TTM | 市盈率(TTM) |
| DYRatio | 股息率 |
| PB_MRQ | 市净率(MRQ) |
股票属性
| 字段 | 说明 |
|---|---|
| IsT0Fund | 是否是T+0基金 |
| IsZCZGP | 是否是注册制A股 |
| IsKzz | 是否可转债 |
| Kzz_HSCode | 可转债对应的正股代码 |
| QHMainYYMM | 主力合约关联的月份(期货),主力和次主力 |
财务扩展
| 字段 | 说明 |
|---|---|
| FreeLtgb | 自由流通股本(万) |
| Yield | 应计利息(债券),占款天数(回购) |
| KfEarnMoney | 扣非净利润(万元) |
| RDInputFee | 研发费用(万元) |
| CashZJ | 货币资金(万元) |
| PreReceiveZJ | 合同负债(万元) |
| OtherQYJzc | 其它权益工具(万元) |
| StaffNum | 员工人数 |
近期事件日期
| 字段 | 说明 |
|---|---|
| RecentGGJYDate | 最近北上大额交易日 |
| RecentHGDate | 最近回购预案日 |
| RecentIncentDate | 最近股权激励预案日 |
| NoticeDate_Recent | 最近业绩预告日 |
| RecentReleaseDate | 最近解禁日 |
| RecentDZDate | 最近定增日 |
| ReportDate | 最近财报公告日期 |
| ZTDate_Recent | 近2年最近涨停板日期 |
| DTDate_Recent | 近2年最近跌停板日期 |
| TopDate_Recent | 近2年最近龙虎榜日期 |
| StopJYDate_Recent | 最近停牌日期 |
涨停跌停的判断:用get_more_info取FCAmo来判断涨停跌停,大于0是涨停,小于0是跌停。
数据样本:
{
'MainBusiness': '软件服务收入', 'SafeValue': '98', 'ShineValue': '3',
'ShapeValue': '101308', 'TPFlag': '0', 'ZTPrice': '151.62', 'DTPrice': '101.08',
'HqDate': '20260227', 'fHSL': '0.86', 'fLianB': '0.89', 'Wtb': '-0.66',
'Zsz': '326.91', 'Ltsz': '326.91', 'vzangsu': '2.17', 'Fzhsl': '0.12',
'FzAmo': '514.92', 'VOpenZAF': '0.00', 'ZAF': '1.02', 'ZAFYesterday': '-1.21',
'ZAFPre2D': '1.99', 'ZAFPre5': '-1.56', 'ZAFPre10': '-3.44', 'ZAFPre20': '-10.76',
'ZAFPre30': '-10.13', 'ZAFPre60': '-1.59', 'ZAFYear': '-3.54',
'ZAFPreMyMonth': '-5.23', 'ZAFPreOneYear': '10.27', 'Zjl': '0.00', 'Zjl_HB': '0.00',
'TotalBVol': '1295.00', 'TotalSVol': '3555.00', 'BCancel': '42606.00',
'SCancel': '40266.00', 'L2TicNum': '6880', 'L2OrderNum': '29448',
'FCAmo': '0.00', 'FCb': '0.00', 'OpenAmo': '1069400.00', 'OpenZTBuy': '0.00',
'OpenFDE': '0.00',
'ZTGPNum': '0', 'EverZTCount': '0', 'ConZAFDateNum': '1', 'YearZTDay': '0',
'MA5Value': '126.56', 'HisHigh': '180.86', 'HisLow': '83.41', 'IPO_Price': '107.41',
'More_YJL': '0.00', 'BetaValue': '2.31', 'DynaPE': '133.10', 'MorePE': '107.56',
'StaticPE_TTM': '94.99', 'DYRatio': '0.28', 'PB_MRQ': '8.82',
'IsT0Fund': '0', 'IsZCZGP': '1', 'IsKzz': '0', 'QHMainYYMM': '0',
'FreeLtgb': '7935.14', 'Yield': '106.94', 'KfEarnMoney': '9778.22',
'RDInputFee': '5894.58', 'CashZJ': '60954.52', 'StaffNum': '446',
'RecentReleaseDate': '20230427', 'ReportDate': '20251031',
'ZTDate_Recent': '20241008', 'TopDate_Recent': '20250625',
'ErrorId': '0'
}---
2.8 获取股本信息 get_gb_info
tq.get_gb_info(
stock_code: str = '',
date_list: List[str] = [],
count: int = 1
) -> Dict参数说明:
date_list:日期列表,格式YYYYMMDD;须从小到大排序;len(date_list)必须 ≥countcount:要获取的日期数量,必须 ≥ 1
返回字段:
| 字段 | 说明 |
|---|---|
| Date | 日期 |
| Zgb | 总股本 |
| Ltgb | 流通股本 |
数据样本:
[
{'Date': 20250101, 'Zgb': 182942480.0, 'Ltgb': 182942480.0},
{'Date': 20250601, 'Zgb': 182942480.0, 'Ltgb': 182942480.0}
]---
2.9 获取可转债信息 get_kzz_info
tq.get_kzz_info(
stock_code: str = '',
field_list: List[str] = []
) -> Dict完整返回字段:
| 字段 | 说明 |
|---|---|
| KZZCode | 可转债代码 |
| HSCode | 正股代码 |
| ZGPrice | 转股价格 |
| CurRate | 当期利率 |
| RestScope | 剩余规模(万) |
| PutBack | 回售触发价 |
| ForceRedeem | 强赎触发价 |
| ZGDate | 转股日 |
| EndPrice | 到期价 |
| EndDate | 到期日期 |
| ZGRate | 转股比率% |
| RealValue | 纯债价值 |
| ExpireYield | 到期收益率% |
| KZZScore | 可转债评级 |
| HSScore | 主体评级 |
| AGPrice | 正股当前价格 |
| KZZPrice | 可转债当前价格 |
| KZZYj | 溢价率 |
| ZGValue | 转股价值 |
kzz_info = tq.get_kzz_info(stock_code='123039.SZ')---
2.10 获取新股申购信息 get_ipo_info
tq.get_ipo_info(
ipo_type: int = 0,
ipo_date: int = 0
) -> listipo_type:0=新股申购,1=新发债,2=两者都返回ipo_date:0=只返回今天,1=今天及以后
返回字段:
| 字段 | 说明 |
|---|---|
| code | 申购代码 |
| name | 证券名称 |
| SGCode | 申购代码 |
| SGDate | 申购日期 |
| SGPrice | 申购价格 |
| PE_Issue | 市盈率 |
| MaxSG | 最大申购额度 |
| setcode | 市场代码:0=沪市,1=深市 |
数据样本:
[
{'MaxSG': '0.00', 'PE_Issue': '0.00', 'SGCode': '371036', 'SGDate': '20251226',
'SGPrice': '100.00', 'code': '301036', 'name': '双乐转债', 'setcode': '0'},
{'MaxSG': '0.00', 'PE_Issue': '0.00', 'SGCode': '718676', 'SGDate': '20251225',
'SGPrice': '100.00', 'code': '688676', 'name': '金05转债', 'setcode': '1'}
]---
2.11 获取跟踪指数的ETF信息 get_trackzs_etf_info
tq.get_trackzs_etf_info(zs_code: str = '') -> List[Dict]获取跟踪某一指数的全部ETF基金信息。
zs_code:指数代码,如'000300.CSI'(沪深300)、'950162.CSI'(科创芯片设计)
返回字段:
| 字段 | 说明 |
|---|---|
| Code | ETF代码 |
| Name | ETF名称 |
| NowPrice | 现价 |
| PreClose | 昨收 |
| IOPV | 净值 |
| Zgb | 净额(万份) |
| Sz | 规模(亿元) |
数据样本:
[{'Code': '589210.SH', 'Name': '科创芯片设计ETF', 'NowPrice': '1.208',
'PreClose': '1.192', 'IOPV': '1.2071', 'Zgb': '7646.90', 'Sz': '0.92'}, ...]---
三、专业数据接口
3.1 获取专业财务数据 get_financial_data
tq.get_financial_data(
stock_list: List[str] = [],
field_list: List[str] = [],
start_time: str = '',
end_time: str = '',
report_type: str = 'report_time'
) -> Dict获取财务报表数据(字段 FN1~FN584),需要客户端下载专业财务数据包。
report_type:'announce_time'(按公告时间)或'tag_time'(按标签时间),默认按报告期- 返回值:
Dict,键为股票代码,值为pd.DataFrame
常用字段(完整字段请参考官方文档):
| 字段 | 说明 |
|---|---|
| FN1 | 基本每股收益 |
| FN2 | 扣除非经常性损益每股收益 |
| FN3 | 每股未分配利润 |
| FN4 | 每股净资产 |
| FN5 | 每股资本公积金 |
| FN6 | 净资产收益率 |
| FN7 | 每股经营现金流量 |
| FN8 | 货币资金 |
| FN21 | 流动资产合计 |
| FN40 | 资产总计 |
| FN54 | 流动负债合计 |
| FN63 | 负债合计 |
| FN64 | 实收资本(或股本) |
| FN68 | 未分配利润 |
| FN72 | 所有者权益合计 |
| FN73 | 负债和所有者权益合计 |
| FN107 | 经营活动产生的现金流量净额 |
| FN119 | 投资活动产生的现金流量净额 |
| FN128 | 筹资活动产生的现金流量净额 |
| FN131 | 现金及现金等价物净增加额 |
| FN134 | 净利润 |
返回字段: announce_time(公告日期)、tag_time(报告期)+ 上述财务字段
---
3.2 按年度/季度获取财务数据 get_financial_data_by_date
tq.get_financial_data_by_date(
stock_list: List[str] = [],
field_list: List[str] = [],
year: int = 0,
mmdd: int = 0
) -> Dictyear:年份(如2023);0返回最新mmdd:报告期月日(如331=一季报,630=中报,930=三季报,1231=年报);0返回最新
---
3.3 获取股票交易数据 get_gpjy_value
tq.get_gpjy_value(
stock_list: List[str] = [],
field_list: List[str] = [],
start_time: str = '',
end_time: str = ''
) -> Dict获取股票市场交易数据(字段 GP1~GP46),包含:股东人数、龙虎榜、融资融券、大宗交易、陆股通、涨停数据等。
完整返回字段(GP1~GP46):
| 字段 | 说明 |
|---|---|
| GP01 | 股东人数 股东户数(户) |
| GP02 | 龙虎榜 买入总计(万元) 卖出总计(万元) |
| GP03 | 融资融券1 融资余额(万元) 融券余量(股) |
| GP04 | 大宗交易 成交均价(元) 成交额(万元) |
| GP05 | 增减持1 成交均价(元) 变动股数(股) |
| GP06 | 陆股通持股量 持股数量(股) |
| GP07 | 陆股通市场成交净额 陆股通市场净买入(万元) |
| GP08 | 龙虎榜机构(卖方)数据 卖方机构个数 机构卖出金额(万元) |
| GP09 | 龙虎榜机构(买方)数据 买方机构个数 机构买入金额(万元) |
| GP10 | 近3月机构调研情况 近3月机构调研次数 近3月调研机构数量 |
| GP11 | 融资融券2 融资买入额(万元) 融资偿还额(万元) |
| GP12 | 融资融券3 融券卖出量(股) 融券偿还量(股) |
| GP13 | 融资融券4 融资净买入(万元) 融券净卖出(股) |
| GP14 | 涨停数据 涨停金额(万元) 开板次数 |
| GP15 | 涨跌停 涨跌停状态 封单金额(万元) |
| GP16 | 总市值 总市值(万元) |
| GP17 | 龙虎榜营业部数据 买入金额(万元) 卖出金额(万元) |
| GP18 | 龙虎榜沪深股通数据 买入金额(万元) 卖出金额(万元) |
| GP19 | 每周股票质押数量 无限售股份质押数(万) 有限售股份质押数(万) |
| GP20 | 每周股票质押比例 质押比例(%) |
| GP21 | 股息率 股息率(%) |
| GP22 | 涨跌停 封成比 封流比 |
| GP23 | 拟增减持 拟增持数量(万股) 拟减持数量(万股) |
| GP24 | 涨停 首次涨停时间 涨停最大封单额(万) |
| GP25 | 盘前盘后成交量 开盘成交量(手) 盘后固定成交量(手) |
| GP26 | 拟增减持金额 拟增持金额(万元) 拟减持金额(万元) |
| GP27 | 人气排名 市场人气排名 行业人气排名 |
| GP28 | 股票回购 回购均价(元) 回购数量(万股) |
| GP29 | 证券信息 是否复牌日 是否更名日 |
| GP30 | 分红送转 派息金额(万元) 送转数量(股) |
| GP31 | 转融券 期初余量(股) 期末余量(股) |
| GP32 | 转融券 融出数量(股) 融出市值(元) |
| GP33 | 跌停数据 跌停金额(万元) 开板次数 |
| GP34 | 跌停 首次跌停时间 跌停最大封单额(万) |
| GP35 | 增减持2 增持数量(股) 减持数量(股) |
| GP36 | 竞价涨停买 买入金额(万元) |
| GP37 | 龙虎榜2 上榜类型连续交易日(天) |
| GP38 | 涨停相关1 近1年涨停次数 近1年溢价5%次数 |
| GP39 | 涨停相关2 近1年首板封板率(%) 近1年次日红盘率(%) |
| GP40 | 涨停相关3 近1年连板率(%) 最后涨停时间 |
| GP41 | 股权登记日 配股股权登记日 |
| GP42 | 龙虎榜专业机构买卖净额 买方成交净额(万元) 卖方成交净额(万元) |
| GP43 | 配股实施 配股价格(元) 配股数量(万股) |
| GP44 | 股票评分 综合评分 |
| GP45 | 评级系数 评级系数 |
| GP46 | 拟询价转让 拟转让股数(万股) 拟转让占总股本(%) |
数据样本:
{'688318.SH': {'GP3': [{'Date': '20250102', 'Value': ['141405.89', '11113.00']}]}}---
3.4 按日期获取股票交易数据 get_gpjy_value_by_date
tq.get_gpjy_value_by_date(
stock_list: List[str] = [],
field_list: List[str] = [],
year: int = 0,
mmdd: int = 0
) -> Dict---
3.5 获取板块交易数据 get_bkjy_value
tq.get_bkjy_value(
stock_list: List[str] = [],
field_list: List[str] = [],
start_time: str = '',
end_time: str = ''
) -> Dict获取板块级别市场交易数据(字段 BK5~BK19),包含:PE/PB/PS/PC、市值、涨跌停数、融资融券等。
完整返回字段(BK5~BK19):
| 字段 | 说明 |
|---|---|
| BK5 | 市盈率TTM 整体法 算术平均 |
| BK6 | 市净率MRQ 整体法 算术平均 |
| BK7 | 市销率TTM 整体法 算术平均 |
| BK8 | 市现率TTM 整体法 算术平均 |
| BK9 | 涨跌数 上涨家数 下跌家数 |
| BK10 | 板块总市值(亿元) 整体法 算术平均 |
| BK11 | 板块流通市值(亿元) 整体法 算术平均 |
| BK12 | 涨停数 涨停家数 曾涨停家数 |
| BK13 | 跌停数 跌停家数 曾跌停家数 |
| BK14 | 涨停数据 市场高度(不含ST股和未开板新股) 2板及以上涨停个数 |
| BK15 | 融资融券 沪深京融资余额(万元) 沪深京融券余额(万元) |
| BK16 | 陆股通资金流入 沪股通流入金额(亿元) 深股通流入金额(亿元) |
| BK17 | 开盘成交数 开盘成交额(万元) 开盘成交量(万股) |
| BK18 | 板块股息率(%) 算数平均 整体法 |
| BK19 | 板块自由流通市值(亿元) 整体法 算术平均 |
数据样本:
{
'880660.SH': {
'BK5': [{'Date': '20250102', 'Value': ['55.28', '55.50']}],
'BK6': [{'Date': '20250102', 'Value': ['4.62', '3.79']}],
'BK9': [{'Date': '20250102', 'Value': ['0.00', '35.00']}]
}
}---
3.6 按日期获取板块交易数据 get_bkjy_value_by_date
tq.get_bkjy_value_by_date(
stock_list: List[str] = [],
field_list: List[str] = [],
year: int = 0,
mmdd: int = 0
) -> Dict---
3.7 获取市场交易数据 get_scjy_value
tq.get_scjy_value(
field_list: List[str] = [],
start_time: str = '',
end_time: str = ''
) -> Dict获取市场整体宏观交易数据(字段 SC01~SC42),包含:融资融券、陆股通、涨停、打板资金、ETF规模、新开户等。无需传 stock_list。
完整返回字段(SC01~SC42):
| 字段 | 说明 |
|---|---|
| SC01 | 融资融券 沪深京融资余额(万元) 沪深京融券余额(万元) |
| SC02 | 陆股通资金流入 沪股通流入金额(亿元) 深股通流入金额(亿元) |
| SC03 | 沪深京涨停股个数 涨停股个数 曾涨停股个数 |
| SC04 | 沪深京跌停股个数 跌停股个数 曾跌停股个数 |
| SC05 | 上证50股指期货 净持仓(手) |
| SC06 | 沪深300股指期货 净持仓(手) |
| SC07 | 中证500股指期货 净持仓(手) |
| SC08 | ETF基金规模份额数据 ETF基金规模(亿份) ETF净申赎(亿份) |
| SC09 | 沪月新开A股账户 沪月新开A股账户(万户) |
| SC10 | 增减持统计 增持额(万元) 减持额(万元) |
| SC11 | 大宗交易 溢价的大宗交易额(万元) 折价的大宗交易额(万元) |
| SC12 | 限售解禁 限售解禁计划额(亿元) 限售解禁股份实际上市金额(亿元) |
| SC13 | 分红 市场总分红额(亿元) |
| SC14 | 募资 市场总募资额(亿元) |
| SC15 | 打板资金 封板成功资金(亿元) 封板失败资金(亿元) |
| SC16 | 龙虎榜 买入总金额(亿元) 卖出总金额(亿元) |
| SC17 | 龙虎榜机构数据 买入金额(亿元) 卖出金额(亿元) |
| SC18 | 龙虎榜营业部数据 买入金额(亿元) 卖出金额(亿元) |
| SC19 | 龙虎榜沪深股通数据 买入金额(亿元) 卖出金额(亿元) |
| SC20 | 陆股通净买入 沪股通净买入额(亿元) 深股通净买入额(亿元) |
| SC21 | 每周无限售质押率 深市质押率(%) 沪市质押率(%) |
| SC22 | 每周有限售质押率 深市质押率(%) 沪市质押率(%) |
| SC23 | 连板家数 连板股个数(包含ST) 连板股个数(不含ST) |
| SC24 | 沪深京涨跌停股个数 涨停股个数(不含ST) 跌停股个数(不含ST) |
| SC25 | 融资融券 沪深京融资买入额(万元) 沪深京融券卖出量(万股) |
| SC26 | 每周市场质押比 每周市场质押比例(%) |
| SC27 | 央行公开市场净投放 央行公开市场净投放(亿元) |
| SC28 | 历史A股新高新低数 历史新高A股个数 历史新低A股个数 |
| SC29 | 120天A股新高新低数 120天新高A股个数 120天新低A股个数 |
| SC30 | 涨停数据 市场高度 2板以上涨停个数 |
| SC31 | 涨跌家数 涨家数 跌家数 |
| SC32 | 20天A股新高新低数 20天新高A股个数 20天新低A股个数 |
| SC33 | 市场总封单金额 涨停封单金额(亿元) 跌停封单金额(亿元) |
| SC34 | 涨跌股成交量 上涨股成交量(万手) 下跌股成交量(万手) |
| SC35 | 涨停数据 换手板家数 回封率(%) |
| SC36 | 曾涨跌停股个数 曾涨停股个数 曾跌停股个数 |
| SC37 | 转融券 融出市值(亿元) 期末余额(亿元) |
| SC38 | ETF基金规模金额数据 ETF基金规模(亿元) ETF净申赎(亿元) |
| SC39 | 涨跌5%家数 涨幅大于等于5%家数 跌幅大于等于5%家数 |
| SC40 | 陆股通成交 陆股通成交总额(亿元) 陆股通成交总笔(万笔) |
| SC41 | 中证1000股指期货 净持仓(手) |
| SC42 | 沪深股通成交金额 沪股通成交总额(亿元) 深股通成交总额(亿元) |
---
3.8 按日期获取市场交易数据 get_scjy_value_by_date
tq.get_scjy_value_by_date(
field_list: List[str] = [],
year: int = 0,
mmdd: int = 0
) -> Dict---
3.9 获取股票单个数据字段 get_gp_one_data
tq.get_gp_one_data(
stock_list: List[str] = [],
field_list: List[str] = []
) -> Dict获取股票单个数据字段(字段 GO1~GO47,不按时间序列,返回当前值),包含:发行价、一致预期EPS、解禁日、机构持股、业绩预告等。
完整返回字段(GO1~GO47):
基本信息
| 字段 | 说明 |
|---|---|
| GO1 | 发行价(元) |
| GO2 | 总发行数量(万股) |
一致预期
| 字段 | 说明 |
|---|---|
| GO3 | 一致预期目标价(元) |
| GO4 | 一致预期T年度 |
| GO5 | 一致预期T年每股收益 |
| GO6 | 一致预期T+1年每股收益 |
| GO7 | 一致预期T+2年每股收益 |
| GO8 | 一致预期T年净利润(万元) |
| GO9 | 一致预期T+1年净利润(万元) |
| GO10 | 一致预期T+2年净利润(万元) |
| GO11 | 一致预期T年营业收入(万元) |
| GO12 | 一致预期T+1年营业收入(万元) |
| GO13 | 一致预期T+2年营业收入(万元) |
| GO14 | 一致预期T年营业利润(万元) |
| GO15 | 一致预期T+1年营业利润(万元) |
| GO16 | 一致预期T+2年营业利润(万元) |
| GO17 | 一致预期T年每股净资产(元) |
| GO18 | 一致预期T+1年每股净资产(元) |
| GO19 | 一致预期T+2年每股净资产(元) |
| GO20 | 一致预期T年净资产收益率(%) |
| GO21 | 一致预期T+1年净资产收益率(%) |
| GO22 | 一致预期T+2年净资产收益率(%) |
| GO23 | 一致预期T年PE |
| GO24 | 一致预期T+1年PE |
| GO25 | 一致预期T+2年PE |
解禁与持股
| 字段 | 说明 |
|---|---|
| GO26 | 最新解禁日(YYMMDD格式) |
| GO27 | 最新解禁数量(万股) |
| GO28 | 下一报告期的预约披露时间 |
| GO29 | 最新持股机构家数 |
| GO30 | 最新机构持股总量(万股) |
| GO31 | 最新持股基金家数 |
| GO32 | 最新基金持股量(万股) |
| GO33 | 最新总股本(万股) |
| GO34 | 最新实际流通A股(万股) |
业绩预告
| 字段 | 说明 |
|---|---|
| GO35 | 最新业绩预告 报告期 |
| GO36 | 最新业绩预告 本期归母净利润下限(万元) |
| GO37 | 最新业绩预告 本期归母净利润上限(万元) |
| GO38 | 最新业绩预告 本期归母净利润预计同比增减幅下限% |
| GO39 | 最新业绩预告 本期归母净利润预计同比增减幅上限% |
| GO40 | 最新业绩快报 报告期 |
| GO41 | 最新业绩快报 归母净利润(万元) |
分红募资
| 字段 | 说明 |
|---|---|
| GO42 | 分红募资 派现总额(万元) |
| GO43 | 分红募资 募资总额(万元) |
扣非业绩预告
| 字段 | 说明 |
|---|---|
| GO44 | 最新业绩预告 本期扣非净利润下限(万元) |
| GO45 | 最新业绩预告 本期扣非净利润上限(万元) |
| GO46 | 最新业绩预告 本期扣非净利润预计同比增减幅下限% |
| GO47 | 最新业绩预告 本期扣非净利润预计同比增减幅上限% |
---
四、板块与股票列表接口
4.1 获取系统分类股票列表 get_stock_list
tq.get_stock_list(
market = None,
list_type: int = 0
) -> List获取指定市场/分类的股票列表。
list_type:0=只返回代码,1=返回代码和名称([{'Code':..., 'Name':...}, ...])
market 参数完整说明:
默认为全部A股(market='5')
0:自选股 1:持仓股
5:所有A股 6:上证指数成份股 7:上证主板 8:深证主板 9:重点指数
10:所有板块指数 11:缺省行业板块 12:概念板块 13:风格板块 14:地区板块
15:缺省行业分类+概念板块 16:研究行业一级 17:研究行业二级 18:研究行业三级
21:含H股 22:含可转债 23:沪深300 24:中证500 25:中证1000
26:国证2000 27:中证2000 28:中证A500
30:REITs 31:ETF基金 32:可转债 33:LOF基金 34:所有可交易基金
35:所有沪深基金 36:T+0基金
49:金融类企业 50:沪深A股 51:创业板 52:科创板 53:北交所
91:ETF追踪的指数
92:国内期货主力合约
101:国内期货 102:港股 103:美股使用示例:
# 获取所有A股代码
all_stocks = tq.get_stock_list(market='5')
# 获取ETF基金(含代码和名称)
etf_list = tq.get_stock_list(market='31', list_type=1)
# 获取国内期货主力合约
futures_main = tq.get_stock_list(market='92')---
4.2 获取板块列表 get_sector_list
tq.get_sector_list(list_type: int = 0) -> List获取 A 股全部板块代码列表(相当于 get_stock_list('10'))。
---
4.3 获取板块内股票列表 get_stock_list_in_sector
tq.get_stock_list_in_sector(
block_code: str,
block_type: int = 0,
list_type: int = 0
) -> List参数说明:
block_code:板块代码或板块名称,如'BK0707'或'通达信88'block_type:0:板块指数代码或板块名称(默认)1:自定义板块简称(加BKCODE.前缀);特殊板块:ZXG=自选股,TJG=临时条件股2:期货板块代码(加QH.前缀)list_type:0=只返回代码
---
4.4 获取用户自选股板块列表 get_user_sector
tq.get_user_sector() -> List获取通达信客户端中用户设置的自选股板块列表。
---
4.5 自定义板块管理
创建板块 create_sector
tq.create_sector(block_code: str = '', block_name: str = '')block_code:板块简称(不能为空)block_name:板块显示名称(不能为空)
删除板块 delete_sector
tq.delete_sector(block_code: str = '')重命名板块 rename_sector
tq.rename_sector(block_code: str = '', block_name: str = '')清空板块 clear_sector
tq.clear_sector(block_code: str = '')清空板块内所有成分股(不删除板块本身)。
---
五、行情订阅接口
5.1 刷新行情缓存 refresh_cache
tq.refresh_cache(
market: str = 'AG',
force: bool = False
)刷新快照行情和K线缓存。首次调用 get_market_snapshot 或 get_market_data 时系统会自动刷新,无需手动调用。
market 参数:
| 值 | 说明 |
|---|---|
'AG' | A股(默认) |
'HK' | 港股 |
'US' | 美股 |
'QH' | 国内期货 |
'QQ' | 股票期权 |
'NQ' | 新三板 |
'ZZ' | 中证指数 |
'ZS' | 综合指数 |
'OF' | 开放式基金 |
force:False=距上次刷新不足10分钟则跳过;True=强制刷新
---
5.2 刷新历史K线缓存 refresh_kline
tq.refresh_kline(
stock_list: List[str] = [],
period: str = ''
)参数说明:
period:仅支持'1m'、'5m'、'1d'三种- 不建议一次更新太多,会堵塞策略和客户端
---
5.3 订阅行情更新 subscribe_hq
tq.subscribe_hq(
stock_list: List[str] = [],
callback = None
) -> object订阅指定股票的实时行情更新,有行情变化时自动触发回调函数。最多订阅 100 只。
回调参数格式:
def on_data(datas):
import json
d = json.loads(datas)
# d 格式:{"Code": "000001.SZ", "ErrorId": "0"}
code = d.get('Code')
error_id = d.get('ErrorId')大量股票推荐分批订阅(每批50只):
BATCH_SIZE = 50
for i in range(0, len(stocks), BATCH_SIZE):
batch = stocks[i:i+BATCH_SIZE]
tq.subscribe_hq(stock_list=batch, callback=my_callback)---
5.4 取消订阅 unsubscribe_hq
tq.unsubscribe_hq(stock_list: List[str] = [])---
5.5 获取已订阅股票列表 get_subscribe_hq_stock_list
tq.get_subscribe_hq_stock_list() -> List---
六、下载文件接口
download_file
tq.download_file(
stock_code: str = '',
down_time: str = '',
down_type: int = 1
)下载通达信特定文件数据(十大股东、ETF申赎数据、舆情、综合信息等)。 文件保存至 ./PYPlugins/data 目录。
down_type:1=十大股东,2=ETF申赎,3=舆情,4=综合信息
---
七、与客户端交互接口
7.1 发送消息到客户端 send_message
tq.send_message(msg_str: str) -> Dict将字符串消息发送到通达信客户端 TQ 策略管理界面显示。用 | 分行。
tq.send_message("MSG,策略运行中|买入信号数:3")---
7.2 发送文件路径到客户端 send_file
tq.send_file(file_path: str) -> Dict发送 txt/pdf/html 文件到通达信客户端展示。文件须放在 ./PYPlugins/file/ 目录。
tq.send_file("513100.txt") # 发送txt文件
tq.send_file("report.pdf") # 发送PDF文件---
7.3 发送预警信号 send_warn
tq.send_warn(
stock_list: List[str] = [],
time_list: List[str] = [],
price_list: List[str] = [],
close_list: List[str] = [],
volum_list: List[str] = [],
bs_flag_list: List[str] = [],
warn_type_list: List[str] = [],
reason_list: List[str] = [],
count: int = 1
) -> Dict发送预警信号到通达信客户端 TQ 策略信号界面。
参数说明:
| 参数 | 必填 | 说明 |
|---|---|---|
| stock_list | Y | 股票代码列表 |
| time_list | N | 时间列表(YYYYMMDDHHMMSS);缺少时补当前时间 |
| price_list | Y | 价格列表(纯数字字符串) |
| close_list | Y | 收盘/昨收价列表(纯数字字符串) |
| volum_list | Y | 成交量列表(纯数字字符串) |
| bs_flag_list | N | 买卖标志:'0'=买(红色B),'1'=卖(绿色S),'2'=未知(黄色);缺少时补 '2' |
| warn_type_list | N | 预警类型:'1' 支持双击闪电买卖;缺少时补 '-1' |
| reason_list | N | 预警原因(有效长度25个汉字);缺少时补空字符串 |
| count | Y | 信号数量,必须 > 0 |
注意: price_list、close_list、volum_list 中的元素必须为纯数字字符串;bs_flag_list 可以传空字符串 ''(等同于 '2')。
# 双击预警信号可直接打开闪电买卖界面
tq.send_warn(
stock_list=['600519.SH'],
time_list=['20260101100000'],
price_list=['1823.45'],
close_list=['1822.50'],
volum_list=['15000'],
bs_flag_list=['0'], # 买入标记
warn_type_list=['1'], # 支持双击闪电买卖
reason_list=['MA金叉信号'],
count=1
)---
7.4 发送回测数据 send_bt_data
tq.send_bt_data(
stock_code: str = '',
time_list: List[str] = [],
data_list: List[List[str]] = [],
count: int = 1
) -> Dict输出回测数据到通达信客户端显示,配合 SIGNALS_TQ 公式在K线图上展示。
参数说明:
time_list:时间列表(YYYYMMDDHHMMSS或YYYYMMDD);长度必须 ≥countdata_list:二维列表,每个子列表对应一个时间点,最多取前16个值(均为纯数字字符串)count:数据条数,必须 > 0
data_list 子列表位置与 SIGNALS_TQ ID 对应关系:
- 位置1(index 0)→
SIGNALS_TQ(1, TYPE) - 位置2(index 1)→
SIGNALS_TQ(2, TYPE) - ...以此类推,最多16个
# 发送MA5、MA10和买卖信号
tq.send_bt_data(
stock_code='688318.SH',
time_list=['20260120', '20260121'],
data_list=[
['136.60', '131.74', '1', '0'], # MA5, MA10, 买信号, 卖信号
['135.30', '131.48', '0', '1']
],
count=2
)---
7.5 发送股票到自定义板块 send_user_block
tq.send_user_block(
block_code: str = '',
stocks: List[str] = [],
show: bool = False
) -> Dictblock_code:目标板块简称;为空字符串时发送到"临时条件股"板块stocks:股票代码列表;传入空列表 `[]` = 清空板块show:是否在客户端自动跳转显示该板块
# 发送选股结果到临时条件股
tq.send_user_block(block_code='', stocks=result_list)
# 发送到自定义板块并显示
tq.send_user_block(block_code='MYBLOCK', stocks=result_list, show=True)---
7.6 调用客户端功能 exec_to_tdx
tq.exec_to_tdx(url: str = '') -> Dict让通达信客户端根据传入的 URL 或功能串执行指定操作。
参数说明:
url:功能调用串或网址;若是功能串,请以http://www.treeid开头
返回字段:
| 字段 | 说明 |
|---|---|
| ErrorId | 错误码,'0' 表示成功 |
| Msg | 返回信息(内容为传入的 url) |
| run_id | 执行 ID |
from tqcenter import tq
tq.initialize(__file__)
# 调用功能串(跳转到国内期货主界面)
exec_res1 = tq.exec_to_tdx(url='http://www.treeid/MAINQH')
# 打开网页链接(弹出浏览器窗口)
exec_res2 = tq.exec_to_tdx(url='http://www.treeid/dlghttp://www.tdx.com.cn')
print(exec_res2)
# {'ErrorId': '0', 'Msg': 'http://www.treeid/dlghttp://www.tdx.com.cn', 'run_id': '1'}---
7.7 导出数据到通达信界面 print_to_tdx
tq.print_to_tdx(
df_list,
sp_name="",
xml_filename="",
jsn_filenames=None,
vertical=None,
horizontal=None,
height=None,
table_names=None
)将多组 DataFrame 数据导出到通达信客户端 TQ 策略数据浏览中展示。
参数说明:
| 参数 | 说明 |
|---|---|
| df_list | DataFrame 列表;第一列必须是日期,后续列是指标名 |
| sp_name | 因子名称,用于生成 .sp 文件名 |
| xml_filename | 生成的 XML 文件名(含 .xml 后缀) |
| jsn_filenames | JSON 文件名列表,长度必须等于 df_list 长度 |
| vertical | 纵向排列的 table 组数,与 horizontal 二选一 |
| horizontal | 横向排列的 table 组数(优先级更高) |
| height | 各 gridctrl 高度列表(如 ["0.4", "0.6"]),不传则自动平均分配 |
| table_names | 各组表格标题列表 |
---
八、交易日历接口
8.1 获取交易日列表 get_trading_dates
tq.get_trading_dates(
market: str,
start_time: str,
end_time: str,
count: int = -1
) -> List获取指定市场在时间范围内的纯交易日列表。需要先在客户端下载上证指数盘后数据。
market:如'SH'、'SZ'、'HK'等count:返回数量限制,-1返回全部
---
九、通达信公式接口
9.1 格式化K线数据 formula_format_data
tq.formula_format_data(data_dict: Dict = {}) -> Dict将 get_market_data 获取的K线数据格式化为通达信公式接口可识别的格式。
输入要求: data_dict 必须包含 Amount、Volume、Close、Open、High、Low 六个字段。
返回值: Dict,键为股票代码,值为 List[Dict],每个 Dict 包含 Date、Amount、Volume、Close、Open、High、Low。
---
9.2 向公式设置数据 formula_set_data
tq.formula_set_data(
stock_code: str = '',
stock_period: str = '1d',
stock_data: List = [],
count: int = 1,
dividend_type: int = 0
)在调用公式前设置公式所需的K线数据(须先用 formula_format_data 格式化)。
stock_data:formula_format_data格式化后的数据count:生效的K线条数,1 ≤ count ≤ 24000,且len(stock_data) ≥ countdividend_type:0=不复权,1=前复权,2=后复权
注意: 后设置的数据会覆盖前一次设置;与 formula_set_data_info 互相覆盖。
---
9.3 向公式设置数据信息 formula_set_data_info
tq.formula_set_data_info(
stock_code: str = '',
stock_period: str = '1d',
start_time: str = '',
end_time: str = '',
count: int = 0,
dividend_type: int = 0
)count 参数:
>0:按条数(最多24000条)=0:按 start_time/end_time 区间=-1:获取全部数据=-2:使用无序列数据(count=-2时为无序列数据)
---
9.4 调用通达信公式(单次,需提前设置数据)
调用指标公式 formula_zb
tq.formula_zb(
formula_name: str = '',
formula_arg: str = '',
xsflag: int = -1
) -> Dict返回: {'Data': {'DIF': [...], 'DEA': [...], ...}, 'ErrorId': '0'}
调用选股公式 formula_xg
tq.formula_xg(
formula_name: str = '',
formula_arg: str = ''
) -> Dict返回: {'Data': {'UP3': ['0', '1', ...], ...}, 'ErrorId': '0'}
调用表达式公式 formula_exp
tq.formula_exp(
formula_name: str = '',
formula_arg: str = ''
) -> Dict参数说明:
formula_name:公式名称(区分大小写)formula_arg:逗号分隔的数字字符串,最多16个参数,如'12,26,9'xsflag:精度控制,-1返回默认精度,最大可返回8位小数
调用前必须先设置数据(`formula_set_data` 或 `formula_set_data_info`)。
---
9.5 获取公式数据 formula_get_data
tq.formula_get_data() -> Dict在调用公式后,获取当前设置的公式数据结果。
---
9.6 批量调用选股公式 formula_process_mul_xg ⭐推荐
tq.formula_process_mul_xg(
formula_name: str = '',
formula_arg: str = '',
return_count: int = 1,
return_date: bool = False,
stock_list: List[str] = [],
stock_period: str = '1d',
start_time: str = '',
end_time: str = '',
count: int = 0,
dividend_type: int = 0
) -> Dict对多只股票批量调用通达信选股公式,无需提前设置数据,效率更高。
返回值格式(`return_date=False` 时):
{'000001.SZ': {'UP3': ['0', '1', '0']},
'600519.SH': {'UP3': ['1', '1', '0']},
'ErrorId': '0'}返回值格式(`return_date=True` 时):
{'000001.SZ': {'UP3': [{'Date': '20260203', 'Value': '0'}, ...]},
'ErrorId': '0'}重要:
- 批量调用无需
formula_set_data,且formula_set_data的设置对批量调用不生效 count太小会导致结果比客户端条件选股少(需覆盖公式最大回溯K线数)
---
9.7 批量调用指标公式 formula_process_mul_zb
tq.formula_process_mul_zb(
formula_name: str = '',
formula_arg: str = '',
xsflag: int = -1,
return_count: int = 1,
return_date: bool = False,
stock_list: List[str] = [],
stock_period: str = '1d',
start_time: str = '',
end_time: str = '',
count: int = 0,
dividend_type: int = 0
) -> Dict对多只股票批量调用通达信指标公式,参数含义同 formula_process_mul_xg,额外支持 xsflag 精度控制。
返回值格式(`return_date=True` 时):
{'000001.SZ': {'DIF': [{'Date': '20260203', 'Value': '0.12'}, ...],
'DEA': [...]},
'ErrorId': '0'}---
十、交易接口
注意: 交易接口需要先在通达信客户端登录交易账号。
10.1 获取资金账户句柄 stock_account
tq.stock_account(
account: str = '',
account_type: str = 'stock'
) -> intaccount:资金账号(字符串)account_type:账号类型,如'STOCK'- 返回值 ≥ 0 为有效句柄,< 0 为无效句柄
from tqcenter import tq
tq.initialize(__file__)
account_id = tq.stock_account(account="1190008847", account_type="STOCK")
print(account_id) # 0---
10.2 查询委托信息 query_stock_orders
tq.query_stock_orders(
account_id: int = -1,
stock_code: str = '',
cancelable_only: bool = False
) -> List[Dict]account_id < 0时查询当前账户- 仅能查询当日委托
cancelable_only:是否仅查可撤委托(暂未生效)
返回字段:
| 字段 | 说明 |
|---|---|
| Wtbh | 委托编号 |
| Code | 股票代码 |
| Time | 时间(HHMMSS) |
| BSFlag | 买卖标志:0=买,1=卖,-1=撤单 |
| KPFlag | 开平标志:0=开仓,1=平仓,2=平今 |
| WTFS | 市价方式 |
| Status | 委托状态:0=无效单,1=未成交,2=部分成交,3=全部成交,4=部分成交部分撤单,5=全部撤单 |
| WtDate | 撤单标志:1=已撤,2=夜盘单 |
| WtPrice | 委托价 |
| CjPrice | 成交价 |
| CjVol | 成交数量(撤单时为负值) |
| WtVol | 委托数量(撤单时为负值) |
数据样本:
[
{'Wtbh': '48957', 'Code': '688318.SH', 'Time': '93605', 'BSFlag': -1, 'KPFlag': 0,
'WTFS': 0, 'Status': 0, 'WtPrice': '125.000', 'CjPrice': '0.000', 'CjVol': '0', 'WtVol': '1000'},
{'Wtbh': '58545', 'Code': '688318.SH', 'Time': '93853', 'BSFlag': -1, 'KPFlag': 0,
'WTFS': 0, 'Status': 0, 'WtPrice': '125.000', 'CjPrice': '0.000', 'CjVol': '0', 'WtVol': '1000'}
]---
10.3 查询持仓信息 query_stock_positions
tq.query_stock_positions(account_id: int = -1) -> List[Dict]返回字段:
| 字段 | 说明 |
|---|---|
| Code | 股票代码 |
| Cbj | 成本价 |
| TotalVol | 总持仓 |
| CanUseVol | 可用持仓 |
数据样本:
[{'Code': '000001.SZ', 'Cbj': '10.693', 'TotalVol': '100', 'CanUseVol': '100'},
{'Code': '688318.SH', 'Cbj': '117.425', 'TotalVol': '4000', 'CanUseVol': '4000'}]---
10.4 下单 order_stock
tq.order_stock(
account_id: int = -1,
stock_code: str = '',
order_type: int = 0,
order_volume: int = 0,
price_type: int = 0,
price: float = 0.0
)account_id < 0时以当前账户下单order_type支持:STOCK_BUY(0)买入、STOCK_SELL(1)卖出、CREDIT_BUY(0)担保品买入、CREDIT_SELL(1)担保品卖出、CREDIT_FIN_BUY(69)融资买入、CREDIT_SLO_SELL(70)融券卖出- 若
price_type为市价类型,具体市价规则请在客户端→系统设置→参数中配置
返回字段:
| 字段 | 说明 |
|---|---|
| Value | 成功标志:0=失败,1=待用户确认,2=成功 |
| Wtbh | 委托编号(仅成功时返回) |
| Msg | 返回提示信息 |
注意: 实盘交易账户下单后需用户在客户端确认(Value=1)。自动下单需联系开户券商开通支持TQ的版本。
from tqcenter import tq, tqconst
tq.initialize(__file__)
account_id = tq.stock_account(account="1190008847", account_type="STOCK")
# 以自填价160.0买入688318.SH 200股
result = tq.order_stock(
account_id=account_id,
stock_code="688318.SH",
order_type=tqconst.STOCK_BUY,
order_volume=200,
price_type=tqconst.PRICE_MY,
price=160.0
)
print(result) # {'ErrorId': '0', 'Msg': '已发送信号至客户端,待用户确认!', 'Value': 1}---
10.5 撤单 cancel_order_stock
tq.cancel_order_stock(
account_id: int = -1,
stock_code: str = '',
order_id: str = ''
) -> Dict根据委托编号撤单。
参数说明:
account_id:资金账户句柄(由stock_account获取,<0时使用当前账户)stock_code:股票代码order_id:委托编号(由query_stock_orders返回的Wtbh字段)
返回字段:
| 字段 | 说明 |
|---|---|
| Value | 成功标志:0=失败,1=成功 |
| Msg | 返回提示信息 |
from tqcenter import tq
tq.initialize(__file__)
account_id = tq.stock_account(account="1190008847", account_type="STOCK")
orders = tq.query_stock_orders(account_id=account_id, stock_code="")
cancel_res = tq.cancel_order_stock(
account_id=account_id,
stock_code=orders[0]['Code'],
order_id=orders[0]['Wtbh']
)
print(cancel_res) # {'Value': 1, 'ErrorId': '0', 'Msg': '提交撤单成功!'}---
10.6 查询账户资产 query_stock_asset
tq.query_stock_asset(account_id: int = -1) -> Dict查询指定账户的总资产、余额和持仓市值。
返回字段:
| 字段 | 说明 |
|---|---|
| Currency | 币种 |
| Balance | 余额 |
| Cash | 可用余额 |
| Asset | 总资产 |
| MarketValue | 总持仓市值 |
数据样本:
{'Currency': '人民币', 'Balance': '30234.070', 'Cash': '30234.070',
'Asset': '1233041.070', 'MarketValue': '1201690.000', 'ErrorId': '0'}---
十一、辅助工具
tq.price_df
tq.price_df(
df: dict,
price_col: str,
column_names=None
) -> pd.DataFrame从 get_market_data 返回的 dict 中提取指定价格字段,自动处理日期索引、缺失值填充。
df_real = tq.get_market_data(field_list=['Close','Open'], stock_list=codes, ...)
close_df = tq.price_df(df_real, 'Close', column_names=codes)---
十二、SIGNALS_TQ 公式系统
通过 send_bt_data 发送序列数据后,可在通达信公式管理器中创建技术指标公式,使用 SIGNALS_TQ(ID, TYPE) 函数引用数据并在K线图上展示。
函数语法
SIGNALS_TQ(ID, TYPE)| 参数 | 说明 |
|---|---|
| ID | data_list 子列表中的位置序号(1~16) |
| TYPE | 0=不平滑处理;1=平滑(无数据的周期返回上一周期的值);2=无数据则为0 |
通达信公式示例(TQMA510)
在通达信公式管理器中新建名为 TQMA510 的公式:
{技术指标}
MA5:SIGNALS_TQ(1,0); {引用ID=1的数据(MA5)}
MA10:SIGNALS_TQ(2,0); {引用ID=2的数据(MA10)}
{交易信号}
BUY_SIGNAL:=SIGNALS_TQ(3,0); {买入信号}
SELL_SIGNAL:=SIGNALS_TQ(4,0); {卖出信号}
{回测指标展示}
开仓次数:SIGNALS_TQ(5,0),COLORRED;
平仓次数:SIGNALS_TQ(6,0),COLORGREEN;
单位净值:SIGNALS_TQ(7,0),COLORWHITE;
基准净值:SIGNALS_TQ(8,0),COLORYELLOW;
胜率:SIGNALS_TQ(9,0),COLORMAGENTA;
年化收益率:SIGNALS_TQ(10,0),COLORCYAN;
基准年化收益率:SIGNALS_TQ(11,0),COLORLIBLUE;
贝塔值:SIGNALS_TQ(12,0),COLORBROWN;
最大回撤:SIGNALS_TQ(13,0),COLORGRAY;
夏普比率:SIGNALS_TQ(14,0),COLORLIMAGENTA;
每日资金:SIGNALS_TQ(15,0),COLORLIGRAY;
持仓量:SIGNALS_TQ(16,0),COLORLIRED;
{绘制交易信号图标}
DRAWICON(BUY_SIGNAL, LOW, 1);
DRAWICON(SELL_SIGNAL, HIGH, 2);tqcenter 使用示例与故障排除
使用示例
示例1:获取K线数据
import sys
sys.path.insert(0, 'E:/App/new_tdx_test64/PYPlugins/user')
from tqcenter import tq
tq.initialize(__file__)
# 获取最近100条日线数据(前复权)
data = tq.get_market_data(
field_list=['Open', 'Close', 'High', 'Low', 'Volume', 'Amount'],
stock_list=['600000.SH', '000001.SZ'],
period='1d',
count=100,
dividend_type='front'
)
close_df = data['Close'] # DataFrame,行=时间,列=股票代码
print(close_df.tail())
tq.close()---
示例2:获取实时行情快照
from tqcenter import tq
tq.initialize(__file__)
snapshot = tq.get_market_snapshot(stock_code='300505.SZ')
print(snapshot.get('Now')) # 当前价
print(snapshot.get('Volume')) # 成交量
print(snapshot.get('Buyp')) # 五档买价
tq.close()---
示例3:MACD全市场批量选股(推荐方式)
from tqcenter import tq
tq.initialize(__file__)
# 获取所有A股
all_stocks = tq.get_stock_list(market='5')
# 批量调用MACD公式,返回最新2条数据
mul_zb_result = tq.formula_process_mul_zb(
formula_name='MACD',
formula_arg='12,26,9',
xsflag=6,
return_count=2,
return_date=False,
stock_list=all_stocks,
stock_period='1d',
count=100,
dividend_type=1
)
# 筛选金叉股票
macd_stocks = []
if mul_zb_result:
for key in mul_zb_result:
if key != "ErrorId":
dif = mul_zb_result[key].get('DIF', [])
dea = mul_zb_result[key].get('DEA', [])
if len(dif) >= 2 and len(dea) >= 2:
if float(dif[-2]) < float(dea[-2]) and float(dif[-1]) >= float(dea[-1]):
macd_stocks.append(key)
print(f"MACD金叉股票:{len(macd_stocks)}只")
# 发送到临时条件股
tq.send_user_block(block_code='', stocks=macd_stocks)
tq.close()---
示例4:连续N日上涨选股并加入自定义板块
import pandas as pd
import numpy as np
from datetime import datetime
from tqcenter import tq
tq.initialize(__file__)
batch_codes = tq.get_stock_list_in_sector('通达信88')
N = 3 # 连续上涨天数
block_code = 'LZXG'
block_name = '连涨选股'
df_real = tq.get_market_data(
field_list=['Close'],
stock_list=batch_codes,
start_time="20251025",
end_time=datetime.now().strftime("%Y%m%d"),
dividend_type='front',
period='1d',
fill_data=True
)
close_df = tq.price_df(df_real, 'Close', column_names=batch_codes)
# 计算连续上涨天数
is_up = close_df > close_df.shift(1)
up_mask = np.where(is_up, 1, np.nan)
up_mask_df = pd.DataFrame(up_mask, index=close_df.index, columns=close_df.columns)
filled_df = up_mask_df.ffill()
consec_up_days = filled_df.notna().cumsum()
reset_counts = consec_up_days.where(~is_up).ffill().fillna(0)
consec_up_days = (consec_up_days - reset_counts).astype(int)
# 筛选最新交易日连续上涨≥N天的股票
latest_date = consec_up_days.index[-1]
latest_consec_up = consec_up_days.loc[latest_date]
target_stocks_list = latest_consec_up[latest_consec_up >= N].sort_values(ascending=False).index.tolist()
# 创建板块并推送
tq.create_sector(block_code=block_code, block_name=block_name)
tq.send_user_block(block_code=block_code, stocks=target_stocks_list, show=True)
tq.send_message(f"MSG,连涨≥{N}天股票:{len(target_stocks_list)}只")
tq.close()---
示例5:订阅行情实时预警(分批订阅+防抖)
import json, time, signal, sys
from datetime import datetime
from collections import defaultdict
from tqcenter import tq
PRICE_RISE_THRESHOLD = 5.0 # 涨幅阈值
ANTI_SHAKE_SECONDS = 10 # 防抖间隔(秒)
BATCH_SIZE = 50 # 每批订阅数量
tq.initialize(__file__)
all_stocks = tq.get_stock_list_in_sector('通达信88')
last_warn_time = defaultdict(int)
TRIGGERED = set()
EXIT_FLAG = False
def signal_handler(signum, frame):
global EXIT_FLAG
EXIT_FLAG = True
tq.unsubscribe_hq(stock_list=all_stocks)
sys.exit(0)
signal.signal(signal.SIGINT, signal_handler)
def price_rise_callback(data_str):
code_json = json.loads(data_str)
code = code_json.get('Code')
if code_json.get('ErrorId') != "0" or not code or code in TRIGGERED:
return
snapshot = tq.get_market_snapshot(code)
if not snapshot:
return
now_price = float(snapshot.get('Now', 0))
last_close = float(snapshot.get('LastClose', 0))
if now_price <= 0 or last_close <= 0:
return
rise_rate = (now_price - last_close) / last_close * 100
current_time = int(time.time())
if rise_rate > PRICE_RISE_THRESHOLD and (current_time - last_warn_time[code]) >= ANTI_SHAKE_SECONDS:
TRIGGERED.add(code)
last_warn_time[code] = current_time
tq.unsubscribe_hq(stock_list=[code])
tq.send_warn(
stock_list=[code],
time_list=[datetime.now().strftime("%Y%m%d%H%M%S")],
price_list=[str(now_price)],
close_list=[str(last_close)],
volum_list=[snapshot.get('Volume', '0')],
bs_flag_list=['0'],
warn_type_list=['3'],
reason_list=[f'涨幅突破{PRICE_RISE_THRESHOLD}%'],
count=1
)
# 分批订阅
for i in range(0, len(all_stocks), BATCH_SIZE):
tq.subscribe_hq(stock_list=all_stocks[i:i+BATCH_SIZE], callback=price_rise_callback)
print(f"监控启动,共{len(all_stocks)}只,按Ctrl+C退出...")
while not EXIT_FLAG:
time.sleep(0.1)---
示例6:MA均线调仓信号+发送预警(可双击闪电买卖)
import vectorbt as vbt
import pandas as pd
from datetime import datetime, timedelta
from tqcenter import tq
tq.initialize(__file__)
N = 5 # 均线周期
batch_codes = tq.get_stock_list_in_sector('通达信88')
end_date = datetime.now().strftime("%Y%m%d")
start_date = (datetime.now() - timedelta(days=2 * N + 20)).strftime("%Y%m%d")
df_real = tq.get_market_data(
field_list=['Close'],
stock_list=batch_codes,
start_time=start_date,
end_time=end_date,
dividend_type='front',
period='1d',
fill_data=True
)
close_df = tq.price_df(df_real, 'Close', column_names=batch_codes)
ma = vbt.MA.run(close_df, window=N).ma
ma.columns = close_df.columns
entries = close_df.vbt.crossed_above(ma)
exits = close_df.vbt.crossed_below(ma)
latest_date = close_df.index[-1]
prev_date = close_df.index[-2] if len(close_df.index) >= 2 else latest_date
# 收集买卖信号
buy_signals, sell_signals = {}, {}
for code in batch_codes:
if code not in close_df.columns:
continue
today_close = round(close_df.loc[latest_date, code], 2)
prev_close = round(close_df.loc[prev_date, code], 2)
if entries.loc[latest_date, code]:
buy_signals[code] = {'today_close': today_close, 'prev_close': prev_close}
if exits.loc[latest_date, code]:
sell_signals[code] = {'today_close': today_close, 'prev_close': prev_close}
# 发送预警(warn_type='1' 支持双击闪电买卖)
all_signals = [(c, i, '买入') for c, i in buy_signals.items()] + \
[(c, i, '卖出') for c, i in sell_signals.items()]
if all_signals:
warn_time = datetime.now().strftime("%Y%m%d%H%M%S")
tq.send_warn(
stock_list=[s[0] for s in all_signals],
time_list=[warn_time] * len(all_signals),
price_list=[str(s[1]['today_close']) for s in all_signals],
close_list=[str(s[1]['prev_close']) for s in all_signals],
volum_list=['0'] * len(all_signals),
bs_flag_list=['0' if s[2] == '买入' else '1' for s in all_signals],
warn_type_list=['1'] * len(all_signals), # 支持双击闪电买卖
reason_list=[f"{s[2]}信号" for s in all_signals],
count=len(all_signals)
)
tq.close()---
示例7:vectorbt 简单回测
import pandas as pd
import vectorbt as vbt
from tqcenter import tq
tq.initialize(__file__)
pd.set_option('future.no_silent_downcasting', True)
stock_code_list = ['688318.SH']
window = 5
target_start = '20250701'
target_end = '20251231'
start_time = (pd.to_datetime(target_start) - pd.Timedelta(days=window + 10)).strftime('%Y%m%d')
df_real = tq.get_market_data(
field_list=['Close', 'Open'],
stock_list=stock_code_list,
start_time=start_time,
end_time=target_end,
dividend_type='front',
period='1d',
fill_data=True
)
close_df = tq.price_df(df_real, 'Close', column_names=stock_code_list)
open_df = tq.price_df(df_real, 'Open', column_names=stock_code_list)
ma = vbt.MA.run(close_df, window=window).ma.ffill()
ma.columns = close_df.columns
entries_df = close_df.vbt.crossed_above(ma).shift(1).fillna(False).astype(bool)
exits_df = close_df.vbt.crossed_below(ma).shift(1).fillna(False).astype(bool)
portfolio = vbt.Portfolio.from_signals(
close=close_df,
entries=entries_df,
exits=exits_df,
price=open_df,
init_cash=100000,
fees=0.0003,
freq='D',
size_granularity=100 # A股最小交易单位100股
)
# 输出结果并绘图
print(portfolio.stats())
portfolio[stock_code_list[0]].plot().show()
tq.close()
# 注意:vectorbt 不支持分红送股等权益变动---
示例8:发送回测数据+通达信公式展示
from tqcenter import tq
import pandas as pd
tq.initialize(__file__)
stock_code = '688318.SH'
data = tq.get_market_data(
field_list=['Close'],
stock_list=[stock_code],
period='1d',
count=60,
dividend_type='front'
)
close_series = data['Close'][stock_code]
ma5 = close_series.rolling(5).mean()
ma10 = close_series.rolling(10).mean()
buy_signal = ((ma5.shift(1) <= ma10.shift(1)) & (ma5 > ma10)).astype(int)
sell_signal = ((ma5.shift(1) >= ma10.shift(1)) & (ma5 < ma10)).astype(int)
time_list = close_series.index.strftime('%Y%m%d').tolist()
data_list = []
for i in range(len(close_series)):
data_list.append([
f"{ma5.iloc[i]:.2f}" if not pd.isna(ma5.iloc[i]) else "0",
f"{ma10.iloc[i]:.2f}" if not pd.isna(ma10.iloc[i]) else "0",
str(int(buy_signal.iloc[i])),
str(int(sell_signal.iloc[i]))
])
tq.send_bt_data(
stock_code=stock_code,
time_list=time_list,
data_list=data_list,
count=len(time_list)
)
# 在通达信公式管理器中用 SIGNALS_TQ(1,0)~SIGNALS_TQ(4,0) 引用上述数据
tq.close()---
示例9:交易接口完整流程
from tqcenter import tq, tqconst
tq.initialize(__file__)
# 获取账户句柄(须先在客户端登录)
account_id = tq.stock_account(account="1190008847", account_type="STOCK")
print(f"账户句柄: {account_id}") # ≥0 有效
# 查询持仓
positions = tq.query_stock_positions(account_id=account_id)
for pos in positions:
print(f"{pos['Code']}: 成本价={pos['Cbj']}, 总持仓={pos['TotalVol']}")
# 查询委托
orders = tq.query_stock_orders(account_id=account_id, stock_code="")
print(f"当日委托: {orders}")
# 下单(自填价买入)
result = tq.order_stock(
account_id=account_id,
stock_code="688318.SH",
order_type=tqconst.STOCK_BUY,
order_volume=100,
price_type=tqconst.PRICE_MY,
price=130.0
)
print(result) # {'ErrorId': '0', 'Msg': '已发送信号至客户端,待用户确认!', 'Value': 1}
tq.close()---
故障排除
"TQ数据接口初始化失败或已有同名策略运行"
1. 确保通达信客户端已运行并登录 2. 使用 sys.path.insert(0, ...) 而非 sys.path.append() 3. 确认 PYPlugins/ 目录下存在 TPyth.dll 和 TPythClient.dll 4. 检查是否已有相同 __file__ 路径的策略在运行(ErrorId='12')
菜单一直显示"正在开启TQ策略..."
检查是否有防火墙弹窗,若有请允许访问。
获取数据时指标值前面是 None
count 参数设置的K线数量不足以覆盖公式计算中的最大参数值。例如 MA(C,20) 需要至少20根K线,若 count=10 则前10根K线的MA值为 None。
send_warn 报 ValueError
- 确认
count > 0 - 确认
stock_list、price_list、close_list、volum_list的长度均 ≥count - 确认
price_list、close_list、volum_list中的元素均为纯数字字符串
批量公式选股结果比客户端少
count 参数设置太小,不够覆盖公式计算所需的最大回溯K线数,适当增大 count 值。
Module Not Found 错误
- 确认
PYPlugins/user路径正确 - 使用绝对路径而非相对路径
- 使用
sys.path.insert(0, ...)保证优先加载
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
TdxQuant 公共初始化模块
- 自动检测通达信安装目录(注册表 / TdxW.exe 进程)
- 将 PYPlugins/user 添加到 sys.path
- 初始化 tq 连接
"""
import json
import os
import subprocess
import sys
def find_tdx_root():
"""查找通达信安装目录"""
def is_vaild_root_path(install_path: str | None):
if install_path is None: return False
tqcenter_path = os.path.join(install_path, "PYPlugins", "user", "tqcenter.py")
return os.path.isfile(tqcenter_path)
# 环境变量读取,优先级最高
install_path = os.getenv('TDX_ROOT')
if is_vaild_root_path(install_path): return install_path
# 方法1: 从注册表读取
try:
import winreg
key_path = r"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\通达信金融终端64"
with winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, key_path) as key:
install_path, _ = winreg.QueryValueEx(key, "InstallLocation")
if is_vaild_root_path(install_path): return install_path
except Exception:
pass
# 方法2: 从 TdxW.exe 进程路径获取
try:
result = subprocess.run(
["wmic", "process", "where", "name='TdxW.exe'", "get", "ExecutablePath", "/value"],
capture_output=True, text=True, timeout=5
)
for line in result.stdout.strip().split("\n"):
line = line.strip()
if line.startswith("ExecutablePath="):
exe_path = line.split("=", 1)[1].strip()
install_path = os.path.dirname(exe_path)
if is_vaild_root_path(install_path): return install_path
except Exception:
pass
return None
def init_tq():
"""初始化 tq 连接,返回 tq 对象"""
tdx_root = find_tdx_root()
if not tdx_root:
print(json.dumps({
"status": "error",
"message": "未找到通达信安装目录。请确保:1) 已安装通达信金融终端(支持TQ策略版);2) 通达信客户端正在运行"
}, ensure_ascii=False))
sys.exit(1)
user_path = os.path.join(tdx_root, "PYPlugins", "user")
if user_path not in sys.path:
sys.path.insert(0, user_path)
try:
from tqcenter import tq
except ImportError:
print(json.dumps({
"status": "error",
"message": f"无法导入 tqcenter 模块。请检查 {user_path} 下是否存在 tqcenter.py"
}, ensure_ascii=False))
sys.exit(1)
tq.initialize(os.path.abspath(__file__))
return tq
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
交易日历获取脚本
"""
import argparse
import json
import sys
import os
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from _tdx_init import init_tq
def main():
parser = argparse.ArgumentParser(description="获取交易日列表")
parser.add_argument("--start", default="", help="起始日期 YYYYMMDD")
parser.add_argument("--end", default="", help="结束日期 YYYYMMDD")
parser.add_argument("--count", type=int, default=-1,
help="返回最近N个交易日(count>0时从end往前取)")
args = parser.parse_args()
tq = init_tq()
try:
data = tq.get_trading_dates(
market="sh",
start_time=args.start or "",
end_time=args.end or "",
count=args.count
)
result = {
"status": "success",
"data_type": "trading_dates",
"start": args.start,
"end": args.end,
"count": len(data) if data else 0,
"data": data if data else []
}
print(json.dumps(result, ensure_ascii=False, indent=2, default=str))
except Exception as e:
print(json.dumps({
"status": "error", "message": str(e), "error_type": type(e).__name__
}, ensure_ascii=False))
sys.exit(1)
if __name__ == "__main__":
main()
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
ETF/可转债/新股数据获取脚本
支持:可转债信息(kzz_info)、跟踪指数的ETF信息(trackzs_etf)、新股申购(ipo_info)
"""
import argparse
import json
import sys
import os
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from _tdx_init import init_tq
def cmd_kzz_info(tq, args):
"""获取可转债信息"""
result = {"status": "success", "data_type": "kzz_info", "code": args.code}
fields = args.fields.split(",") if args.fields else []
data = tq.get_kzz_info(stock_code=args.code, field_list=fields)
if data:
result["data"] = data
else:
result["status"] = "error"
result["message"] = f"未获取到可转债 {args.code} 的信息"
return result
def cmd_trackzs_etf(tq, args):
"""获取跟踪指数的ETF信息"""
result = {"status": "success", "data_type": "trackzs_etf", "zs_code": args.zs_code}
data = tq.get_trackzs_etf_info(zs_code=args.zs_code)
if data:
result["data"] = data
else:
result["data"] = []
return result
def cmd_ipo_info(tq, args):
"""获取新股申购信息"""
result = {"status": "success", "data_type": "ipo_info"}
data = tq.get_ipo_info(ipo_type=args.ipo_type, ipo_date=args.ipo_date)
if data:
result["data"] = data
else:
result["data"] = []
return result
def main():
parser = argparse.ArgumentParser(description="通达信ETF/可转债/新股数据获取")
sub = parser.add_subparsers(dest="command", required=True)
# kzz_info
p = sub.add_parser("kzz_info", help="获取可转债信息")
p.add_argument("--code", required=True, help="可转债代码,如 123039.SZ")
p.add_argument("--fields", default="", help="字段列表,逗号分隔")
# trackzs_etf
p = sub.add_parser("trackzs_etf", help="获取跟踪指数的ETF信息")
p.add_argument("--zs_code", required=True, help="指数代码,如 950162.CSI")
# ipo_info
p = sub.add_parser("ipo_info", help="获取新股/新发债申购信息")
p.add_argument("--ipo_type", type=int, default=2,
help="0=新股, 1=新发债, 2=新股和新发债(默认)")
p.add_argument("--ipo_date", type=int, default=1,
help="0=只获取今天, 1=获取今天及以后(默认)")
args = parser.parse_args()
tq = init_tq()
handlers = {
"kzz_info": cmd_kzz_info,
"trackzs_etf": cmd_trackzs_etf,
"ipo_info": cmd_ipo_info,
}
try:
result = handlers[args.command](tq, args)
print(json.dumps(result, ensure_ascii=False, indent=2, default=str))
except Exception as e:
print(json.dumps({
"status": "error", "message": str(e), "error_type": type(e).__name__
}, ensure_ascii=False))
sys.exit(1)
if __name__ == "__main__":
main()
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
财务数据获取脚本
支持:专业财务数据(financial)、指定日期财务(financial_by_date)、单个财务指标(gp_one_data)
"""
import argparse
import json
import sys
import os
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from _tdx_init import init_tq
def cmd_financial(tq, args):
"""获取指定时间段的专业财务数据"""
result = {"status": "success", "data_type": "financial", "code": args.code}
fields = args.fields.split(",") if args.fields else ["fn193", "fn194", "fn197"]
report_type_map = {"announce": "announce_time", "tag": "tag_time"}
report_type = report_type_map.get(args.report_type, "announce_time")
data = tq.get_financial_data(
stock_list=[args.code],
field_list=fields,
start_time=args.start or "",
end_time=args.end or "",
report_type=report_type
)
if data and args.code in data:
import pandas as pd
df = data[args.code]
if hasattr(df, "to_dict"):
result["data"] = df.to_dict(orient="records")
else:
result["data"] = str(df)
else:
result["data"] = {}
return result
def cmd_financial_by_date(tq, args):
"""获取指定日期的专业财务数据"""
result = {"status": "success", "data_type": "financial_by_date", "code": args.code}
fields = args.fields.split(",") if args.fields else ["fn193", "fn197"]
data = tq.get_financial_data_by_date(
stock_list=[args.code],
field_list=fields,
year=args.year,
mmdd=args.mmdd
)
if data and args.code in data:
result["data"] = data[args.code]
else:
result["data"] = {}
return result
def cmd_gp_one_data(tq, args):
"""获取股票的单个财务数据"""
result = {"status": "success", "data_type": "gp_one_data", "code": args.code}
fields = args.fields.split(",") if args.fields else ["go1", "go3", "go5"]
data = tq.get_gp_one_data(
stock_list=[args.code],
field_list=fields
)
if data and args.code in data:
result["data"] = data[args.code]
else:
result["data"] = {}
return result
def main():
parser = argparse.ArgumentParser(description="通达信财务数据获取")
sub = parser.add_subparsers(dest="command", required=True)
# financial
p = sub.add_parser("financial", help="获取专业财务数据(时间段)")
p.add_argument("--code", required=True, help="证券代码,如 600519.SH")
p.add_argument("--fields", default="", help="字段列表,逗号分隔,如 fn193,fn194,fn197")
p.add_argument("--start", default="", help="起始日期 YYYYMMDD")
p.add_argument("--end", default="", help="结束日期 YYYYMMDD")
p.add_argument("--report_type", default="announce",
choices=["announce", "tag"],
help="筛选方式: announce-按公告日期, tag-按报告期")
# financial_by_date
p = sub.add_parser("financial_by_date", help="获取指定日期的专业财务数据")
p.add_argument("--code", required=True, help="证券代码,如 600519.SH")
p.add_argument("--fields", default="", help="字段列表,逗号分隔,如 fn193,fn197")
p.add_argument("--year", type=int, default=0, help="指定年份,0表示最新")
p.add_argument("--mmdd", type=int, default=0,
help="指定月日,0表示最新;小于300表示倒数第N期;331/630/930/1231表示季报")
# gp_one_data
p = sub.add_parser("gp_one_data", help="获取股票单个财务数据")
p.add_argument("--code", required=True, help="证券代码,如 600519.SH")
p.add_argument("--fields", default="", help="字段列表,逗号分隔,如 go1,go3,go5 (go=gp one首字母)")
args = parser.parse_args()
tq = init_tq()
handlers = {
"financial": cmd_financial,
"financial_by_date": cmd_financial_by_date,
"gp_one_data": cmd_gp_one_data,
}
try:
result = handlers[args.command](tq, args)
print(json.dumps(result, ensure_ascii=False, indent=2, default=str))
except Exception as e:
print(json.dumps({
"status": "error", "message": str(e), "error_type": type(e).__name__
}, ensure_ascii=False))
sys.exit(1)
if __name__ == "__main__":
main()
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
通达信公式执行脚本
支持:技术指标(zb)、条件选股(xg)、专家系统(exp)、批量选股(mul_xg)、批量指标(mul_zb)
"""
import argparse
import json
import sys
import os
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from _tdx_init import init_tq
def cmd_zb(tq, args):
"""调用技术指标公式"""
# 先设置公式数据
dividend_map = {"bfq": 0, "qfq": 1, "hfq": 2}
dividend_type = dividend_map.get(args.fq, 1)
set_res = tq.formula_set_data_info(
stock_code=args.code,
stock_period=args.period,
start_time=args.start or "",
end_time=args.end or "",
count=args.count,
dividend_type=dividend_type
)
if set_res and set_res.get("errorid", "-1") != "0":
return {"status": "error", "message": f"设置公式数据失败: {set_res}"}
data = tq.formula_zb(
formula_name=args.name,
formula_arg=args.arg,
xsflag=args.xsflag
)
return {"status": "success", "data_type": "formula_zb", "formula": args.name, "data": data}
def cmd_xg(tq, args):
"""调用条件选股公式"""
dividend_map = {"bfq": 0, "qfq": 1, "hfq": 2}
dividend_type = dividend_map.get(args.fq, 1)
set_res = tq.formula_set_data_info(
stock_code=args.code,
stock_period=args.period,
start_time=args.start or "",
end_time=args.end or "",
count=args.count,
dividend_type=dividend_type
)
if set_res and set_res.get("errorid", "-1") != "0":
return {"status": "error", "message": f"设置公式数据失败: {set_res}"}
data = tq.formula_xg(
formula_name=args.name,
formula_arg=args.arg
)
return {"status": "success", "data_type": "formula_xg", "formula": args.name, "data": data}
def cmd_exp(tq, args):
"""调用专家系统公式"""
dividend_map = {"bfq": 0, "qfq": 1, "hfq": 2}
dividend_type = dividend_map.get(args.fq, 1)
set_res = tq.formula_set_data_info(
stock_code=args.code,
stock_period=args.period,
start_time=args.start or "",
end_time=args.end or "",
count=args.count,
dividend_type=dividend_type
)
if set_res and set_res.get("errorid", "-1") != "0":
return {"status": "error", "message": f"设置公式数据失败: {set_res}"}
data = tq.formula_exp(
formula_name=args.name,
formula_arg=args.arg
)
return {"status": "success", "data_type": "formula_exp", "formula": args.name, "data": data}
def cmd_mul_xg(tq, args):
"""批量调用条件选股公式"""
stock_list = args.codes.split(",") if args.codes else []
dividend_map = {"bfq": 0, "qfq": 1, "hfq": 2}
dividend_type = dividend_map.get(args.fq, 1)
data = tq.formula_process_mul_xg(
formula_name=args.name,
formula_arg=args.arg,
return_count=args.return_count,
return_date=True,
stock_list=stock_list,
stock_period=args.period,
start_time=args.start or "",
end_time=args.end or "",
count=args.count,
dividend_type=dividend_type
)
return {"status": "success", "data_type": "formula_mul_xg", "formula": args.name, "data": data}
def cmd_mul_zb(tq, args):
"""批量调用技术指标公式"""
stock_list = args.codes.split(",") if args.codes else []
dividend_map = {"bfq": 0, "qfq": 1, "hfq": 2}
dividend_type = dividend_map.get(args.fq, 1)
data = tq.formula_process_mul_zb(
formula_name=args.name,
formula_arg=args.arg,
xsflag=args.xsflag,
return_count=args.return_count,
return_date=True,
stock_list=stock_list,
stock_period=args.period,
start_time=args.start or "",
end_time=args.end or "",
count=args.count,
dividend_type=dividend_type
)
return {"status": "success", "data_type": "formula_mul_zb", "formula": args.name, "data": data}
def main():
parser = argparse.ArgumentParser(description="通达信公式执行")
sub = parser.add_subparsers(dest="command", required=True)
# 通用参数
common = argparse.ArgumentParser(add_help=False)
common.add_argument("--name", required=True, help="公式名称,如 MACD, KDJ, UPN")
common.add_argument("--arg", default="", help="公式参数,逗号分隔,如 12,26,9")
common.add_argument("--code", default="", help="证券代码(zb/xg/exp时),如 688318.SH")
common.add_argument("--codes", default="", help="证券代码列表(mul时),逗号分隔")
common.add_argument("--period", default="1d",
choices=["1m", "5m", "15m", "30m", "1h", "1d", "1w", "1mon"],
help="K线周期,默认1d")
common.add_argument("--count", type=int, default=100, help="K线数量,默认100")
common.add_argument("--start", default="", help="起始日期 YYYYMMDD")
common.add_argument("--end", default="", help="结束日期 YYYYMMDD")
common.add_argument("--fq", default="qfq", choices=["qfq", "hfq", "bfq"],
help="复权类型: qfq-前复权(默认), hfq-后复权, bfq-不复权")
common.add_argument("--xsflag", type=int, default=-1, help="数据精度,-1为默认")
common.add_argument("--return_count", type=int, default=1, help="批量调用时每个返回值的返回数")
sub.add_parser("zb", parents=[common], help="调用技术指标公式")
sub.add_parser("xg", parents=[common], help="调用条件选股公式")
sub.add_parser("exp", parents=[common], help="调用专家系统公式")
sub.add_parser("mul_xg", parents=[common], help="批量调用条件选股公式")
sub.add_parser("mul_zb", parents=[common], help="批量调用技术指标公式")
args = parser.parse_args()
tq = init_tq()
handlers = {
"zb": cmd_zb,
"xg": cmd_xg,
"exp": cmd_exp,
"mul_xg": cmd_mul_xg,
"mul_zb": cmd_mul_zb,
}
try:
result = handlers[args.command](tq, args)
print(json.dumps(result, ensure_ascii=False, indent=2, default=str))
except Exception as e:
print(json.dumps({
"status": "error", "message": str(e), "error_type": type(e).__name__
}, ensure_ascii=False))
sys.exit(1)
if __name__ == "__main__":
main()
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
行情数据获取脚本
支持:行情快照(snapshot)、K线(kline)、证券基本信息(stock_info)、
更多信息(more_info)、分红配送(divid_factors)、股本数据(gb_info)
"""
import argparse
import json
import sys
import os
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from _tdx_init import init_tq
def cmd_snapshot(tq, args):
result = {"status": "success", "data_type": "snapshot", "code": args.code}
data = tq.get_market_snapshot(stock_code=args.code, field_list=[])
if data and data.get("ErrorId", "-1") == "0":
result["data"] = data
else:
result["status"] = "error"
result["message"] = f"未获取到 {args.code} 的行情快照"
return result
def cmd_kline(tq, args):
result = {
"status": "success", "data_type": "kline", "code": args.code,
"period": args.period, "count": args.count
}
dividend_map = {"none": "none", "qfq": "front", "hfq": "back", "bfq": "none"}
dividend_type = dividend_map.get(args.fq, "none")
df_dict = tq.get_market_data(
field_list=[],
stock_list=[args.code],
period=args.period,
start_time=args.start or "",
end_time=args.end or "",
count=args.count,
dividend_type=dividend_type,
fill_data=True
)
if df_dict and args.code in df_dict:
import pandas as pd
df = df_dict[args.code] if isinstance(df_dict, dict) else df_dict
# get_market_data 返回的是 {field: DataFrame} 结构
# 需要重新组装
try:
close_df = df_dict.get("Close", df_dict.get("close", None))
if close_df is not None and hasattr(close_df, "to_dict"):
result["data"] = close_df.to_dict()
else:
result["data"] = str(df_dict)
except Exception:
result["data"] = str(df_dict)
else:
result["status"] = "error"
result["message"] = f"未获取到 {args.code} 的K线数据"
return result
def cmd_stock_info(tq, args):
result = {"status": "success", "data_type": "stock_info", "code": args.code}
fields = args.fields.split(",") if args.fields else []
data = tq.get_stock_info(stock_code=args.code, field_list=fields)
if data and data.get("ErrorId", "-1") == "0":
data.pop("ErrorId", None)
result["data"] = data
else:
result["data"] = data or {}
return result
def cmd_more_info(tq, args):
result = {"status": "success", "data_type": "more_info", "code": args.code}
fields = args.fields.split(",") if args.fields else []
data = tq.get_more_info(stock_code=args.code, field_list=fields)
if data:
result["data"] = data
else:
result["status"] = "error"
result["message"] = f"未获取到 {args.code} 的更多信息"
return result
def cmd_divid_factors(tq, args):
result = {"status": "success", "data_type": "divid_factors", "code": args.code}
df = tq.get_divid_factors(
stock_code=args.code,
start_time=args.start or "",
end_time=args.end or ""
)
if df is not None and hasattr(df, "to_dict"):
result["data"] = df.to_dict(orient="records")
else:
result["data"] = []
return result
def cmd_gb_info(tq, args):
result = {"status": "success", "data_type": "gb_info", "code": args.code}
date_list = args.dates.split(",") if args.dates else []
data = tq.get_gb_info(
stock_code=args.code,
date_list=date_list,
count=len(date_list)
)
if data:
result["data"] = data
else:
result["data"] = []
return result
def main():
parser = argparse.ArgumentParser(description="通达信行情数据获取")
sub = parser.add_subparsers(dest="command", required=True)
# snapshot
p = sub.add_parser("snapshot", help="获取实时行情快照")
p.add_argument("--code", required=True, help="证券代码,如 600519.SH")
# kline
p = sub.add_parser("kline", help="获取K线数据")
p.add_argument("--code", required=True, help="证券代码,如 600519.SH")
p.add_argument("--period", default="1d",
choices=["1m", "5m", "15m", "30m", "1h", "1d", "1w", "1mon", "1q", "1y", "tick"],
help="K线周期,默认1d")
p.add_argument("--count", type=int, default=100, help="K线条数,默认100")
p.add_argument("--fq", default="qfq", choices=["qfq", "hfq", "bfq"],
help="复权类型: qfq-前复权(默认), hfq-后复权, bfq-不复权")
p.add_argument("--start", help="起始日期 YYYYMMDD")
p.add_argument("--end", help="结束日期 YYYYMMDD")
# stock_info
p = sub.add_parser("stock_info", help="获取证券基本信息")
p.add_argument("--code", required=True, help="证券代码,如 600519.SH")
p.add_argument("--fields", default="", help="字段列表,逗号分隔,如 Name,J_zgb,J_jzc")
# more_info
p = sub.add_parser("more_info", help="获取股票更多信息(涨幅/PE/PB/市值等)")
p.add_argument("--code", required=True, help="证券代码,如 600519.SH")
p.add_argument("--fields", default="", help="字段列表,逗号分隔,如 zaf,dynape,pb_mrq,zsz")
# divid_factors
p = sub.add_parser("divid_factors", help="获取分红配送数据")
p.add_argument("--code", required=True, help="证券代码,如 688318.SH")
p.add_argument("--start", default="", help="起始日期 YYYYMMDD")
p.add_argument("--end", default="", help="结束日期 YYYYMMDD")
# gb_info
p = sub.add_parser("gb_info", help="获取股本数据")
p.add_argument("--code", required=True, help="证券代码,如 688318.SH")
p.add_argument("--dates", default="", help="日期列表,逗号分隔,如 20250101,20250601")
args = parser.parse_args()
tq = init_tq()
handlers = {
"snapshot": cmd_snapshot,
"kline": cmd_kline,
"stock_info": cmd_stock_info,
"more_info": cmd_more_info,
"divid_factors": cmd_divid_factors,
"gb_info": cmd_gb_info,
}
try:
result = handlers[args.command](tq, args)
print(json.dumps(result, ensure_ascii=False, indent=2, default=str))
except Exception as e:
print(json.dumps({
"status": "error", "message": str(e), "error_type": type(e).__name__
}, ensure_ascii=False))
sys.exit(1)
if __name__ == "__main__":
main()
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
板块与分类数据获取脚本
支持:系统分类成份股(stock_list)、板块代码列表(sector_list)、板块成份股(sector_stocks)、
股票所属板块(stock_relation)、自定义板块(user_sector)
"""
import argparse
import json
import sys
import os
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from _tdx_init import init_tq
def cmd_stock_list(tq, args):
"""获取系统分类成份股"""
result = {"status": "success", "data_type": "stock_list", "list_type": args.list_type}
data = tq.get_stock_list(market=str(args.list_type), list_type=1 if args.with_name else 0)
result["data"] = data if data else []
result["count"] = len(data) if data else 0
return result
def cmd_sector_list(tq, args):
"""获取A股板块代码列表"""
result = {"status": "success", "data_type": "sector_list"}
data = tq.get_sector_list(list_type=1 if args.with_name else 0)
result["data"] = data if data else []
result["count"] = len(data) if data else 0
return result
def cmd_sector_stocks(tq, args):
"""获取板块成份股"""
result = {"status": "success", "data_type": "sector_stocks"}
block_code = args.block_code or ""
block_name = args.block_name or ""
if not block_code and not block_name:
result["status"] = "error"
result["message"] = "请提供 --block_code 或 --block_name"
return result
identifier = block_name if block_name else block_code
block_type = 1 if args.custom else 0
data = tq.get_stock_list_in_sector(
block_code=identifier,
block_type=block_type,
list_type=1 if args.with_name else 0
)
result["block"] = identifier
result["data"] = data if data else []
result["count"] = len(data) if data else 0
return result
def cmd_stock_relation(tq, args):
"""获取股票所属板块"""
result = {"status": "success", "data_type": "stock_relation", "code": args.code}
data = tq.get_relation(stock_code=args.code)
result["data"] = data if data else []
return result
def cmd_user_sector(tq, args):
"""自定义板块操作"""
result = {"status": "success", "data_type": "user_sector"}
if args.action == "list":
data = tq.get_user_sector()
result["data"] = data if data else []
elif args.action == "create":
data = tq.create_sector(block_code=args.block_code, block_name=args.block_name)
result["data"] = data
elif args.action == "add_stocks":
stocks = args.stocks.split(",") if args.stocks else []
data = tq.send_user_block(block_code=args.block_code, stocks=stocks, show=False)
result["data"] = data
elif args.action == "clear":
data = tq.send_user_block(block_code=args.block_code, stocks=[], show=False)
result["data"] = data
else:
result["status"] = "error"
result["message"] = f"未知操作: {args.action}"
return result
def main():
parser = argparse.ArgumentParser(description="通达信板块与分类数据获取")
sub = parser.add_subparsers(dest="command", required=True)
# stock_list
p = sub.add_parser("stock_list", help="获取系统分类成份股")
p.add_argument("--list_type", type=int, default=5,
help="分类类型: 0=自选股, 1=持仓股, 5=所有A股, 7=上证主板, 8=深证主板, "
"9=重点指数, 10=所有板块指数, 11=行业板块, 12=概念板块, 13=风格板块, "
"16=研究行业一级, 17=研究行业二级, 23=沪深300, 24=中证500, "
"32=可转债, 50=沪深A股, 51=创业板, 52=科创板, 53=北交所")
p.add_argument("--with_name", action="store_true", help="返回代码和名称")
# sector_list
p = sub.add_parser("sector_list", help="获取A股板块代码列表")
p.add_argument("--with_name", action="store_true", help="返回代码和名称")
# sector_stocks
p = sub.add_parser("sector_stocks", help="获取板块成份股")
p.add_argument("--block_code", default="", help="板块代码,如 880081.SH")
p.add_argument("--block_name", default="", help="板块名称,如 钛金属")
p.add_argument("--custom", action="store_true", help="是否为自定义板块")
p.add_argument("--with_name", action="store_true", help="返回代码和名称")
# stock_relation
p = sub.add_parser("stock_relation", help="获取股票所属板块")
p.add_argument("--code", required=True, help="证券代码,如 688318.SH")
# user_sector
p = sub.add_parser("user_sector", help="自定义板块操作")
p.add_argument("--action", required=True, choices=["list", "create", "add_stocks", "clear"],
help="操作: list-查看列表, create-创建板块, add_stocks-添加股票, clear-清空板块")
p.add_argument("--block_code", default="", help="板块简称(zxg=自选股)")
p.add_argument("--block_name", default="", help="板块名称(create时使用)")
p.add_argument("--stocks", default="", help="股票代码,逗号分隔(add_stocks时使用)")
args = parser.parse_args()
tq = init_tq()
handlers = {
"stock_list": cmd_stock_list,
"sector_list": cmd_sector_list,
"sector_stocks": cmd_sector_stocks,
"stock_relation": cmd_stock_relation,
"user_sector": cmd_user_sector,
}
try:
result = handlers[args.command](tq, args)
print(json.dumps(result, ensure_ascii=False, indent=2, default=str))
except Exception as e:
print(json.dumps({
"status": "error", "message": str(e), "error_type": type(e).__name__
}, ensure_ascii=False))
sys.exit(1)
if __name__ == "__main__":
main()
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
交易执行脚本
支持:获取账户句柄(account)、下单(order)、撤单(cancel)、
查询持仓(positions)、查询委托(orders)、查询资产(asset)
"""
import argparse
import json
import sys
import os
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from _tdx_init import init_tq
def cmd_account(tq, args):
"""获取资金账户句柄"""
result = {"status": "success", "data_type": "account"}
account_id = tq.stock_account(account=args.account or "", account_type=args.account_type)
if account_id >= 0:
result["account_id"] = account_id
result["account_type"] = args.account_type
else:
result["status"] = "error"
result["message"] = f"获取账户句柄失败(句柄={account_id}),请确认客户端已登录账户"
return result
def cmd_order(tq, args):
"""下单"""
# 先获取账户句柄
account_id = tq.stock_account(account=args.account or "", account_type=args.account_type)
if account_id < 0:
return {"status": "error", "message": f"获取账户句柄失败(句柄={account_id})"}
from tqcenter import tqconst
order_type_map = {
"buy": tqconst.STOCK_BUY,
"sell": tqconst.STOCK_SELL,
"credit_buy": tqconst.CREDIT_BUY,
"credit_sell": tqconst.CREDIT_SELL,
"credit_fin_buy": tqconst.CREDIT_FIN_BUY,
"credit_slo_sell": tqconst.CREDIT_SLO_SELL,
}
price_type_map = {
"my": tqconst.PRICE_MY,
"sj": tqconst.PRICE_SJ,
"ztj": tqconst.PRICE_ZTJ,
"dtj": tqconst.PRICE_DTJ,
}
order_type = order_type_map.get(args.order_type, tqconst.STOCK_BUY)
price_type = price_type_map.get(args.price_type, tqconst.PRICE_MY)
data = tq.order_stock(
account_id=account_id,
stock_code=args.code,
order_type=order_type,
order_volume=args.volume,
price_type=price_type,
price=args.price
)
return {"status": "success", "data_type": "order", "data": data}
def cmd_cancel(tq, args):
"""撤单"""
account_id = tq.stock_account(account=args.account or "", account_type=args.account_type)
if account_id < 0:
return {"status": "error", "message": f"获取账户句柄失败(句柄={account_id})"}
data = tq.cancel_order_stock(
account_id=account_id,
stock_code=args.code,
order_id=args.order_id
)
return {"status": "success", "data_type": "cancel", "data": data}
def cmd_positions(tq, args):
"""查询持仓"""
account_id = tq.stock_account(account=args.account or "", account_type=args.account_type)
if account_id < 0:
return {"status": "error", "message": f"获取账户句柄失败(句柄={account_id})"}
data = tq.query_stock_positions(account_id=account_id)
return {"status": "success", "data_type": "positions", "data": data if data else []}
def cmd_orders(tq, args):
"""查询委托"""
account_id = tq.stock_account(account=args.account or "", account_type=args.account_type)
if account_id < 0:
return {"status": "error", "message": f"获取账户句柄失败(句柄={account_id})"}
data = tq.query_stock_orders(account_id=account_id, stock_code=args.code or "")
return {"status": "success", "data_type": "orders", "data": data if data else []}
def cmd_asset(tq, args):
"""查询资产"""
account_id = tq.stock_account(account=args.account or "", account_type=args.account_type)
if account_id < 0:
return {"status": "error", "message": f"获取账户句柄失败(句柄={account_id})"}
data = tq.query_stock_asset(account_id=account_id)
return {"status": "success", "data_type": "asset", "data": data if data else {}}
def main():
parser = argparse.ArgumentParser(description="通达信交易执行")
parser.add_argument("--account", default="", help="资金账号(空则使用当前登录账户)")
parser.add_argument("--account_type", default="stock",
choices=["stock", "credit", "future", "option"],
help="账号类型: stock-普通股票, credit-信用, future-期货, option-期权")
sub = parser.add_subparsers(dest="command", required=True)
# account
sub.add_parser("account", help="获取资金账户句柄")
# order
p = sub.add_parser("order", help="下单")
p.add_argument("--code", required=True, help="证券代码,如 688318.SH")
p.add_argument("--order_type", required=True,
choices=["buy", "sell", "credit_buy", "credit_sell", "credit_fin_buy", "credit_slo_sell"],
help="委托类型")
p.add_argument("--volume", type=int, required=True, help="委托数量")
p.add_argument("--price_type", default="my", choices=["my", "sj", "ztj", "dtj"],
help="报价类型: my-自填价, sj-市价, ztj-涨停价, dtj-跌停价")
p.add_argument("--price", type=float, default=0.0, help="委托价格(price_type=my时必填)")
# cancel
p = sub.add_parser("cancel", help="撤单")
p.add_argument("--code", required=True, help="证券代码")
p.add_argument("--order_id", required=True, help="委托编号")
# positions
sub.add_parser("positions", help="查询持仓")
# orders
p = sub.add_parser("orders", help="查询委托")
p.add_argument("--code", default="", help="证券代码(空则查询全部)")
# asset
sub.add_parser("asset", help="查询资产")
args = parser.parse_args()
tq = init_tq()
handlers = {
"account": cmd_account,
"order": cmd_order,
"cancel": cmd_cancel,
"positions": cmd_positions,
"orders": cmd_orders,
"asset": cmd_asset,
}
try:
result = handlers[args.command](tq, args)
print(json.dumps(result, ensure_ascii=False, indent=2, default=str))
except Exception as e:
print(json.dumps({
"status": "error", "message": str(e), "error_type": type(e).__name__
}, ensure_ascii=False))
sys.exit(1)
if __name__ == "__main__":
main()