问题描述
解决方案
在 QMT 中,筛选特定类型的证券(如可转债或 ETF)主要使用内置函数 is_typed_stock。
该函数通过传入特定的类别标号(Type ID),判断某只证券是否属于该类别。
核心函数说明
is_typed_stock(stocktypenum, market, stockcode)
- stocktypenum (int): 证券类别标号(见下文代码中的注释)。
- market (str): 市场代码(如 'SH', 'SZ')。
- stockcode (str): 证券代码(注意: 这里仅指数字代码,不包含后缀,如 '600000')。
类别标号速查
根据 QMT API 文档附录:
- ETF 基金: 类别标号为
100013(包含沪市 ETF 和深市 ETF)。 - 可转债:
- 沪市可转债标号:
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
代码解析
- 代码分割:QMT 的证券代码通常格式为
code.market(如600000.SH)。但是is_typed_stock函数要求将market(SH)和code(600000)分开传入,因此代码中使用了code_str.split('.')进行分割。 - ETF 筛选:直接使用扩展类型
100013,它同时涵盖了沪市和深市的 ETF,无需分别判断。 - 可转债筛选:由于没有单一的“全市场可转债”代码,我们需要同时检查沪市可转债(
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 客户端的“数据管理”中下载了基础数据。