问题描述
解决方案
在 QMT 中获取某个行业下的所有股票代码,主要有两种方式,取决于你具体需要获取的是 证监会行业(CSRC) 还是 申万行业(SW) 或其他自定义板块。
以下是两种主要方法的详细说明和代码示例。
方法一:获取证监会(CSRC)行业成分股
如果你需要获取证监会标准的行业分类(如“CSRC金融业”、“CSRC医药制造业”等),可以使用 ContextInfo.get_industry() 函数。
- 函数:
ContextInfo.get_industry(industry_name) - 参数:
industry_name(字符串),例如'CSRC金融业'。 - 返回: 包含股票代码的列表 (List)。
方法二:获取任意板块(包括申万行业、概念板块)成分股
如果你需要获取申万行业(如“银行”、“医药生物”)、概念板块或客户端左侧“板块”树中的任意自定义板块,应使用 ContextInfo.get_stock_list_in_sector() 函数。
- 函数:
ContextInfo.get_stock_list_in_sector(sector_name, realtime) - 参数:
sector_name(字符串):板块名称,需与 QMT 客户端左侧板块列表中的名称一致。realtime(数字,可选):毫秒级时间戳。如果不填,默认取最新成分股;如果在回测中需要获取历史某时刻的成分股,需传入对应时间戳。
- 返回: 包含股票代码的列表 (List)。
完整代码示例
以下代码展示了如何在策略初始化时获取这两种类型的行业股票列表,并打印出来。
# -*- coding: gbk -*-
def init(ContextInfo):
# 方法一:获取证监会(CSRC)行业成分股
# 行业名称必须严格匹配,例如 'CSRC金融业', 'CSRC房地产业' 等
csrc_industry_name = 'CSRC金融业'
csrc_stocks = ContextInfo.get_industry(csrc_industry_name)
print(f"========== {csrc_industry_name} 成分股 (前5个) ==========")
print(csrc_stocks[:5]) # 仅打印前5个作为示例
print(f"总数量: {len(csrc_stocks)}")
# 方法二:获取通用板块成分股 (如申万行业、概念板块)
# 名称需与QMT客户端左侧【板块】树中的名称一致
# 例如获取申万一级行业 '银行' 或概念 '锂电池'
sector_name = '银行'
# 获取当前最新的板块成分股
# 注意:get_stock_list_in_sector 第二个参数是时间戳,不传则取最新
sector_stocks = ContextInfo.get_stock_list_in_sector(sector_name)
print(f"\n========== {sector_name} 板块成分股 (前5个) ==========")
print(sector_stocks[:5]) # 仅打印前5个作为示例
print(f"总数量: {len(sector_stocks)}")
def handlebar(ContextInfo):
# 这是一个必须存在的函数,但在本例中不需要执行逻辑
pass
常见问题提示
-
行业名称去哪里找?
- CSRC行业:请参考 QMT API 文档附录中的“CSRC行业列表”。
- 申万/概念板块:直接在 QMT 客户端界面的左侧“板块”选项卡中查看,名称必须完全匹配(例如客户端显示“沪深300”,代码里就写“沪深300”)。
-
代码后缀格式
- 返回的股票代码格式通常为
code.market,例如600000.SH或000001.SZ。
- 返回的股票代码格式通常为
-
历史成分股
- 如果在回测模式下,使用
get_stock_list_in_sector时,建议传入ContextInfo.get_bar_timetag(ContextInfo.barpos)作为第二个参数,以确保获取的是回测当时那个时间点的成分股(防止幸存者偏差)。
- 如果在回测模式下,使用
Q&A
Q: 如何获取申万一级行业的具体名称列表?
A: QMT API 没有直接返回所有申万行业名称列表的函数。你需要查看 QMT 客户端左侧的板块树,或者手动维护一份申万行业名称列表(如 ['农林牧渔', '采掘', '化工', ...]),然后循环调用 get_stock_list_in_sector。
Q: get_industry 和 get_stock_list_in_sector 有什么区别?
A: get_industry 是专门针对证监会(CSRC)行业分类的旧接口;get_stock_list_in_sector 是更通用的接口,支持所有在客户端可见的板块(包括指数成分、行业、概念、地区等)。建议优先使用 get_stock_list_in_sector。
Q: 为什么我输入的板块名称返回空列表?
A: 请检查名称是否与客户端完全一致(包括繁简字、空格)。另外,确保你的 QMT 客户端已经下载了完整的板块数据(通常在“数据管理”中补充)。