在TA-Lib计算RSI和 SMA时出错

后端开发 2026-07-09

执行代码时出现错误。def indicators(df, N) 函数未被执行。这是一段代码片段,我在尝试复现来自YouTube作者的做法。我得到如下错误:

TypeError错误发生:参数 'real' 的类型不正确(期望numpy.ndarray,实际为DataFrame)/

我尝试只向函数提交一列数据(收盘价 - close)。但又出现另一个错误:

异常:input_arrays参数缺少必需的数据键:close

我不明白该如何解决这个问题。

import requests
from datetime import datetime, timedelta
import pandas as pd
import talib
import numpy as np
from talib import abstract
import yfinance as yf

!wget http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz
!tar -xzvf ta-lib-0.4.0-src.tar.gz
%cd ta-lib
!./configure --prefix=/usr
!make
!make install
!pip install Ta-Lib

N = 1400

def parse_fgi(N):
    url = "https://api.alternative.me/fng/?format=csv&date_format=us"
    parameters = {
        "limit": N,
        "format": "json"
    }

    response = requests.get(url, params=parameters)
    data = response.json()['data']
    fgi_values = [float(i['value']) for i in data][::-1]

    return fgi_values

def parse_dates(N):
    end_date = datetime.today()
    start_date = end_date - timedelta(days=N)
    dates = pd.date_range(start=start_date, end=end_date)
    us_dates = dates.strftime('%Y-%m-%d').tolist()

    return us_dates
abstract.RSI(data_prices, 140)

def parse_prices(coin, N):
  period = parse_dates(N)
  end_time = period[-1]
  start_time = period[0]
  data = yf.download(coin+"-USD", start_time, end_time)
  data.rename(columns = {'Open': 'open',
                      'High':'high',
                      'Low': 'low',
                      'Close': 'close',
                      'Volume': 'volume'}, inplace = True)
  return data
data_prices = parse_prices("XRP", N)
data_prices


def indicators(df, N):
    df['rsi'] = abstract.RSI(df)
    df['sma'] = abstract.SMA(df)
    df['fgi'] = parse_fgi(N)
    return df

df = indicators(data_prices.to_numpy(), N)
df

解决方案

我运行代码,看来主要问题是 multi-level 的列名

你有以下列

Price          close      high       low      open      volume
Ticker       XRP-USD   XRP-USD   XRP-USD   XRP-USD     XRP-USD

但代码只需要

Price          close      high       low      open      volume

并且你需要去掉层级 Ticker

data_prices.columns = data_prices.columns.droplevel("Ticker")

用于测试的完整工作代码:

from datetime import datetime, timedelta
import requests
import yfinance as yf
import pandas as pd
import talib
from talib import abstract

# import numpy as np

#!wget http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz
#!tar -xzvf ta-lib-0.4.0-src.tar.gz
# %cd ta-lib
#!./configure --prefix=/usr
#!make
#!make install
#!pip install Ta-Lib


def parse_fgi(N):
    print("=== parse_fgi ===")

    url = "https://api.alternative.me/fng/"  # ?format=csv&date_format=us"
    parameters = {
        "date_format": "us",
        "limit": N,
        "format": "json",
        # "format": "csv"
    }

    response = requests.get(url, params=parameters)
    data = response.json()["data"]
    fgi_values = [float(i["value"]) for i in data][::-1]

    return fgi_values


def parse_dates(N):
    print("=== parse_dates ===")

    end_date = datetime.today()
    start_date = end_date - timedelta(days=N)
    dates = pd.date_range(start=start_date, end=end_date)
    us_dates = dates.strftime("%Y-%m-%d").tolist()

    return us_dates


def parse_prices(coin, N):
    print("=== parse_prices ===")

    period = parse_dates(N)
    end_time = period[-1]
    start_time = period[0]
    data = yf.download(coin + "-USD", start_time, end_time)
    data.rename(
        columns={
            "Open": "open",
            "High": "high",
            "Low": "low",
            "Close": "close",
            "Volume": "volume",
        },
        inplace=True,
    )

    return data


def indicators(df, N):
    print("=== indicators ===")

    df["rsi"] = abstract.RSI(df)
    df["sma"] = abstract.SMA(df)
    df["fgi"] = parse_fgi(N)

    return df

# --- main ----

N = 1400

data_prices = parse_prices("XRP", N)
print("\n--- data_prices (original) ---\n")
print(data_prices)

