问题描述
在研究环境中能用get_current_data函数吗?
不能用用什么函数可以替代?
聚宽平台 在研究环境中如何过滤掉ST,停牌股票?
解决方案
一、 get_current_data 在研究环境中的适用性
在 JoinQuant(聚宽)平台上,get_current_data() 是回测环境和模拟交易专用的 API,不能在研究环境(Jupyter Notebook)中使用。
该函数的设计初衷是为了在回测/模拟的 handle_data 或定时运行函数中,快速获取当前逻辑时间(如当前分钟或当天)的快照数据(如涨跌停价、是否停牌、最新价等)。由于研究环境没有这种“当前逻辑时间”的上下文驱动,因此无法调用此函数。
二、 研究环境中的替代方案
在研究环境中,如果您需要获取类似 get_current_data() 提供的快照信息,可以使用以下函数作为替代:
-
获取最新价格、涨跌停价、是否停牌等行情信息:
使用get_price()或get_bars()函数。通过指定end_date为您要查询的日期,并设置count=1,即可获取该日期的截面数据。
注:获取是否停牌,可以在get_price的fields参数中传入'paused'(1表示停牌,0表示正常交易)。 -
获取是否为 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)}")
代码原理解析:
get_extras('is_st', ...):专门用于获取股票的 ST 状态,返回一个 DataFrame,我们提取当天的行,保留值为False的列索引(即非 ST 股票)。get_price(..., fields=['paused'], panel=False):获取非 ST 股票池的停牌状态。设置panel=False是为了兼容新版 Pandas,返回标准的 DataFrame,便于直接通过price_data['paused'] == 0进行布尔索引过滤,提取出正常交易的股票代码。