QMT 原生接口获取股票列表、申万行业及概念数据(Python 实现)
介绍如何使用 QMT 原生 Python 接口获取沪深 A 股股票池、申万一级至三级行业分类及股票概念标签。通过安装 xtquant 和 pandas 库,调用相关函数下载板块数据并匹配个股信息,最终导出为 CSV 文件。支持后续读取合并数据或存入数据库,适用于量化策略搭建中的基础数据准备工作。

介绍如何使用 QMT 原生 Python 接口获取沪深 A 股股票池、申万一级至三级行业分类及股票概念标签。通过安装 xtquant 和 pandas 库,调用相关函数下载板块数据并匹配个股信息,最终导出为 CSV 文件。支持后续读取合并数据或存入数据库,适用于量化策略搭建中的基础数据准备工作。

本文介绍如何使用 QMT 原生 Python 接口获取沪深 A 股股票池、申万行业分类及股票概念标签。代码可直接复用,适合量化策略搭建中的基础数据准备工作。
核心依赖 xtquant(QMT 官方 Python 库)和 pandas(数据处理),安装命令如下:
pip install xtquant pandas -i https://pypi.tuna.tsinghua.edu.cn/simple
该函数用于获取 QMT 内置的板块分类数据,解决部分场景下接口卡死的问题:
from xtquant import xtdata
import pandas as pd
def down_load_sector():
# 下载行业板块数据(替代 xtdata.download_sector_data(),避免卡死)
client = xtdata.get_client()
client.down_all_sector_data()
返回全部沪深 A 股的股票代码和对应名称(不含北交所股票),导出为 沪深A股股票池.csv:
def get_stock_pool():
# 获取股票池,返回全部 A 股的代码和对应的股票名称(不含北交所)
stocks = xtdata.get_stock_list_in_sector("沪深 A 股")
info_list = xtdata.get_instrument_detail_list(stocks)
ret = []
for stock in stocks:
name = info_list[stock]['InstrumentName']
ret.append({"stock": stock, "name": name})
df = pd.DataFrame(ret)
df = df.sort_values(by="stock")
df.to_csv("沪深A股股票池.csv", index=False)
return df
通过筛选 QMT 板块分类中的 'SW2' 前缀数据,匹配个股与申万二级行业的对应关系,导出为 沪深A股申万二级行业.csv:
def get_sw2_industry():
# 获取股票对应的申万二级行业
down_load_sector()
sector_list = xtdata.get_sector_list()
sw2_list = [s for s in sector_list if s[:3].lower() == 'sw2' and '加权' not in s]
stocks = xtdata.get_stock_list_in_sector("沪深 A 股")
ret = []
for sw2 in sw2_list:
s_list = xtdata.get_stock_list_in_sector(sw2)
for stock in stocks:
if stock in s_list:
ret.append({'stock': stock, "industry_sw2": sw2[3:]})
df = pd.DataFrame(ret)
df = df.sort_values(by="stock")
df.to_csv("沪深A股申万二级行业.csv", index=False)
return df
逻辑与申万二级行业获取一致,筛选 'SW3' 前缀板块数据,导出为 沪深A股申万三级行业.csv:
def get_sw3_industry():
# 获取股票对应的申万三级行业
down_load_sector()
sector_list = xtdata.get_sector_list()
sw3_list = [s for s in sector_list if s[:3].lower() == 'sw3' and '加权' not in s]
stocks = xtdata.get_stock_list_in_sector("沪深 A 股")
ret = []
for sw3 in sw3_list:
s_list = xtdata.get_stock_list_in_sector(sw3)
for stock in stocks:
if stock in s_list:
ret.append({'stock': stock, 'industry_sw3': sw3[3:]})
df = pd.DataFrame(ret)
df = df.sort_values(by="stock")
df.to_csv("沪深A股申万三级行业.csv", index=False)
return df
筛选 QMT 板块分类中 'GN' 前缀的概念板块,匹配个股与概念的对应关系,导出为 沪深A股所属概念.csv:
def get_gainian():
# 获取股票对应的概念
down_load_sector()
sector_list = xtdata.get_sector_list()
gn_list = [s for s in sector_list if s[:2].lower() == 'gn']
stocks = xtdata.get_stock_list_in_sector("沪深 A 股")
ret = []
for gn in gn_list:
s_list = xtdata.get_stock_list_in_sector(gn)
for stock in stocks:
if stock in s_list:
ret.append({'stock': stock, 'gainian': gn[2:]})
df = pd.DataFrame(ret)
df = df.sort_values(by="stock")
df.to_csv("沪深A股所属概念.csv", index=False)
return df
如需执行全部数据获取操作,添加如下调用代码:
if __name__ == "__main__":
# 依次执行数据获取
get_stock_pool()
get_sw2_industry()
get_sw3_industry()
get_gainian()
print("所有数据已导出为 CSV 文件,可在当前目录查看!")
CSV 文件将保存在代码运行目录下,共 4 个文件:
后续策略中可直接用 pandas 读取 CSV 文件,无需重复调用接口:
import pandas as pd
# 读取申万三级行业数据
sw3_df = pd.read_csv("沪深A股申万三级行业.csv")
# 读取概念数据
gn_df = pd.read_csv("沪深A股所属概念.csv")
# 合并行业和概念数据(按股票代码关联)
stock_data = pd.merge(sw3_df, gn_df, on="stock", how="left")
print(stock_data.head())
对于高频使用场景,建议将数据存入数据库(如 MySQL、SQLite),示例代码框架如下:
import sqlite3
# 连接 SQLite 数据库(无则自动创建)
conn = sqlite3.connect("stock_basic_data.db")
# 将 DataFrame 写入数据库表
df.to_sql("sw3_industry", conn, if_exists="replace", index=False)
conn.close()
xtquant 至最新版本;.csv,否则可能导致读取失败。
微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online