问题描述
解决方案
在 JoinQuant 聚宽平台中,获取股票当日的涨停价和停牌状态,最常用且推荐的方法是使用回测环境专用 API get_current_data()。
该函数返回一个字典对象,包含了指定标的在当前单位时间(天/分钟)的快照数据。
核心代码实现
以下是一个完整的策略示例,展示了如何在每日开盘时获取指定股票的涨停价和停牌状态:
# -*- coding: utf-8 -*-
def initialize(context):
# 设定要查询的股票,例如:平安银行
g.security = '000001.XSHE'
# 每天开盘时运行
run_daily(check_stock_status, '09:30')
def check_stock_status(context):
# 获取当前单位时间的数据对象
# 注意:get_current_data() 返回的是一个 dict,key 是股票代码
current_data = get_current_data()
# 获取指定股票的数据对象
security_data = current_data[g.security]
# 1. 获取涨停价 (high_limit)
limit_up_price = security_data.high_limit
# 2. 获取停牌状态 (paused)
# 返回 True 表示停牌,False 表示正常交易
is_paused = security_data.paused
# 打印结果
log.info("股票代码: %s" % g.security)
log.info("今日涨停价: %s" % limit_up_price)
log.info("是否停牌: %s" % is_paused)
# 示例逻辑:如果未停牌且当前价格等于涨停价,则打印提示
if not is_paused and security_data.last_price >= limit_up_price:
log.info("注意:该股票当前已封涨停!")
关键属性说明
通过 get_current_data()[security] 获取到的对象包含以下关键属性:
-
high_limit:- 含义: 当日的涨停价。
- 类型: float。
- 注意: 跌停价可以通过
low_limit获取。
-
paused:- 含义: 股票是否停止或者暂停了交易(包括停牌、未上市或退市)。
- 类型: bool (True/False)。
- 逻辑: 如果返回
True,则表示该股票当前无法交易。
注意事项
- 调用场景:
get_current_data()仅限在回测和模拟交易的策略代码中使用(如handle_data、run_daily等函数内),不支持在研究环境(Notebook)中直接调用。 - 数据获取机制: 为了提高回测速度,
get_current_data()返回的字典是按需获取的。只有当你访问具体股票代码(如current_data['000001.XSHE'])时,系统才会去查询该股票的数据。 - 有效性: 返回的数据仅在当天有效,请勿跨日期缓存使用。
Q&A
Q: get_current_data() 能在研究环境(Notebook)中使用吗?
A: 不能。get_current_data() 是回测和模拟交易专用的 API。在研究环境中,如果需要查询历史停牌状态,可以使用 get_price 并检查成交量是否为 0,或者使用 get_extras 查询 is_st 等状态,但获取准确的历史涨跌停价建议使用 get_price 获取 high_limit 字段(需注意 get_price 的 fields 参数支持 high_limit)。
Q: 如果股票今天停牌,high_limit 会返回什么?
A: 即使股票停牌,high_limit 通常依然会返回一个数值(通常基于前一交易日收盘价计算),但此时 paused 属性为 True,且无法进行买卖操作。
Q: 如何获取跌停价?
A: 使用 low_limit 属性,例如 current_data['000001.XSHE'].low_limit。