1

我正在尝试使用 zipline 进行回测,并使用 TA-lib 进行一些技术分析。我的数据集是巨大的(千兆位大小)。因为我希望我的数据可以在 zipline 中工作,所以我有很多数据一次作为所有值都为零,以便可以将公司数据读入 zipline(因为 zipline 要求您有一个交易日历您的策略交易的整个持续时间)。

错误信息:

_func.pxi in talib._ta_lib.MACD()

_func.pxi in talib._ta_lib.check_begidx1()

Exception: inputs are all NaN

我听说其他人在使用 TA-lib 时也遇到了这个错误,并且没有一个好的方法来修复它。我该如何解决这个问题?是否需要我为 MACD 创建自己的函数?

令人惊讶的是,像 TA-lib 这样大的库无法处理超过一定大小的数据集。

4

1 回答 1

2

如果我理解正确的话。计算指标时,需要一定的周期,例如,对于布林线,至少需要 20 周期。所以任何小于 20 的都是 NaN。所以你需要检查你的列表中的这些值。

import math
x = float('nan')
math.isnan(x)

return True or False
import numpy as np
values = [float('nan'), np.nan, 55, "string", lambda x : x]
for value in values:
   print(f"{repr(value):<8} : {is_nan(value)}")

以下是突出显示的 magdi 设置,这是计算周期所必需的。任何小于这个值的都是 NaN,当你尝试计算一些你没有任何输入的东西时,这就是你得到这个错误的原因。 这是交易所的一个例子。

def MACD(data, fastperiod, slowperiod, signalperiod):
    macd, macdsignal, macdhist = [], [], []

    fast_ema = EMA(data, fastperiod)
    slow_ema = EMA(data, slowperiod)

    diff = []

    for k, fast in enumerate(fast_ema):
        if math.isnan(fast) or math.isnan(slow_ema[k]):
           macd.append(math.nan)
           macdsignal.append(math.nan)
        else:
          macd.append(fast-slow_ema[k])
          diff.append(macd[k])

    diff_ema = EMA(diff, signalperiod)
    macdsignal = macdsignal + diff_ema

    for k, ms in enumerate(macdsignal):
        if math.isnan(ms) or math.isnan(macd[k]):
           macdhist.append(math.nan)
        else:
           macdhist.append(macd[k] - macdsignal[k])

    return macd, macdsignal, macdhist
macd, macdsignal, macdhist = MACD(closes, 12, 26, 9)

此函数计算 macd。如果您传递 100 个值的列表,则 macd - 12 值将是 nan,macdsignal - 26 将是 nan,macdhist - 9 将是 nan。

于 2021-02-07T07:11:58.490 回答