Python ta库计算WilliamsR、EMA返回对象而非数值问题求助
问题根因
你混淆了ta(Technical Analysis Library)的两种调用方式,导致类接口只完成了实例化、没有执行指标计算逻辑:
- 你代码中正常返回数值的
stoch、rsi属于函数式快捷接口,调用后会直接返回计算完成的Pandas数值序列,可以直接赋值给DataFrame列。 - 你代码中返回类对象的
WilliamsRIndicator、EMAIndicator属于指标类构造方法,直接调用仅会生成初始化后的类实例,不会自动触发指标计算,因此输出结果是带内存地址的类实例字符串,而非预期的数值序列。
错误触发逻辑
ta库的接口设计遵循统一规则:所有名称带Indicator后缀的都是指标类,使用流程分为两步:
- 传入行情数据、指标参数完成类实例化
- 调用实例对应的计算方法,才能拿到最终的指标数值序列
你当前的代码只执行了第一步,没有调用计算取值的方法,因此拿到的是类实例本身而非计算结果。
另外你的代码还存在一个无关的小问题:df.dropna(inplace=False)没有接收方法返回值,这行代码执行后不会修改原DataFrame的空值,属于无效写法。
两个指标类对应的取值方法如下:
WilliamsRIndicator实例需要调用.williams_r()方法获取威廉指标%R序列EMAIndicator实例需要调用.ema_indicator()方法获取EMA序列
修正后代码
import yfinance as yf import numpy as np import ta import pandas as pd import matplotlib.pyplot as plt df = yf.download('ETH-USD', start='2022-06-15', interval='5m' ) df['%K'] = ta.momentum.stoch(df.High, df.Low ,df.Close , 14 ,3) df['%D'] = df['%K'].rolling(3).mean() df['RSI'] = ta.momentum.rsi(df.Close ,14) # 类接口正确调用方式 willr_instance = ta.momentum.WilliamsRIndicator(df.High, df.Low ,df.Close ,21) df['%R'] = willr_instance.williams_r() ema_instance = ta.trend.EMAIndicator(df.Close, 13) df['EMA'] = ema_instance.ema_indicator() # 修正dropna无效的问题 df = df.dropna()
如果不想记忆类实例的取值方法,也可以直接用和RSI、随机指标一致的函数式接口写法,代码更简洁:
# 威廉指标函数式调用 df['%R'] = ta.momentum.williams_r(df.High, df.Low, df.Close, 21) # EMA函数式调用 df['EMA'] = ta.trend.ema_indicator(df.Close, 13)
内容的提问来源于stack exchange,提问作者herr herbert
相关产品推荐
相关产品推荐

