🚀 AI 一键生成 joinquant 策略代码

JoinQuant 策略中如何获取当天的开盘价、涨跌停价和停牌信息?

joinquant | 发布时间: 2025/11/26
以下内容由 EasyQuant 生成。

问题描述

在盘中如何获取某只股票今天的开盘价和是否停牌的信息?

解决方案

在聚宽(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 # 执行策略逻辑

详细说明

  1. get_current_data()

    • 这是一个回测和模拟交易专用的 API。
    • 它返回一个 dict,Key 是股票代码,Value 是一个对象,包含该股票当前的快照信息。
    • 按需获取:为了提高回测速度,当你调用 get_current_data() 时,它初始是空的。只有当你访问具体股票(如 current_data['000001.XSHE'])时,系统才会去查询该股票的数据。
  2. .paused 属性

    • 类型:bool
    • 含义:如果股票停牌、未上市或已退市,返回 True;正常交易返回 False
    • 重要:在下单前检查 .paused 是一个良好的策略习惯,可以避免产生无效订单日志。
  3. .day_open 属性

    • 类型:float
    • 含义:当天的开盘价。
    • 注意:如果在 09:30 之前调用(例如在 before_trading_start 中),可能无法获取到开盘价(或者返回 NaN),因为集合竞价尚未结束或数据未推送。通常建议在 handle_datarun_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 进行交易决策。