如何条件选择板块或者概念
能否通过编程直接选出当天振幅最大的板块或者概念?
问题描述
解决方案
在 JoinQuant (聚宽) 平台上,目前官方 API 并没有直接提供行业板块或概念板块的整体行情数据(如板块的开高低收价格)。官方文档中明确指出:“目前没有概念板块的行情数据;目前不支持行业的行情数据”。
但是,我们可以通过编程间接实现这一需求。核心思路是:获取板块内的所有成分股 -> 计算每只成分股的振幅 -> 求平均值作为该板块的整体振幅 -> 排序选出最大者。
实现步骤与核心 API
- 获取所有板块/概念列表:使用
get_industries()或get_concepts()。 - 获取板块成分股:使用
get_industry_stocks()或get_concept_stocks()。 - 获取成分股行情数据:使用
get_price()获取high(最高价)、low(最低价)和pre_close(昨收价)。 - 计算振幅:单只股票振幅 =
(high - low) / pre_close。 - 聚合与排序:计算板块内所有股票振幅的平均值,并进行降序排序。
Python 源码示例(研究环境适用)
以下代码展示了如何选出指定日期当天平均振幅最大的概念板块:
from jqdata import *
import pandas as pd
def get_top_amplitude_concept(target_date):
"""
获取指定日期平均振幅最大的概念板块
"""
# 1. 获取所有概念板块列表
concepts = get_concepts()
concept_amplitudes = {}
print(f"开始计算 {target_date} 的板块振幅,共有 {len(concepts)} 个概念板块...")
# 2. 遍历所有概念板块
for concept_code in concepts.index:
# 获取该概念板块的成分股
stocks = get_concept_stocks(concept_code, date=target_date)
if not stocks:
continue
# 3. 获取成分股当天的行情数据
# 注意:panel=False 返回 DataFrame 格式,便于处理
df = get_price(stocks, end_date=target_date, count=1,
fields=['high', 'low', 'pre_close'], panel=False)
if df.empty:
continue
# 4. 计算单只股票的振幅
# 振幅公式 = (最高价 - 最低价) / 昨收价
df['amplitude'] = (df['high'] - df['low']) / df['pre_close']
# 5. 计算该板块的平均振幅(排除停牌或无数据的 NaN 值)
avg_amplitude = df['amplitude'].mean()
concept_amplitudes[concept_code] = avg_amplitude
# 6. 对所有板块的振幅进行降序排序
if concept_amplitudes:
sorted_concepts = sorted(concept_amplitudes.items(), key=lambda x: x[1], reverse=True)
# 获取振幅最大的板块信息
top_concept_code = sorted_concepts[0][0]
top_concept_name = concepts.loc[top_concept_code, 'name']
top_amplitude = sorted_concepts[0][1]
print("\n=== 计算完成 ===")
print(f"振幅最大的概念板块是: 【{top_concept_name}】 (代码: {top_concept_code})")
print(f"该板块平均振幅为: {top_amplitude:.2%}")
# 打印前5名作为参考
print("\n--- 振幅前5名概念板块 ---")
for i in range(min(5, len(sorted_concepts))):
code = sorted_concepts[i][0]
name = concepts.loc[code, 'name']
amp = sorted_concepts[i][1]
print(f"Top {i+1}: {name} ({code}) - 振幅: {amp:.2%}")
return top_concept_code
else:
print("未获取到有效数据")
return None
# 测试运行(请在研究环境中运行,日期需为交易日)
# target_date = '2023-10-10'
# get_top_amplitude_concept(target_date)
注意事项与优化建议
- 性能优化:上述代码在遍历所有板块时,会多次调用
get_price。为了提高运行速度,可以先用get_all_securities('stock')获取全市场股票,一次性调用get_price获取全市场股票的high,low,pre_close,然后再根据get_concept_stocks的列表去本地字典或 DataFrame 中做映射计算,这样能大幅减少 API 请求次数。 - 停牌与涨跌停处理:在实际策略中,可能需要过滤掉当天停牌的股票(
paused=True)或一字涨跌停的股票,以反映真实的板块活跃度。 - 加权方式:上述代码使用的是等权重平均(即板块内每只股票权重相同)。如果你希望更贴近真实指数,可以获取股票的流通市值(
circulating_market_cap),采用市值加权平均来计算板块振幅。