# skip one level of column's names
data_prices.columns = data_prices.columns.droplevel("Ticker")
print('\n--- data_prices (after droping level "Ticker") ---\n')
print(data_prices)

result = abstract.RSI(data_prices, 140)
print("\n--- abstract.RSI ---\n")
print(result)

df = indicators(data_prices, N)
print("\n--- df ---\n")
print(df)

结果:

=== parse_prices ===
=== parse_dates ===
/home/furas/Projects/stackoverflow/2026.04/2026.04.29 - talib - need numpy instead of DataFrame/./main.py:66: FutureWarning: YF.download() has changed argument auto_adjust default to True
  data = yf.download(coin + "-USD", start_time, end_time)
[*********************100%***********************]  1 of 1 completed

--- data_prices (original) ---

Price          close      high       low      open      volume
Ticker       XRP-USD   XRP-USD   XRP-USD   XRP-USD     XRP-USD
Date
2022-06-29  0.328978  0.341103  0.323425  0.337372  1094664825
2022-06-30  0.331448  0.331458  0.307668  0.329002  1456445785
2022-07-01  0.313677  0.333078  0.311450  0.331645  1249145615
2022-07-02  0.315579  0.317014  0.310522  0.313724   608601610
2022-07-03  0.321703  0.325247  0.310214  0.315573   728566418
...              ...       ...       ...       ...         ...
2026-04-24  1.433676  1.448798  1.425052  1.439060  2163141988
2026-04-25  1.424219  1.437635  1.419685  1.433670  1062133882
2026-04-26  1.431575  1.435281  1.418834  1.424206  1259313752
2026-04-27  1.400906  1.446373  1.386535  1.431578  2294516967
2026-04-28  1.380665  1.400999  1.369139  1.400905  1780887090

[1400 rows x 5 columns]

--- data_prices (after droping level "Ticker") ---

Price          close      high       low      open      volume
Date
2022-06-29  0.328978  0.341103  0.323425  0.337372  1094664825
2022-06-30  0.331448  0.331458  0.307668  0.329002  1456445785
2022-07-01  0.313677  0.333078  0.311450  0.331645  1249145615
2022-07-02  0.315579  0.317014  0.310522  0.313724   608601610
2022-07-03  0.321703  0.325247  0.310214  0.315573   728566418
...              ...       ...       ...       ...         ...
2026-04-24  1.433676  1.448798  1.425052  1.439060  2163141988
2026-04-25  1.424219  1.437635  1.419685  1.433670  1062133882
2026-04-26  1.431575  1.435281  1.418834  1.424206  1259313752
2026-04-27  1.400906  1.446373  1.386535  1.431578  2294516967
2026-04-28  1.380665  1.400999  1.369139  1.400905  1780887090

[1400 rows x 5 columns]

--- abstract.RSI ---

Date
2022-06-29          NaN
2022-06-30          NaN
2022-07-01          NaN
2022-07-02          NaN
2022-07-03          NaN
                ...
2026-04-24    46.668434
2026-04-25    46.601923
2026-04-26    46.661476
2026-04-27    46.443962
2026-04-28    46.300492
Length: 1400, dtype: float64
=== indicators ===
=== parse_fgi ===

--- df ---

Price          close      high       low      open      volume        rsi       sma   fgi
Date
2022-06-29  0.328978  0.341103  0.323425  0.337372  1094664825        NaN       NaN  13.0
2022-06-30  0.331448  0.331458  0.307668  0.329002  1456445785        NaN       NaN  11.0
2022-07-01  0.313677  0.333078  0.311450  0.331645  1249145615        NaN       NaN  11.0
2022-07-02  0.315579  0.317014  0.310522  0.313724   608601610        NaN       NaN  14.0
2022-07-03  0.321703  0.325247  0.310214  0.315573   728566418        NaN       NaN  11.0
...              ...       ...       ...       ...         ...        ...       ...   ...
2026-04-24  1.433676  1.448798  1.425052  1.439060  2163141988  56.059920  1.370280  31.0
2026-04-25  1.424219  1.437635  1.419685  1.433670  1062133882  54.275149  1.372417  33.0
2026-04-26  1.431575  1.435281  1.418834  1.424206  1259313752  55.462889  1.375969  47.0
2026-04-27  1.400906  1.446373  1.386535  1.431578  2294516967  49.669828  1.378239  33.0
2026-04-28  1.380665  1.400999  1.369139  1.400905  1780887090  46.237286  1.380019  26.0

[1400 rows x 8 columns]
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章