3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在聚宽(JoinQuant)量化交易平台编写策略时,过滤停牌股和 ST 股是实盘与回测中非常关键的步骤。如果对停牌股票或 ST 股票下单,会导致委托失败或产生非预期的交易风险。此外,实时获取涨跌停价可以帮助我们避免在涨停时买入或跌停时卖出。
聚宽提供了 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]访问特定股票时,系统才会实时获取该股票的数据。
以下是一个简单但完整的聚宽策略,展示了如何在每日开盘时,利用 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)
get_current_data() 返回的对象和数据只在当天有效。请勿将其存入全局变量 g 中跨日使用,否则会导致获取到过期的价格或状态信息。use_real_price 使用:强烈建议在 initialize 中开启真实价格模式 set_option('use_real_price', True),这样 last_price、high_limit 等返回的才是与真实市场一致的不复权价格,方便直接用于下单委托。