欢迎光临
我们一直在努力

QMT 原生接口实操:获取股票列表、申万行业及概念数据(Python 完整代码)

前言

不少量化小伙伴咨询如何通过原生 QMT 工具获取股票基础数据,比如全市场股票列表、个股对应的申万一级 / 二级 / 三级行业分类,以及股票所属概念标签。这类数据变动频率低,是量化策略搭建(如行业轮动、概念题材筛选)的基础素材。

本文将分享完整的 Python 实现代码,无需额外对接第三方数据源,直接调用 QMT 原生接口即可获取目标数据。数据默认导出为 CSV 文件,方便后续快速读取;有技术基础的同学也可拓展至数据库存储,提升数据管理效率。

一、环境准备

依赖库安装

核心依赖xtquant(QMT 官方 Python 库)和pandas(数据处理),安装命令如下:

pip install xtquant pandas -i https://pypi.tuna.tsinghua.edu.cn/simple

注意事项

  • 确保已安装 QMT 终端并正常登录,接口需依赖 QMT 客户端的连接环境;
  • 代码运行环境建议与 QMT 终端版本匹配(推荐 QMT 8.0+);
  • 数据更新频率:行业和概念数据变动较少,建议每周更新 1 次即可。
  • 二、完整代码实现

    1. 核心工具函数:下载行业板块基础数据

    该函数用于获取 QMT 内置的板块分类数据,替代原生xtdata.download_sector_data(),解决部分场景下接口卡死的问题:

    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()

    2. 获取沪深 A 股股票池(代码 + 名称)

    返回全部沪深 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

    3. 获取股票对应申万二级行业

    通过筛选 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

    4. 获取股票对应申万三级行业

    逻辑与申万二级行业获取一致,筛选 “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

    5. 获取股票对应概念标签

    筛选 QMT 板块分类中 “GN” 前缀的概念板块,匹配个股与概念的对应关系,导出为沪深A股所属概念.csv(注:原文文件后缀为.cv,已修正为.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) # 修正原文.cv后缀为.csv
    return df

    6. 函数调用示例

    如需执行全部数据获取操作,添加如下调用代码:

    if __name__ == "__main__":
    # 依次执行数据获取
    get_stock_pool()
    get_sw2_industry()
    get_sw3_industry()
    get_gainian()
    print("所有数据已导出为CSV文件,可在当前目录查看!")

    三、数据使用说明

    1. 文件输出位置

    CSV 文件将保存在代码运行目录下,共 4 个文件:

    • 沪深 A 股股票池.csv(股票代码 + 名称)
    • 沪深 A 股申万二级行业.csv(股票代码 + 申万二级行业)
    • 沪深 A 股申万三级行业.csv(股票代码 + 申万三级行业)
    • 沪深 A 股所属概念.csv(股票代码 + 概念标签)

    2. 数据读取示例

    后续策略中可直接用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())

    3. 进阶拓展:数据库存储建议

    对于高频使用场景,建议将数据存入数据库(如 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()

    四、常见问题排查

  • 接口调用失败:检查 QMT 终端是否登录,或重启 QMT 后重新运行代码;
  • 数据为空:确认 “沪深 A 股” 板块名称正确(QMT 板块名称不可修改),或升级xtquant至最新版本;
  • 文件无法打开:原文get_gainian()函数中文件后缀为.cv,需手动修正为.csv,否则导出失败。
  • 6 亿股民都在用的同花顺,居然能对接 QMT 量化!一键选股 + 自动交易,太香了(上) 量化教程+软件

    结语

    以上就是通过 QMT 原生接口获取股票基础数据的完整教程,代码可直接复用,适合量化新手快速搭建数据基础。如果需要获取申万一级行业数据,可参考文中二级 / 三级行业的筛选逻辑,修改sw2/sw3为sw1即可。

    欢迎在评论区交流使用过程中遇到的问题,后续将分享更多 QMT 量化实操技巧!

    #QMT #量化交易 #Python #股票数据获取 #申万行业 #概念题材

    赞(0)
    未经允许不得转载:171主机测评 » QMT 原生接口实操:获取股票列表、申万行业及概念数据(Python 完整代码)
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址