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

Python ta库计算WilliamsR、EMA返回对象而非数值问题求助

问题根因

你混淆了ta(Technical Analysis Library)的两种调用方式,导致类接口只完成了实例化、没有执行指标计算逻辑:

  • 你代码中正常返回数值的stoch、rsi属于函数式快捷接口,调用后会直接返回计算完成的Pandas数值序列,可以直接赋值给DataFrame列。
  • 你代码中返回类对象的WilliamsRIndicator、EMAIndicator属于指标类构造方法,直接调用仅会生成初始化后的类实例,不会自动触发指标计算,因此输出结果是带内存地址的类实例字符串,而非预期的数值序列。
错误触发逻辑

ta库的接口设计遵循统一规则:所有名称带Indicator后缀的都是指标类,使用流程分为两步:

  1. 传入行情数据、指标参数完成类实例化
  2. 调用实例对应的计算方法,才能拿到最终的指标数值序列
    你当前的代码只执行了第一步,没有调用计算取值的方法,因此拿到的是类实例本身而非计算结果。
    另外你的代码还存在一个无关的小问题: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 07:39:21