🚀 AI 一键生成 joinquant 策略代码

聚宽(JoinQuant)研究环境中如何替代get_current_data并过滤ST与停牌股票?

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

问题描述

get_current_data函数应用

在研究环境中能用get_current_data函数吗?
不能用用什么函数可以替代?
聚宽平台 在研究环境中如何过滤掉ST,停牌股票?

解决方案

一、 get_current_data 在研究环境中的适用性

在 JoinQuant(聚宽)平台上,get_current_data() 是回测环境和模拟交易专用的 API,不能在研究环境(Jupyter Notebook)中使用。

该函数的设计初衷是为了在回测/模拟的 handle_data 或定时运行函数中,快速获取当前逻辑时间(如当前分钟或当天)的快照数据(如涨跌停价、是否停牌、最新价等)。由于研究环境没有这种“当前逻辑时间”的上下文驱动,因此无法调用此函数。

二、 研究环境中的替代方案

在研究环境中,如果您需要获取类似 get_current_data() 提供的快照信息,可以使用以下函数作为替代:

  1. 获取最新价格、涨跌停价、是否停牌等行情信息
    使用 get_price()get_bars() 函数。通过指定 end_date 为您要查询的日期,并设置 count=1,即可获取该日期的截面数据。
    注:获取是否停牌,可以在 get_pricefields 参数中传入 'paused'(1表示停牌,0表示正常交易)。

  2. 获取是否为 ST 股票
    使用 get_extras() 函数。传入 info='is_st' 即可获取指定日期区间内股票是否为 ST(返回 True 表示是 ST,False 表示正常)。

三、 在研究环境中如何过滤 ST 和停牌股票(附代码)

结合上述替代方案,我们可以编写一个实用的函数,在研究环境中传入一个股票池和指定日期,自动剔除 ST 股票和停牌股票。

Python 实现代码

from jqdata import *
import pandas as pd

def filter_st_and_paused(stock_list, check_date):
    """
    在研究环境中过滤ST股票和停牌股票
    :param stock_list: list, 初始股票代码列表
    :param check_date: str, 查询日期,如 '2023-10-10'
    :return: list, 过滤后的股票代码列表
    """
    # 1. 过滤 ST 股票
    # 使用 get_extras 获取 is_st 字段
    st_data = get_extras('is_st', stock_list, start_date=check_date, end_date=check_date)
    if not st_data.empty:
        # st_data 的每一列是股票代码,值为 True/False
        st_series = st_data.iloc[0]
        # 筛选出值为 False 的股票(非ST)
        non_st_stocks = st_series[st_series == False].index.tolist()
    else:
        non_st_stocks = stock_list
        
    if not non_st_stocks:
        return []

    # 2. 过滤停牌股票
    # 使用 get_price 获取 paused 字段,panel=False 返回 DataFrame 格式
    price_data = get_price(non_st_stocks, 
                           end_date=check_date, 
                           frequency='daily', 
                           fields=['paused'], 
                           count=1, 
                           panel=False)
    
    # price_data 包含 'time', 'code', 'paused' 列
    # paused == 1 表示停牌,paused == 0 表示正常交易
    active_stocks = price_data[price_data['paused'] == 0]['code'].tolist()
    
    return active_stocks

# ================= 测试示例 =================
# 设定查询日期
query_date = '2023-10-10'

# 获取沪深300成分股作为初始股票池
hs300_stocks = get_index_stocks('000300.XSHG', date=query_date)

# 执行过滤
final_stock_pool = filter_st_and_paused(hs300_stocks, query_date)

print(f"初始沪深300股票数量: {len(hs300_stocks)}")
print(f"剔除ST和停牌后数量: {len(final_stock_pool)}")

代码原理解析:

  1. get_extras('is_st', ...):专门用于获取股票的 ST 状态,返回一个 DataFrame,我们提取当天的行,保留值为 False 的列索引(即非 ST 股票)。
  2. get_price(..., fields=['paused'], panel=False):获取非 ST 股票池的停牌状态。设置 panel=False 是为了兼容新版 Pandas,返回标准的 DataFrame,便于直接通过 price_data['paused'] == 0 进行布尔索引过滤,提取出正常交易的股票代码。