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

JoinQuant 聚宽技术分析指标(MACD/KDJ等)是延时一天的吗?如何在模拟实盘中获取实时指标?

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

问题描述

jqdata中的技术分析指标-时效问题

请问jqdata中的技术分析指标数据在研究环境下是延时一天对吧?如果在策略/模拟实盘环境下是否可实时获取呢?

解决方案

您好!关于 jqdata 中技术分析指标(如 jqlib.technical_analysis 库中的指标)的时效性问题,具体解答如下:

1. 研究环境下的时效性

是的,研究环境下获取的日线级别技术分析指标通常是延时一天的(截至前一个交易日)。
原因在于,日线级别的基础行情数据(开、高、低、收、量)需要在当天交易结束后(通常在收盘后进行数据清洗和复权处理)才会生成并更新。因此,在研究环境中调用技术指标函数时,如果查询日期是今天,底层通常只能取到昨天的完整日线数据,计算出的指标也是截至昨天的。

2. 策略/模拟实盘环境下的时效性

在策略或模拟实盘环境中,直接调用 jqlib.technical_analysis 库中的函数,默认也是无法获取“包含当天盘中实时价格”的日线指标的。

在回测和模拟实盘中,为了避免未来函数,系统提供的日线数据(如通过 history(..., '1d') 获取)是不包含当天的。因此,封装好的技术指标函数计算出来的依然是截至昨天的结果。

3. 如何在策略/模拟实盘中获取“实时”的技术指标?

如果您希望在盘中(例如上午 10:30)根据昨天的历史数据 + 今天的实时最新价来计算实时的日线技术指标(如实时的 MACD、均线等),您需要自己拼接数据并计算。通常推荐使用 talib 库来实现。

解决方案步骤:

  1. 获取过去 N 天的历史日线数据。
  2. 获取当天的实时价格(通过 get_current_data() 或分钟级数据)。
  3. 将实时价格追加到历史数据序列的末尾。
  4. 使用 talib 计算技术指标,取最后一个值即为实时指标。

代码示例(以计算实时的 5 日均线和 MACD 为例):

import jqdata
import talib
import numpy as np
import pandas as pd

def initialize(context):
    g.security = '000001.XSHE'
    # 每分钟运行一次
    run_daily(handle_bar, time='every_bar')

def handle_bar(context):
    security = g.security
    
    # 1. 获取过去 30 天的历史收盘价(不含今天)
    # 注意:为了计算 MACD,历史数据需要取得足够长(如 33 天以上)
    hist_data = attribute_history(security, 35, '1d', ['close'], df=False)
    hist_close = hist_data['close']
    
    # 2. 获取当天的实时最新价
    current_data = get_current_data()
    real_time_price = current_data[security].last_price
    
    # 3. 拼接数据:历史收盘价 + 实时最新价
    # 这样构成了一个包含盘中最新价格的“伪日线”序列
    real_time_close_array = np.append(hist_close, real_time_price)
    
    # 4. 使用 talib 计算实时技术指标
    # 计算实时的 5 日均线
    ma5_array = talib.SMA(real_time_close_array, timeperiod=5)
    real_time_ma5 = ma5_array[-1] # 取最后一个值
    
    # 计算实时的 MACD
    macd, macdsignal, macdhist = talib.MACD(real_time_close_array, fastperiod=12, slowperiod=26, signalperiod=9)
    real_time_macd = macd[-1]
    
    log.info(f"当前时间: {context.current_dt}, 最新价: {real_time_price}, 实时MA5: {real_time_ma5:.2f}, 实时MACD: {real_time_macd:.4f}")

总结

  • 官方封装的 jqlib.technical_analysis:基于已完结的日线计算,盘中调用只能得到昨天的结果。
  • 实时获取方案:在分钟级策略中,通过 attribute_history 获取历史数据,结合 get_current_data() 获取盘中最新价,拼接后使用 talib 自行计算,即可实现真正的盘中实时技术指标监控。