🚀 AI 一键生成 joinquant 策略代码
立即体验
👉 AI 生成代码 👈

JoinQuant聚宽API:准确获取最新已走完的分钟K线数据指南

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

问题描述

get_price如何准确获得最近K的数据?

用get_price获取分钟数据时,由于每3秒刷新一次,当前最后的分钟K数据应该在动态变化,那么,我如何确定当前k已经走完了,以便及时获得最近分钟K的数据?因为我本地计算机和服务器时钟可能不同步,发出请求命令的时间和服务器时间不一致,而且也可能出现某个时间段交易量为0的情况,次时k数据不变的情况。

解决方案

在JoinQuant(聚宽)量化平台中,要准确获取最新且已经走完的分钟K线数据,解决本地时钟不同步、数据动态刷新以及零成交量的问题,最核心的原则是依赖平台的事件驱动机制(逻辑时间),而不是依赖本地计算机的物理时钟进行轮询。\n\n以下是具体的解决方案和最佳实践:\n\n### 1. 依赖事件驱动机制(推荐)\n\n聚宽的策略引擎是基于事件驱动的。在分钟频率的策略中,handle_data 或通过 run_daily(..., time='every_bar') 注册的函数,会在每分钟的第一秒被触发(例如 09:31:00)。\n\n当函数被触发时,平台传入的 context.current_dt 就是服务器的逻辑时间。此时,上一分钟(09:30:00 - 09:30:59)的K线已经完全走完并固定。\n\n代码示例:\npython\ndef initialize(context):\n g.security = '000001.XSHE'\n # 按分钟运行\n run_daily(market_open, time='every_bar')\n\ndef market_open(context):\n # 此时 context.current_dt 比如是 09:31:00\n # 使用 history 获取过去1分钟的数据,默认不包含当前正在生成的未走完的K线\n df = history(count=1, unit='1m', field='close', security_list=[g.security])\n \n # 或者使用 get_price,将 end_date 设置为 context.current_dt\n # get_price 在分钟频率下,end_date 只有日期和时分,不包含当前未走完的分钟\n df_price = get_price(g.security, count=1, end_date=context.current_dt, frequency='1m')\n \n log.info('已走完的最新分钟K线收盘价:', df_price['close'][-1])\n\n\n### 2. 使用 get_bars 函数并设置 include_now=False\n\n如果你在某些特定场景下必须主动拉取数据,聚宽提供了一个非常适合此场景的API:get_bars。\n\nget_bars 有一个参数 include_now。将其设置为 False 时,平台会严格返回截止到当前逻辑时间之前,已经完全走完的Bar,自动剔除当前正在动态变化的那个Bar。\n\n代码示例:\npython\ndef handle_data(context, data):\n # include_now=False 确保不包含当前正在跳动的分钟K线\n bars = get_bars(g.security, count=1, unit='1m', fields=['date', 'close', 'volume'], include_now=False)\n if len(bars) > 0:\n last_completed_bar = bars[0]\n log.info(f'最新走完的K线时间: {last_completed_bar["date"]}, 收盘价: {last_completed_bar["close"]}')\n\n\n### 3. 关于零成交量和时钟不同步的解答\n\n* 时钟不同步问题:在聚宽的模拟盘或回测中,你永远不应该使用 Python 原生的 datetime.datetime.now() 来判断行情时间。必须使用 context.current_dtcontext.current_dt 是交易所/服务器的统一逻辑时间,它保证了你获取数据的时间基准与服务器完全一致,彻底消除了本地时钟误差。\n* 零成交量问题:如果某分钟内没有任何成交,聚宽的数据底层会自动处理。对于 get_priceget_bars,如果没有成交,该分钟的 K 线依然会生成(通常开、高、低、收都等于上一分钟的收盘价,成交量 volume 为 0)。只要你使用 historyget_bars(include_now=False),即使成交量为0,你也能准时拿到这根走完的K线,不需要通过判断数据是否变化来确认K线是否结束。\n\n### 总结\n放弃本地轮询的思路,拥抱量化平台的事件驱动框架。在 handle_dataevery_bar 定时函数中,直接调用 get_bars(..., include_now=False)history(...),即可100%安全、准确地获取最新已走完的分钟K线数据。