🚀 AI 一键生成 joinquant 策略代码

如何在JoinQuant盘中获取股票分时详细数据(High/Low/Open/Volume)进行选股?

joinquant | 发布时间: 2026/5/25
以下内容由 EasyQuant 生成。

问题描述

咨询下:如何在盘中获取股票的分时详细数据

我想在盘中选股,根据每分钟high,low、open、volume、money等分时数据来选择股票,请问该如何实现?

解决方案

在JoinQuant(聚宽)平台上,想要在盘中获取股票的分钟级分时详细数据(如 open, high, low, close, volume, money)来进行动态选股,最推荐的方法是使用 get_barsget_price 函数。这两个函数都支持获取分钟级别的数据。

以下是具体的实现方法和代码示例:

方法一:使用 get_bars 函数(推荐)

get_bars 函数获取速度快,且支持 include_now=True 参数,这意味着你可以获取到当前正在交易、尚未结束的这一分钟的快照数据,非常适合盘中实时选股。

核心参数说明:

  • security: 标的代码或代码列表(如 ['000001.XSHE', '000002.XSHE'])。
  • count: 获取的分钟Bar数量。
  • unit: 时间单位,设为 '1m' 表示1分钟线。
  • fields: 需要获取的字段,如 ['date', 'open', 'high', 'low', 'close', 'volume', 'money']
  • include_now: 设为 True,包含当前时刻所在的分钟Bar。

方法二:使用 get_price 函数

get_price 是最常用的历史数据获取函数,将 frequency 设置为 '1m' 即可获取分钟数据。

完整策略示例代码

下面是一个完整的策略框架示例,演示如何在盘中每分钟获取指定股票池的分时数据,并根据自定义的逻辑进行选股:

# 导入聚宽函数库
import jqdata

def initialize(context):
    # 设定沪深300作为基准
    set_benchmark('000300.XSHG')
    # 开启动态复权模式(真实价格)
    set_option('use_real_price', True)
    
    # 设定我们要监控的股票池(例如:平安银行、万科A)
    g.watch_list = ['000001.XSHE', '000002.XSHE', '000004.XSHE']
    
    # 盘中每分钟运行一次选股逻辑
    run_daily(intraday_stock_selection, time='every_bar')

def intraday_stock_selection(context):
    # 获取当前时间
    current_time = context.current_dt
    
    # 使用 get_bars 获取股票池中所有股票最近 1 分钟的数据
    # include_now=True 表示包含当前这一分钟的实时快照数据
    bars_dict = get_bars(g.watch_list, count=1, unit='1m', 
                         fields=['date', 'open', 'high', 'low', 'close', 'volume', 'money'],
                         include_now=True, df=True)
    
    # 遍历股票池,进行选股逻辑判断
    for stock in g.watch_list:
        # 获取该股票的 DataFrame 数据
        df = bars_dict[stock]
        if df.empty:
            continue
            
        # 提取最新一分钟的数据
        latest_bar = df.iloc[-1]
        
        minute_open = latest_bar['open']
        minute_high = latest_bar['high']
        minute_low = latest_bar['low']
        minute_close = latest_bar['close']
        minute_volume = latest_bar['volume']
        minute_money = latest_bar['money']
        
        # ==========================================
        # 在这里编写你的盘中选股逻辑
        # 例如:如果这一分钟内,最低价小于开盘价,且成交额大于100万,则打印并考虑买入
        # ==========================================
        if minute_low < minute_open and minute_money > 1000000:
            log.info(f"[{current_time}] 选中股票 {stock}!当前分钟开盘:{minute_open}, 最低:{minute_low}, 成交额:{minute_money}")
            
            # 如果账户中没有该股票,则买入100股作为示例
            if context.portfolio.positions[stock].closeable_amount == 0:
                order(stock, 100)
                log.info(f"买入 {stock} 100股")

注意事项

  1. 性能优化:如果你监控的股票池非常大(例如全市场3000多只股票),每分钟调用一次 get_bars 可能会导致运行超时(模拟盘限制每个函数运行不超过1800秒)。建议在 before_trading_start 中先通过基本面或日线技术指标筛选出一个较小的候选池(如50-100只),然后在盘中仅对这个小候选池请求分钟数据。
  2. 数据对齐get_bars 返回多只股票数据且 df=True 时,返回的是一个以股票代码为 key,DataFrame 为 value 的字典(或者 MultiIndex DataFrame,取决于具体版本和参数),请注意正确解析。
  3. 未来函数规避:在回测中,get_barsinclude_now=True 获取的是当前分钟结束时的状态。如果在实盘/模拟盘中,它获取的是当前秒的快照。请确保你的逻辑不会因为这种微小差异产生严重的“未来函数”偏差。