PTrade 量化 API 详解:get_stock_blocks 一键查询股票行业 / 地域 / 概念板块【附实战代码】

8 阅读6分钟

前言

在量化策略开发中,行业轮动、概念选股、地域板块轮动都是非常经典的策略逻辑。想要按板块维度筛选标的,首先需要获取每只股票对应的板块属性。手动单只查询效率极低,也无法批量处理股票池数据。

在 PTrade 量化平台中,get_stock_blocks 函数可以一键查询单只股票的全部板块归属,涵盖行业、地域、概念、指数成分等多个维度,是板块类策略开发的必备基础工具。本文就带大家全面掌握这个函数的语法、返回值结构与实战用法。

一、函数核心功能

get_stock_blocks 的核心作用是:输入单只股票代码,返回该股票所属的全量板块信息,包括行业分类、地域归属、热门概念、所属指数等多个维度

可以通俗理解为股票的「身份档案」:输入股票代码,就能调出它的全部标签属性,方便我们按板块维度对股票进行分类、筛选与标签化处理。

二、语法与参数说明

2.1 调用格式

get_stock_blocks(stock_code)

2.2 参数说明

函数仅需传入 1 个必填参数:

  • stock_code:字符串类型,目标股票代码,必须携带市场后缀,沪市股票后缀为 .SS,深市为 .SZ。例如工商银行需写为 "601398.SS",不能只写 "601398"

2.3 返回值结构

函数返回一个嵌套字典,包含多个分类键,每个键对应一类板块信息。其中最核心的 5 类标签如下:

字典键标签类型说明示例
HY行业板块股票所属的行业分类["银行业"]
DY地域板块股票注册地对应的地区分类["北京板块"]
GN概念板块股票关联的市场热门概念["融资融券", "沪股通", "国企改革"]
HGT特殊市场板块沪股通 / 深股通等特殊市场标识["沪股通"]
ZS指数成分股票所属的全部指数,每项为 [指数代码, 指数名称][["000300.HSZS", "沪深300"], ["000016.HSZS", "上证50"]]

三、基础用法示例

3.1 查询单只股票完整板块信息

直接传入股票代码,获取全量板块字典,适合快速校验个股的全部属性。

# 查询工商银行的所属全部板块
blocks = get_stock_blocks("601398.SS")
print(blocks)

返回结果为嵌套字典,包含指数、行业、地域、概念等全量信息,片段示例:

{
    'ZS': [
        ['000001.HSZS', '上证指数'],
        ['000300.HSZS', '沪深300'],
        ['000016.HSZS', '上证50'],
        ['000134.HSZS', '上证银行'],
        ...
    ],
    'HY': ['银行业'],
    'DY': ['北京板块'],
    'GN': ['融资融券', '沪股通', '央企改革', ...]
}

3.2 提取纯净板块名称(去除代码)

默认返回的指数板块包含指数代码,日常策略开发中我们通常只需要名称,可以通过列表推导式快速提取:

# 查询贵州茅台的板块信息
blocks = get_stock_blocks("600519.SS")

# 分类提取纯净名称
hy_list = blocks.get('HY', [])                  # 行业板块
dy_list = blocks.get('DY', [])                  # 地域板块
gn_list = blocks.get('GN', [])                  # 概念板块
index_list = [item[1] for item in blocks.get('ZS', [])]  # 所属指数名称

print("行业板块:", hy_list)
print("地域板块:", dy_list)
print("概念板块(前5个):", gn_list[:5])

运行输出示例:

行业板块: ['白酒II']
地域板块: ['贵州板块']
概念板块(前5个): ['融资融券', '转融券标的', '国企改革', '沪股通', '证金持股']

四、策略实战完整代码

场景 1:开盘前查询个股完整板块属性

在策略初始化时指定标的,开盘前自动查询并打印其完整板块信息,适合个股基本面校验与标签核对。

def initialize(context):
    """策略初始化:指定查询标的"""
    log.info("策略启动,准备查询工商银行所属板块")
    g.stock = "601398.SS"  # 工商银行股票代码

def before_trading_start(context, data):
    """开盘前执行:查询并打印全量板块信息"""
    # 调用函数获取板块字典
    stock_blocks = get_stock_blocks(g.stock)
    
    # 打印完整结果
    log.info(f"{g.stock} 的所属板块信息:")
    log.info(stock_blocks)

def handle_data(context, data):
    """盘中交易逻辑(此处留空)"""
    pass

场景 2:批量标注股票池的板块标签

实际选股中,我们常需要对整个股票池批量添加板块属性。以下代码结合 get_index_stocks,实现对沪深 300 成分股的批量板块标注。

def initialize(context):
    log.info("策略启动,批量获取沪深300成分股板块标签")
    g.index_code = "000300.XBHS"

def before_trading_start(context, data):
    # 1. 获取沪深300成分股列表
    stock_pool = get_index_stocks(g.index_code)
    
    # 2. 遍历股票池,提取行业与核心概念
    log.info("沪深300成分股板块标签(前5只):")
    for stock in stock_pool[:5]:
        blocks = get_stock_blocks(stock)
        # 容错处理:退市股返回None
        if blocks is None:
            log.info(f"{stock} | 已退市,无板块信息")
            continue
        hy = blocks.get('HY', ['无'])[0]
        gn_top3 = blocks.get('GN', [])[:3]
        log.info(f"{stock} | 行业:{hy} | 核心概念:{gn_top3}")

def handle_data(context, data):
    pass

五、新手避坑指南

  1. 股票代码必须补全后缀 传入的股票代码必须携带 .SS.SZ 市场后缀,仅输入数字代码会无法正常返回结果。

  2. 退市股票返回 None 如果查询标的已退市,函数会直接返回 None。批量处理股票池时建议增加判空逻辑,避免触发程序报错。

  3. 回测存在板块漂移风险 函数默认返回当前最新的板块分类。在历史回测场景下,股票的行业、概念归属可能与历史时点存在差异(例如个股后期主营业务变更、新增概念标签),对板块时效性要求高的策略需注意该偏差。

  4. 板块分类标准不绝对统一 行业、概念板块的划分没有全市场统一标准,不同量化平台的分类结果可能存在细节差异,策略开发时以 PTrade 平台内部分类为准即可。

六、总结

get_stock_blocks 是 PTrade 中板块分析的核心基础函数,虽然用法简单,但却是行业轮动、概念选股、风格轮动等策略的底层支撑。熟练掌握这个函数,可以快速完成股票标签化、板块筛选、行业分布统计等常见需求,大幅提升策略开发效率。


风险提示

本文仅为量化 API 技术功能分享,不构成任何投资建议。量化交易存在市场风险、策略失效风险、系统运行风险等,投资者需结合自身风险承受能力谨慎参与。