🚀 AI 一键生成 qmt 策略代码

QMT 精准选股:is_typed_stock 函数分类筛选股票、基金、可转债

qmt | 发布时间: 2025/12/10
以下内容由 EasyQuant 生成。

问题描述

怎样才能从一个股票列表中,只筛选出所有可转债或者所有ETF基金?

解决方案

在 QMT 中,筛选特定类型的证券(如可转债或 ETF)主要使用内置函数 is_typed_stock

该函数通过传入特定的类别标号(Type ID),判断某只证券是否属于该类别。

核心函数说明

is_typed_stock(stocktypenum, market, stockcode)

  • stocktypenum (int): 证券类别标号(见下文代码中的注释)。
  • market (str): 市场代码(如 'SH', 'SZ')。
  • stockcode (str): 证券代码(注意: 这里仅指数字代码,不包含后缀,如 '600000')。

类别标号速查

根据 QMT API 文档附录:

  1. ETF 基金: 类别标号为 100013 (包含沪市 ETF 和深市 ETF)。
  2. 可转债:
    • 沪市可转债标号: 135
    • 深市可转债标号: 10019

策略代码示例

以下代码展示了如何定义一个包含股票、ETF 和可转债的混合列表,并将其分离为“仅 ETF”列表和“仅可转债”列表。

# -*- coding: gbk -*-

def init(ContextInfo):
    # 1. 定义一个混合了股票、ETF、可转债的示例列表
    mixed_list = [
        '600519.SH', # 贵州茅台 (股票)
        '510300.SH', # 沪深300ETF (ETF)
        '159915.SZ', # 创业板ETF (ETF)
        '113050.SH', # 南银转债 (沪市可转债)
        '127061.SZ', # 美锦转债 (深市可转债)
        '000001.SZ'  # 平安银行 (股票)
    ]
    
    print("原始列表:", mixed_list)
    
    # 2. 筛选 ETF 基金
    etf_list = filter_etf(mixed_list)
    print("筛选出的 ETF 列表:", etf_list)
    
    # 3. 筛选 可转债
    convertible_bond_list = filter_convertible_bonds(mixed_list)
    print("筛选出的 可转债 列表:", convertible_bond_list)


def filter_etf(stock_list):
    """
    从列表中筛选出所有 ETF 基金
    """
    result = []
    # ETF 的统一类别标号为 100013 (包含沪深两市)
    etf_type_id = 100013
    
    for code_str in stock_list:
        # 解析代码,例如 '510300.SH' -> code='510300', market='SH'
        code, market = code_str.split('.')
        
        # 判断是否为 ETF
        if is_typed_stock(etf_type_id, market, code):
            result.append(code_str)
            
    return result


def filter_convertible_bonds(stock_list):
    """
    从列表中筛选出所有可转债 (沪市 + 深市)
    """
    result = []
    # 沪市可转债标号: 135
    # 深市可转债标号: 10019
    cb_type_ids = [135, 10019]
    
    for code_str in stock_list:
        # 解析代码
        code, market = code_str.split('.')
        
        is_cb = False
        # 遍历可转债的类型ID进行匹配
        for type_id in cb_type_ids:
            if is_typed_stock(type_id, market, code):
                is_cb = True
                break
        
        if is_cb:
            result.append(code_str)
            
    return result

def handlebar(ContextInfo):
    # 本示例主要演示筛选逻辑,handlebar 中无需执行
    pass

代码解析

  1. 代码分割:QMT 的证券代码通常格式为 code.market(如 600000.SH)。但是 is_typed_stock 函数要求将 market(SH)和 code(600000)分开传入,因此代码中使用了 code_str.split('.') 进行分割。
  2. ETF 筛选:直接使用扩展类型 100013,它同时涵盖了沪市和深市的 ETF,无需分别判断。
  3. 可转债筛选:由于没有单一的“全市场可转债”代码,我们需要同时检查沪市可转债(135)和深市可转债(10019)。只要满足其中任意一个条件,即被认定为可转债。

常见问题 Q&A

Q: is_typed_stock 函数在回测和实盘中都能用吗?
A: 是的,该函数在回测和实盘模式下均可使用,它依赖于 QMT 基础数据文件。

Q: 如果我想筛选“股票”(剔除基金和债券),应该用什么标号?
A: 可以使用标号 100012(广义的股票,不含指数)或 100003(沪深狭义股票,即 A 股 + B 股)。

Q: 为什么我的 is_typed_stock 返回全是 0?
A: 请检查传入的参数格式。market 必须是 'SH' 或 'SZ',stockcode 必须是纯数字字符串(如 '600000'),不能带后缀。另外,请确保在 QMT 客户端的“数据管理”中下载了基础数据。