# 获取分笔行情get_tick_data
# 根据股票代码和日期,获取指定日期的分笔成交数据
get_tick_data(
stock_code: str,
date: str,
startxh: int = 0,
wantnum: int = 0
) -> Dict
1
2
3
4
5
6
2
3
4
5
6
# 输入参数
| 参数 | 是否必选 | 参数类型 | 参数说明 |
|---|---|---|---|
| stock_code | Y | str | 单只证券代码,例如 688318.SH |
| date | Y | str | 分笔数据日期,支持 YYYYMMDD、YYYY-MM-DD 或 YYYY-MM-DD HH:MM:SS |
| startxh | N | int | 起始分笔序号,从 0 开始 |
| wantnum | N | int | 请求返回的分笔数据条数,建议取值范围为 1~2000 |
# 返回数据
| 数据字段 | 默认返回 | 数据类型 | 数据说明 |
|---|---|---|---|
| BSFlag | N | List[str] | 买卖方向 0买 1卖 2未知 |
| Price | Y | List[str] | 成交价格 |
| Time | Y | List[str] | 成交时间 |
| TotalNum | N | int / str | 分笔数据总数 |
| Volume | Y | List[str] | 成交量 |
# 接口使用
获取 688318.SH 在 2026-08-20 的前 10 条分笔成交数据。
from tqserver import tqs
ticks = tqs.get_tick_data(
stock_code="688318.SH",
date="2026-08-20",
startxh=0,
wantnum=10,
)
print(ticks)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 数据样本
{
"BSFlag": ["2", "0", "0", "1", "1", "1", "1", "1", "0", "1"],
"Price": ["76.26", "76.61", "76.62", "76.61", "76.61", "76.61", "76.61", "76.71", "76.97", "76.62"],
"Time": ["092504", "093000", "093003", "093006", "093009", "093014", "093018", "093022", "093026", "093030"],
"TotalNum": 10,
"Volume": ["43", "2", "9", "29", "7", "18", "6", "19", "16", "53"]
}
1
2
3
4
5
6
7
2
3
4
5
6
7
# 获取指定日期分时数据 get_minute_data
# 根据单只股票代码和日期,获取指定交易日的分时数据
get_minute_data(
stock_code: str = "",
date: str = "",
field_list: Optional[Iterable[str]] = None
) -> Dict
1
2
3
4
5
2
3
4
5
# 输入参数
| 参数 | 是否必选 | 参数类型 | 参数说明 |
|---|---|---|---|
| stock_code | Y | str | 单只证券代码,例如 000001.SZ |
| date | Y | str | 查询日期,支持 YYYYMMDD、YYYY-MM-DD 或完整时间格式 |
| field_list | N | Iterable[str] / None | 返回字段筛选,传 None 或空列表时返回全部字段 |
# 参数说明
stock_code只支持传入单只证券代码,不传股票列表。- 股票代码需要带市场后缀,例如:
000001.SZ600000.SH688318.SH
date支持以下格式:
20260821
2026-08-21
2026-08-21 00:00:00
1
2
3
2
3
field_list不传、传None或传空列表时,返回全部字段。field_list非空时,只返回指定字段。- 字段名称区分大小写,应使用接口返回的原始字段名。
# 返回数据
返回 dict,当前实际返回字段如下:
Average
Price
Time
TotalNum
Volume
1
2
3
4
5
2
3
4
5
| 数据字段 | 数据类型 | 数据说明 |
|---|---|---|
| TotalNum | int | 本次返回的分时记录数 |
| Time | List[str] | 分时数据时间,格式通常为 HHMMSS |
| Price | List[str] | 分时成交价格 |
| Average | List[str] | 分时均价 |
| Volume | List[str] | 分时成交量 |
Time、Price、Average、Volume是并行数组。- 同一数组下标的数据属于同一条分时记录。
TotalNum表示本次返回的分时记录数量。- 使用
field_list筛选后,返回结果只保留指定字段,可能不再包含TotalNum。
# 接口使用
获取
000001.SZ在2026-08-21的全部分时数据。
from tqserver import tqs
minute_data = tqs.get_minute_data(
stock_code="000001.SZ",
date="2026-08-21",
)
print(minute_data)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 字段筛选使用
获取
000001.SZ在2026-08-21的分时时间和价格。
from tqserver import tqs
minute_data = tqs.get_minute_data(
stock_code="000001.SZ",
date="2026-08-21",
field_list=["Time", "Price"],
)
print(minute_data)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 数据样本
{
"Average": [
"11.39",
"11.39",
"11.39"
],
"Price": [
"11.36",
"11.36",
"11.37"
],
"Time": [
"093000",
"093100",
"093200"
],
"TotalNum": 240,
"Volume": [
"3049",
"1737",
"1547"
]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 注意事项
- 返回数据是否完整取决于指定股票和日期是否有可用分时数据。
- 日期不是交易日、股票代码无效或服务端没有数据时,可能返回空结果。
# 获取指数成分股 get_zzgz_stocklist
# 根据指数代码,获取指定指数的成分股列表
get_zzgz_stocklist(
index_code: str = "",
list_type: int = 0
) -> List
1
2
3
4
2
3
4
# 输入参数
| 参数 | 是否必选 | 参数类型 | 参数说明 |
|---|---|---|---|
| index_code | Y | str | 指数代码,例如 000300.SH |
| list_type | N | int | 成分股返回类型,默认值为 0 |
# 参数说明
index_code必须传入指数代码,不能为空。- 指数代码建议带市场后缀,例如:
000300.SH
000905.SH
000852.SH
1
2
3
2
3
list_type默认值为0。list_type的具体枚举含义由底层TdxAiData.dll数据服务定义。- 当前已验证:
get_zzgz_stocklist(
index_code="000300.SH",
list_type=0,
)
1
2
3
4
2
3
4
可以返回沪深 300 成分股代码列表。
# 返回数据
返回 list 或 dict,当前 list_type=0 的实际返回类型为股票代码列表。
返回列表中的股票代码带市场后缀,例如:
000001.SZ
000002.SZ
000063.SZ
600000.SH
1
2
3
4
2
3
4
# 接口使用
获取沪深 300 指数
000300.SH的成分股列表。
from tqserver import tqs
stock_list = tqs.get_zzgz_stocklist(
index_code="000300.SH",
list_type=0,
)
print(stock_list)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 数据样本
[
"000001.SZ",
"000002.SZ",
"000063.SZ",
"000100.SZ",
"000157.SZ",
"000166.SZ",
"000301.SZ",
"000333.SZ",
"000338.SZ",
"000408.SZ"
]
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 实际返回说明
使用以下参数进行实际验证:
tqs.get_zzgz_stocklist(
index_code="000300.SH",
list_type=0,
)
1
2
3
4
2
3
4
实际返回:
返回类型:list
返回数量:300
1
2
2
# 注意事项
index_code不能为空。list_type必须为整数。- 指数代码无效、指数市场不支持或服务端没有数据时,可能返回空列表或空对象。
# 订阅实时行情 subscribe
# 订阅指定股票的实时行情,通过回调函数接收真实行情数据,并可保存到本地文件
subscribe(
stock_list: List[str] = [],
callback: Optional[Callable[[str], Any]] = None
) -> None
1
2
3
4
2
3
4
# 输入参数
| 参数 | 是否必选 | 参数类型 | 参数说明 |
|---|---|---|---|
| stock_list | Y | List[str] | 待订阅的证券代码列表 |
| callback | Y | Callable | 行情回调函数,接收一个行情数据字符串参数 |
# 参数说明
stock_list必须传入股票代码列表,不能为空。- 股票代码需要带市场后缀,例如:
000001.SZ600000.SH600519.SH
callback必须是可调用对象。- 回调函数只接收一个参数:
data: str
1
data是底层行情服务返回的 JSON 字符串。subscribe调用成功后,行情数据会通过回调函数异步返回。subscribe本身不会返回行情数据。- 主程序需要持续运行,否则 Python 进程退出后将无法继续接收行情。
- 取消订阅使用:
unsubscribe(stock_list)
1
# 返回数据
subscribe 本身返回:
None
1
实时行情通过回调函数返回,回调参数为 JSON 字符串。
实际回调数据的基本结构如下:
{
"Error": "",
"ErrorId": 0,
"ResultSets": [
{
"ColDes": [
"code",
"decimal",
"price",
"pre_close",
"open",
"high",
"low",
"refresh_time",
"volume",
"bond_match_price",
"limit_up",
"limit_down",
"accrued_interest",
"cage_up",
"cage_down",
"after_hours_flag",
"tomorrow_limit_up",
"tomorrow_limit_down",
"sdunit_status",
"seal_amount",
"ask1",
"ask2",
"ask3",
"ask4",
"ask5",
"ask_vol1",
"ask_vol2",
"ask_vol3",
"ask_vol4",
"ask_vol5",
"bid1",
"bid2",
"bid3",
"bid4",
"bid5",
"bid_vol1",
"bid_vol2",
"bid_vol3",
"bid_vol4",
"bid_vol5"
],
"Content": [
[
"000001.SZ",
2,
11.350,
11.400,
11.360,
11.430,
11.340,
95024,
155267,
0.0,
12.540,
10.260,
5.490,
11.590,
11.120,
0,
0.0,
0.0,
3,
0.0,
11.360,
11.370,
11.380,
11.390,
11.400,
343,
1043,
1276,
1396,
6887,
11.350,
11.340,
11.330,
11.320,
11.310,
1061,
2660,
4393,
4078,
5048
]
]
}
]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# 返回字段
ColDes 是字段名数组,Content 是数据数组。
Content 中每一行数据与 ColDes 按相同下标对应。
| 字段 | 数据说明 |
|---|---|
code | 证券代码 |
decimal | 价格小数位数或价格精度 |
price | 最新价 |
pre_close | 昨收价 |
open | 开盘价 |
high | 最高价 |
low | 最低价 |
refresh_time | 行情刷新时间,通常为 HHMMSS 数字 |
volume | 成交量 |
bond_match_price | 债券匹配价格 |
limit_up | 涨停价 |
limit_down | 跌停价 |
accrued_interest | 应计利息 |
cage_up | 上限价格 |
cage_down | 下限价格 |
after_hours_flag | 盘后标志 |
tomorrow_limit_up | 下一交易日涨停价 |
tomorrow_limit_down | 下一交易日跌停价 |
sdunit_status | 证券状态 |
seal_amount | 封单金额 |
ask1 ~ ask5 | 五档卖价 |
ask_vol1 ~ ask_vol5 | 五档卖量 |
bid1 ~ bid5 | 五档买价 |
bid_vol1 ~ bid_vol5 | 五档买量 |
# 接口使用
订阅
000001.SZ、600000.SH和600519.SH的实时行情,并持续运行 30 秒。
import time
from tqserver import tqs
def on_quote(data: str) -> None:
print("收到实时行情:")
print(data)
stock_list = [
"000001.SZ",
"600000.SH",
"600519.SH",
]
subscribed = False
try:
tqs.subscribe(
stock_list=stock_list,
callback=on_quote,
)
subscribed = True
print("订阅成功")
print("当前订阅列表:")
print(tqs.get_subscribe_hq_stock_list())
time.sleep(30)
finally:
if subscribed:
tqs.unsubscribe(stock_list)
print("已取消订阅")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 解析回调数据
import json
from tqserver import tqs
def on_quote(data: str) -> None:
try:
quote_data = json.loads(data)
if quote_data.get("ErrorId") not in (0, "0", None):
print("行情服务返回错误:", quote_data)
return
result_sets = quote_data.get("ResultSets", [])
for result_set in result_sets:
field_names = result_set.get("ColDes", [])
content = result_set.get("Content", [])
for row in content:
quote = dict(zip(field_names, row))
print(
quote.get("code"),
quote.get("price"),
quote.get("volume"),
)
except json.JSONDecodeError:
print("回调数据不是有效 JSON:", data)
except Exception as exc:
print("解析行情回调失败:", exc)
stock_list = ["000001.SZ"]
try:
tqs.subscribe(stock_list, on_quote)
input("订阅已建立,按回车取消订阅...")
finally:
tqs.unsubscribe(stock_list)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# 注意事项
subscribe不会自动为业务程序创建永久运行逻辑。- 如果调用
subscribe后程序没有其他阻塞逻辑,主线程执行结束后程序会退出。 - 可以使用
while True、事件等待或其他业务循环保持程序运行。 subscribe回调收到的是原始 JSON 字符串,不是已经转换好的字典。- 需要使用
json.loads(data)将回调字符串解析为 Python 对象。 Content中每行数据与ColDes按下标对应。- 行情回调可能在短时间内连续触发多次。
- 回调函数不建议执行耗时计算、网络请求或长时间文件操作。
- 保存数据时建议使用追加写入方式,避免覆盖之前的行情记录。
- 策略程序必须保持运行,否则订阅会随 Python 进程退出而终止。
- 程序退出前应调用
unsubscribe释放订阅。 - 当前底层取消订阅为全局取消订阅,即使传入部分股票,也可能取消全部底层订阅。
# 取消实时行情订阅 unsubscribe
####取消指定股票的实时行情订阅
unsubscribe() -> None
1
# 返回数据
unsubscribe 无返回数据,返回值为:
None
1
# 接口使用
订阅两只股票,运行 30 秒后取消订阅。
import time
from tqserver import tqs
stock_list = [
"000001.SZ",
"600000.SH",
]
subscribed = False
try:
tqs.subscribe(
stock_list=stock_list,
callback=lambda data: print(data),
)
subscribed = True
print("当前订阅列表:")
print(tqs.get_subscribe_hq_stock_list())
time.sleep(30)
finally:
if subscribed:
tqs.unsubscribe()
print("已取消订阅")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 注意事项
- 取消订阅后,不再接收对应行情回调。
- 当前实现为全局取消订阅接口,不是只取消传入的部分股票。
- 如果需要保留其他股票的订阅,应在取消后重新调用
subscribe。 - 建议在
finally代码块中调用unsubscribe,确保程序异常退出时也能释放订阅。