🚀 AI 一键生成 joinquant 策略代码
立即体验

joinquant 平台如何利用 get_current_data 动态过滤停牌与 ST 股?(附 Python 源码)

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

问题描述

请根据以下 SEO 主题生成完整页面内容:

Title: joinquant 选股技巧:利用 get_current_data 动态过滤停牌与 ST 股

Question: 如何使用 get_current_data 获取最新涨跌停价并过滤掉停牌和 ST 股票?

解决方案

在聚宽(JoinQuant)量化交易平台编写策略时,过滤停牌股和 ST 股是实盘与回测中非常关键的步骤。如果对停牌股票或 ST 股票下单,会导致委托失败或产生非预期的交易风险。此外,实时获取涨跌停价可以帮助我们避免在涨停时买入或跌停时卖出。

聚宽提供了 get_current_data() 接口,专门用于获取当前单位时间(当天/当前分钟)的最新盘面快照数据。以下是具体的使用方法和完整的策略代码示例。

一、get_current_data() 核心属性介绍

调用 current_data = get_current_data() 后,可以通过 current_data[security] 获取单个标的的以下属性:

  • paused: 是否停止或暂停了交易。当停牌、未上市或退市后返回 True,正常交易返回 False
  • is_st: 是否是 ST 股(包括 ST, *ST)。是则返回 True,否则返回 False
  • high_limit: 当天的涨停价。
  • low_limit: 当天的跌停价。
  • last_price: 最新价(09:30 之前获取返回昨日收盘价)。
  • day_open: 当天开盘价(通常在 09:27 之后可获取)。

注意:为了提高运行速度,get_current_data() 返回的字典数据是按需获取的。初始时字典为空,只有在通过 current_data[security] 访问特定股票时,系统才会实时获取该股票的数据。


二、Python 策略源码示例

以下是一个简单但完整的聚宽策略,展示了如何在每日开盘时,利用 get_current_data 动态过滤股票池中的停牌股与 ST 股,并获取其涨跌停价格。

# 导入聚宽函数库
import jqdata

def initialize(context):
    # 设定沪深300作为基准
    set_benchmark('000300.XSHG')
    # 开启动态复权模式(真实价格)
    set_option('use_real_price', True)
    
    # 定义初始股票池(例如:部分沪深300成分股)
    g.security_list = ['000001.XSHE', '000002.XSHE', '600000.XSHG', '000018.XSHE']
    
    # 设定每天 09:30 运行交易逻辑
    run_daily(market_open, time='09:30')

def market_open(context):
    # 1. 获取当前时间的数据快照
    current_data = get_current_data()
    
    # 存储过滤后的安全股票池
    active_stocks = []
    
    log.info("--- 开始今日股票状态筛查 ---")
    
    for next_stock in g.security_list:
        # 获取该股票的实时盘面数据
        stock_info = current_data[next_stock]
        
        # 2. 过滤停牌与 ST 股
        if stock_info.paused:
            log.info("股票 %s 处于停牌状态,已过滤。" % next_stock)
            continue
        if stock_info.is_st:
            log.info("股票 %s 是 ST/ *ST 股,已过滤。" % next_stock)
            continue
            
        # 3. 获取最新价及涨跌停价
        last_price = stock_info.last_price
        high_limit = stock_info.high_limit
        low_limit = stock_info.low_limit
        
        log.info("股票 %s 状态正常 | 最新价: %.2f | 涨停价: %.2f | 跌停价: %.2f" % 
                 (next_stock, last_price, high_limit, low_limit))
        
        # 4. 避免在涨停时追买(示例逻辑)
        if last_price >= high_limit:
            log.warn("股票 %s 已涨停,今日暂不买入。" % next_stock)
            continue
            
        active_stocks.append(next_stock)
        
    log.info("今日可交易股票池: %s" % active_stocks)
    
    # 5. 执行买入逻辑(示例:对安全股票池中的第一只股票下单买入 100 股)
    if active_stocks:
        target_stock = active_stocks[0]
        if target_stock not in context.portfolio.positions:
            order(target_stock, 100)
            log.info("成功发送买入委托: %s, 100股" % target_stock)

三、量化交易避坑指南

  1. 不要跨日期缓存结果get_current_data() 返回的对象和数据只在当天有效。请勿将其存入全局变量 g 中跨日使用,否则会导致获取到过期的价格或状态信息。
  2. 仅在交易时段调用:该函数仅限在要获取数据的标的处于交易时段时调用。在非交易时段(如深夜或周末)调用可能会获取到空值或异常数据。
  3. 配合 use_real_price 使用:强烈建议在 initialize 中开启真实价格模式 set_option('use_real_price', True),这样 last_pricehigh_limit 等返回的才是与真实市场一致的不复权价格,方便直接用于下单委托。