在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
相关产品推荐
相关产品推荐

