🚀 AI 一键生成 qmt 策略代码

QMT平台使用ext_data()获取指标因子数据返回nan怎么办?

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

问题描述

ext_data() 获取指标因子的数据时,返回是nan?

在学习 QMT.,引用指标时:
def init(ContextInfo):
print(ext_data('CR', '600000.SH', 0, ContextInfo))
返回的任何指标都是: nan
不知道什么原因

解决方案

在 QMT 平台中使用 ext_data() 函数获取指标数据时返回 nan,通常是因为调用该函数的生命周期位置不正确

问题原因分析

在您的代码中,您将 ext_data() 放在了 init(ContextInfo) 函数中:

def init(ContextInfo):
    print(ext_data('CR', '600000.SH', 0, ContextInfo))

init 是策略的初始化函数,在整个策略加载时只运行一次。此时,策略还没有开始逐 K 线运行,系统尚未加载具体的 K 线上下文数据(即 ContextInfo.barpos 等状态尚未就绪)。因此,在这个阶段去获取依赖于 K 线位置的指标数据,系统无法返回有效值,只能返回 nan(Not a Number)。

正确的解决方法

获取行情数据或指标数据,应该放在 handlebar(ContextInfo) 函数中。handlebar 是行情事件驱动函数,每根 K 线(或每个 tick)都会运行一次,此时上下文环境已经准备好,可以正确获取到当前 K 线对应的指标数值。

正确的代码示例:

#coding:gbk

def init(ContextInfo):
    # init 中通常用于初始化股票池、设置账号、参数等
    ContextInfo.set_universe(['600000.SH'])
    print("策略初始化完成")

def handlebar(ContextInfo):
    # 在 handlebar 中获取指标数据
    # 获取当前主图代码的 CR 指标,0 表示不偏移(当前 K 线)
    cr_value = ext_data('CR', '600000.SH', 0, ContextInfo)
    
    # 打印当前 K 线的索引和对应的指标值
    print(f"当前Bar索引: {ContextInfo.barpos}, CR指标值: {cr_value}")

其他可能导致返回 nan 的注意事项

如果将代码移到 handlebar 后仍然返回 nan,请检查以下几点:

  1. 本地数据是否完整:QMT 的指标计算依赖于本地历史数据。请确保您已经在 QMT 客户端的【数据管理】中下载了 600000.SH 对应周期的历史 K 线数据。
  2. 指标名称是否正确:确保引用的指标名称(如 'CR')在 QMT 系统的公式管理器中真实存在,且拼写完全一致。
  3. K 线数量是否足够:某些指标(如均线、CR等)需要一定数量的历史 K 线才能计算出有效值。如果当前运行到的 K 线位置(barpos)太靠前,历史数据不足以计算该指标,也会返回 nan。随着 barpos 的增加,指标值会逐渐正常。
  4. 停牌数据:如果该股票在当前 K 线时间点处于停牌状态,且未设置停牌填充,也可能获取不到有效数据。