3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 JoinQuant (聚宽) 平台上,目前官方 API 并没有直接提供行业板块或概念板块的整体行情数据(如板块的开高低收价格)。官方文档中明确指出:“目前没有概念板块的行情数据;目前不支持行业的行情数据”。
但是,我们可以通过编程间接实现这一需求。核心思路是:获取板块内的所有成分股 -> 计算每只成分股的振幅 -> 求平均值作为该板块的整体振幅 -> 排序选出最大者。
get_industries() 或 get_concepts()。get_industry_stocks() 或 get_concept_stocks()。get_price() 获取 high(最高价)、low(最低价)和 pre_close(昨收价)。(high - low) / pre_close。以下代码展示了如何选出指定日期当天平均振幅最大的概念板块:
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),采用市值加权平均来计算板块振幅。