问题描述
请问jqdata中的技术分析指标数据在研究环境下是延时一天对吧?如果在策略/模拟实盘环境下是否可实时获取呢?
解决方案
您好!关于 jqdata 中技术分析指标(如 jqlib.technical_analysis 库中的指标)的时效性问题,具体解答如下:
1. 研究环境下的时效性
是的,研究环境下获取的日线级别技术分析指标通常是延时一天的(截至前一个交易日)。
原因在于,日线级别的基础行情数据(开、高、低、收、量)需要在当天交易结束后(通常在收盘后进行数据清洗和复权处理)才会生成并更新。因此,在研究环境中调用技术指标函数时,如果查询日期是今天,底层通常只能取到昨天的完整日线数据,计算出的指标也是截至昨天的。
2. 策略/模拟实盘环境下的时效性
在策略或模拟实盘环境中,直接调用 jqlib.technical_analysis 库中的函数,默认也是无法获取“包含当天盘中实时价格”的日线指标的。
在回测和模拟实盘中,为了避免未来函数,系统提供的日线数据(如通过 history(..., '1d') 获取)是不包含当天的。因此,封装好的技术指标函数计算出来的依然是截至昨天的结果。
3. 如何在策略/模拟实盘中获取“实时”的技术指标?
如果您希望在盘中(例如上午 10:30)根据昨天的历史数据 + 今天的实时最新价来计算实时的日线技术指标(如实时的 MACD、均线等),您需要自己拼接数据并计算。通常推荐使用 talib 库来实现。
解决方案步骤:
- 获取过去 N 天的历史日线数据。
- 获取当天的实时价格(通过
get_current_data()或分钟级数据)。 - 将实时价格追加到历史数据序列的末尾。
- 使用
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自行计算,即可实现真正的盘中实时技术指标监控。