You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Google Colab中使用TA-Lib报错,请求排查问题原因

TA-Lib TypeError问题排查:Argument 'real'类型错误

问题重现

我在Google Colab中运行以下代码:

import pandas as pd
import yfinance as yf
import talib as ta

data = yf.download("GOOG")
data['RSI'] = ta.RSI(data["Close"], timeperiod=10)

得到如下错误输出:

[*********************100%***********************]  1 of 1 completed
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-3-e3c5cad38926> in <cell line: 6>()
      4 
      5 data = yf.download("GOOG")
----> 6 data['RSI'] = ta.RSI(data["Close"], timeperiod=10)

/usr/local/lib/python3.10/dist-packages/talib/__init__.py in wrapper(*args, **kwargs)
     25 
     26             if index is None:
---> 27                 return func(*args, **kwargs)
     28 
     29             # Use Series' float64 values if pandas, else use values as passed

TypeError: Argument 'real' has incorrect type (expected numpy.ndarray, got DataFrame)

之前使用过TA-Lib,但现在无法正常使用,请问代码哪里有问题?原因是什么?

问题原因

错误提示明确说明TA-Lib的RSI函数期望接收numpy.ndarray类型的参数,但你传入的data["Close"]是一个DataFrame类型。

这种情况通常是因为yfinance版本更新导致返回结果结构变化:旧版本yfinance下载单只股票数据时,data["Close"]返回的是pandas Series;但新版本中,默认下载的收盘价可能包含多列(比如不同复权规则的收盘价),使得data["Close"]变成了DataFrame而非Series。

解决方法

有两种可行的修正方式:

  • 方式一:直接提取DataFrame的numpy数组传入
data['RSI'] = ta.RSI(data["Close"].values, timeperiod=10)
  • 方式二:确保获取单一Series对象
    • 如果需要复权收盘价,直接指定Adj Close列:
      data['RSI'] = ta.RSI(data["Adj Close"], timeperiod=10)
      
    • 如果Close列是多列结构,取第一列转为Series:
      data['RSI'] = ta.RSI(data["Close"].iloc[:, 0], timeperiod=10)
      

另外,也可以在下载数据时指定参数,让yfinance返回传统单结构数据:

data = yf.download("GOOG", auto_adjust=False)
data['RSI'] = ta.RSI(data["Close"], timeperiod=10)

内容的提问来源于stack exchange,提问作者Sporcuburhan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 21:02:31