🚀 AI 一键生成 joinquant 策略代码

JoinQuant 聚宽量化平台:编程筛选当日振幅最大板块与概念指南

joinquant | 发布时间: 2026/5/25
以下内容由 EasyQuant 生成。

问题描述

如何条件选择板块或者概念

能否通过编程直接选出当天振幅最大的板块或者概念?

解决方案

在 JoinQuant (聚宽) 平台上,目前官方 API 并没有直接提供行业板块或概念板块的整体行情数据(如板块的开高低收价格)。官方文档中明确指出:“目前没有概念板块的行情数据;目前不支持行业的行情数据”。

但是,我们可以通过编程间接实现这一需求。核心思路是:获取板块内的所有成分股 -> 计算每只成分股的振幅 -> 求平均值作为该板块的整体振幅 -> 排序选出最大者

实现步骤与核心 API

  1. 获取所有板块/概念列表:使用 get_industries()get_concepts()
  2. 获取板块成分股:使用 get_industry_stocks()get_concept_stocks()
  3. 获取成分股行情数据:使用 get_price() 获取 high(最高价)、low(最低价)和 pre_close(昨收价)。
  4. 计算振幅:单只股票振幅 = (high - low) / pre_close
  5. 聚合与排序:计算板块内所有股票振幅的平均值,并进行降序排序。

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)

注意事项与优化建议

  1. 性能优化:上述代码在遍历所有板块时,会多次调用 get_price。为了提高运行速度,可以先用 get_all_securities('stock') 获取全市场股票,一次性调用 get_price 获取全市场股票的 high, low, pre_close,然后再根据 get_concept_stocks 的列表去本地字典或 DataFrame 中做映射计算,这样能大幅减少 API 请求次数。
  2. 停牌与涨跌停处理:在实际策略中,可能需要过滤掉当天停牌的股票(paused=True)或一字涨跌停的股票,以反映真实的板块活跃度。
  3. 加权方式:上述代码使用的是等权重平均(即板块内每只股票权重相同)。如果你希望更贴近真实指数,可以获取股票的流通市值(circulating_market_cap),采用市值加权平均来计算板块振幅。