问题描述
解决方案
在 JoinQuant(聚宽)平台中,获取某个概念板块(如“锂电池”)的所有股票代码,主要分为两步:
- 查找概念代码:使用
get_concepts()获取所有概念板块列表,找到“锂电池”对应的代码(通常以GN开头)。 - 获取成分股:使用
get_concept_stocks(concept_code)获取该板块下的股票列表。
以下是具体的代码实现示例:
代码实现
# -*- coding: utf-8 -*-
from jqdata import *
def get_stocks_by_concept_name(name_keyword):
"""
根据概念名称关键字获取股票列表
"""
# 1. 获取所有概念板块信息
# 返回一个 DataFrame,索引(index)是概念代码,name列是概念名称
all_concepts = get_concepts()
# 2. 查找包含关键字(如'锂电池')的概念
# 使用 str.contains 进行模糊匹配,防止名称有细微差别
target_concepts = all_concepts[all_concepts['name'].str.contains(name_keyword)]
if target_concepts.empty:
print(f"未找到包含 '{name_keyword}' 的概念板块。")
return []
print(f"找到相关概念板块信息:\n{target_concepts}")
# 3. 获取第一个匹配项的股票代码(通常会有多个相关概念,这里取第一个作为示例)
# 实际使用中,建议根据打印出的 target_concepts 确认你需要具体的 concept_code
concept_code = target_concepts.index[0]
concept_name = target_concepts.iloc[0]['name']
print(f"\n正在获取板块【{concept_name} ({concept_code})】的成分股...")
# 4. 获取该板块下的所有股票代码
# date参数默认为None,表示获取当前日期的成分股;回测中会自动跟随回测日期
stock_list = get_concept_stocks(concept_code, date=None)
return stock_list
# --- 调用示例 ---
# 查找“锂电池”相关的股票
lithium_stocks = get_stocks_by_concept_name('锂电池')
print(f"\n获取到的股票数量: {len(lithium_stocks)}")
print(f"前10只股票代码: {lithium_stocks[:10]}")
关键函数说明
-
get_concepts()- 功能:获取所有概念板块的列表。
- 返回值:
pandas.DataFrame,其中index是概念代码(如GN038),name列是概念名称。
-
get_concept_stocks(concept_code, date=None)- 功能:获取指定概念板块的成分股。
- 参数:
concept_code:概念板块代码(字符串),例如'GN038'。date:查询日期。默认为None。在研究中默认为今天;在回测中默认为回测当天的日期(避免未来函数)。
- 返回值:包含股票代码的
list。
常见问题 (Q&A)
Q: 为什么我直接输入中文名称无法获取股票?
A: get_concept_stocks 函数只接受概念代码(如 'GNxxx')作为参数,不接受中文名称。因此必须先通过 get_concepts() 找到中文名称对应的代码。
Q: 如何查看某个股票属于哪些概念板块?
A: 可以使用 get_concept(security, date=None) 函数。例如 get_concept('000001.XSHE') 会返回平安银行所属的所有概念板块代码和名称。
Q: 获取的数据是实时的吗?
A: 在回测环境中,数据会根据回测时间动态变化(例如某只股票在2018年才被纳入锂电池板块,在2017年的回测中就不会包含它),这有效避免了未来函数。在研究环境中,默认获取的是最新数据。