问题描述
解决方案
在聚宽(JoinQuant)的回测或模拟交易中,要在盘中获取某只股票当天的开盘价和停牌状态,最直接且推荐的方法是使用 get_current_data() 函数。
该函数返回一个字典(dict),其中包含指定标的在当前单位时间(天或分钟)的快照数据。
核心代码实现
def handle_data(context, data):
# 获取当前单位时间的数据对象
current_data = get_current_data()
# 设定要查询的股票代码
security = '000001.XSHE'
# 1. 获取是否停牌 (返回 True 代表停牌,False 代表正常交易)
is_paused = current_data[security].paused
# 2. 获取今日开盘价
# 注意:在09:25集合竞价后到09:30之间可能获取到,但建议在09:30之后使用以确保数据准确
open_price = current_data[security].day_open
# 打印结果
print(f"股票: {security}")
print(f"是否停牌: {is_paused}")
print(f"今日开盘价: {open_price}")
# 示例逻辑:如果没有停牌且开盘价大于10元
if not is_paused and open_price > 10:
pass # 执行策略逻辑
详细说明
-
get_current_data():- 这是一个回测和模拟交易专用的 API。
- 它返回一个
dict,Key 是股票代码,Value 是一个对象,包含该股票当前的快照信息。 - 按需获取:为了提高回测速度,当你调用
get_current_data()时,它初始是空的。只有当你访问具体股票(如current_data['000001.XSHE'])时,系统才会去查询该股票的数据。
-
.paused属性:- 类型:
bool - 含义:如果股票停牌、未上市或已退市,返回
True;正常交易返回False。 - 重要:在下单前检查
.paused是一个良好的策略习惯,可以避免产生无效订单日志。
- 类型:
-
.day_open属性:- 类型:
float - 含义:当天的开盘价。
- 注意:如果在 09:30 之前调用(例如在
before_trading_start中),可能无法获取到开盘价(或者返回 NaN),因为集合竞价尚未结束或数据未推送。通常建议在handle_data或run_daily设置在 09:30 之后的函数中使用。
- 类型:
Q&A
Q: get_current_data() 和 attribute_history() 有什么区别?
A: get_current_data() 用于获取当前时刻的快照数据(如涨跌停价、是否停牌、今日开盘价),数据仅在当天有效。而 attribute_history() 用于获取过去一段时间的历史数据序列(如过去5天的收盘价)。
Q: 为什么我在 before_trading_start (09:00) 中获取 day_open 是空的?
A: 因为 A 股市场的集合竞价在 09:15-09:25 进行,09:00 时当天的开盘价尚未产生。day_open 通常在 09:25 集合竞价结束后,或者 09:30 正式开盘后才能准确获取。
Q: 如果股票停牌了,day_open 会返回什么?
A: 如果股票停牌,day_open 通常会返回停牌前最后一个交易日的收盘价,或者保持为 NaN,具体取决于停牌的类型和数据源的处理。因此,建议先判断 paused 属性,如果为 True,则不要依赖 day_open 进行交易决策。