为什么计算ATR时Python中的TA-Lib返回nan?

问题描述

我试图使用TA-Lib来获取几个符号(BTCUSDT,ETHUSDT)的ATR,但结果都是“难”的,我不知道为什么。

这是示例数据的最小示例:

import talib
import numpy

highs = numpy.array([10697.12,10706.16,10744.75,10747.88,10745.42])
lows = numpy.array([10683.51,10694.72,10705.16,10728.22,10727.29])
closes = numpy.array([10696.47,10728.23,10742.46,10730.27])

print(talib.ATR(highs,lows,closes,timeperiod = 5))

输出

[nan nan nan nan nan nan nan nan nan nan nan nan nan nan]

解决方法

您的示例应该会导致类似的情况

(<TALibResult.OK: 0>,array([nan,nan,nan]))

如果您尝试timeperiod = 3,将会得到类似的信息

(<TALibResult.OK: 0>,23.56333333,21.75222222]))

因为ATR是time = period = N的滚动函数。根据TA-Lib python包装器的readme

通常,这些功能会将初始“回溯”时间段(生成输出之前所需的观察次数)设置为NaN。

从技术上讲,NaN的计数(回溯期)取决于您传递给滚动均值指标的可选参数(或其中使用的默认值)。但这可能不等于它。例如,在滚动装置的情况下,滚动装置指示器。如果您不希望仅从结果数组的开头跳过NaN,但知道要跳过的确切数据数,则可以获取此值。我想可以在python中通过Ta-Lib的Abstract API和函数对象的lookback属性来实现。