安装与运行时实测
finta 安装:pip 装得上,但 90 个方法里有 14 个会当场报错
pip install finta 本身不会失败。问题出在它之后:这个包的元数据里
没有 requires_python、没有 classifiers,而 install_requires
只写了 pandas 和 numpy 且都不带上界,于是 pip 会解析到今天最新的
numpy 2.4.6 + pandas 3.0.6。
在这套依赖下,本站逐个调用 TA 的 90 个公开方法,得到 76 个成功、14 个抛异常;
把依赖换成 numpy 1.26.4 + pandas 1.5.3 重跑,只剩 6 个失败——
也就是说八个故障是新版 pandas/numpy 造成的,不是 FinTA 改过代码。
_evidence/runtime_naive.txt、_evidence/runtime_pandas1.txt)整理的可运行性示意;数字绑定 2026-10-12 的包版本,不是官方结论。安装路径
finta 有哪几种装法?各自得到什么
| 路径 | 命令 | 装到的东西 | 适用场景 | 注意点 |
|---|---|---|---|---|
| PyPI 发布版(默认) | python -m pip install finta | finta 1.3 + 最新 numpy + 最新 pandas | 一次性研究、教学、读源码 | 实测会解析到 pandas 3 / numpy 2,此时 14 个方法不可用 |
| PyPI + 钉住依赖 | pip install "finta==1.3" "numpy<2" "pandas<2" | 1.3 + 旧依赖 | 需要 KAMA、FRAMA、PSAR 这类方法时 | 要在你的环境里显式声明上界,否则 pip 仍会拉到新版本 |
| GitHub 源码(已归档仍可装) | pip install git+https://github.com/peerchemist/finta.git | master(af01fa5)+ 最新依赖 | 需要 VC / WAVEPM,或想用修好的 OBV / WTO | 没有版本号、没有 wheel;与 1.3 的 OBV/WTO 结果不同(见项目状态页) |
没有第四条路:FinTA 没有 conda 包、没有 Docker 镜像、也没有官方镜像源,本机也没有任何 EasyClaw 技能封装了它(29 个技能、603 个文件里 finta 出现 0 次)。
失败清单
14 个报错的方法分别是哪些?报错原文是什么
| 方法 | 异常类型 | 报错原文(实测) | 性质 | 在 pandas 1.5.3 上 |
|---|---|---|---|---|
ALMA | NotImplementedError | (空消息) | 函数体只有 raise NotImplementedError | 同样失败 |
MAMA | NotImplementedError | (空消息) | 同上 | 同样失败 |
SWI | NotImplementedError | (空消息) | 同上;README 却把 SWI 列为受支持指标 | 同样失败 |
TMF | NotImplementedError | (空消息) | 同上;README 同样列了它 | 同样失败 |
VIDYA | NotImplementedError | (空消息) | 同上;README 同样列了它 | 同样失败 |
LWMA | TypeError | TA.LWMA() missing 1 required positional argument: 'period' | 90 个公开方法里只有它没有默认参数 | 同样失败(属 API 设计,不是 bug) |
EVWMA | AttributeError | 'Series' object has no attribute 'iteritems' | pandas 2.0 移除了 Series.iteritems | 可用 |
EV_MACD | AttributeError | 同上 | 同上 | 可用 |
EVSTC | AttributeError | 同上 | 同上 | 可用 |
KAMA | AttributeError | 同上 | 同上;README 的经典示例 TA.BBANDS(ohlc, MA=TA.KAMA(ohlc,20)) 因此整体失效 | 可用 |
FRAMA | ValueError | assignment destination is read-only | numpy 2 对只读数组的写入更严格 | 可用 |
PSAR | KeyError | 0 | 与 pandas 新版的位置索引行为有关 | 可用 |
SAR | KeyError | 0 | 同上 | 可用 |
ZLEMA | ValueError | periods must be an integer | numpy 2 不再接受被当作整数传递的旧类型 | 可用 |
对照方法清单页可以看到一个关键分布:5 个补不回来的桩(源码里就是空的)加上 1 个 API 设计(LWMA 必须传参),剩下 8 个都可以靠降 pandas/numpy 版本解决。换句话说:报错不等于这个库坏了,先确认是「实现缺失」还是「依赖漂移」。
根因
为什么 pip 不拦一下?根因与三种处置
| 方案 | 具体做法 | 能修好哪些 | 代价 |
|---|---|---|---|
| ① 钉住依赖上界 | pip install "finta==1.3" "numpy<2" "pandas<2" | EVWMA、EV_MACD、EVSTC、KAMA、FRAMA、PSAR、SAR、ZLEMA 共 8 个 | 你的其他依赖也必须能在旧 pandas 上跑;同时放弃新版 pandas 的特性 |
| ② 自己打补丁 | 把 finta.py 里的 .iteritems() 改成 .items(),再把只读数组那处改成 np.array(...) 拷贝 | 主要是 4 个 iteritems 类方法 | 变成你自己维护的分支;仓库已归档,补丁不会被上游接受 |
| ③ 只用手工验收过的方法 | 把 76 个可用方法固化进你的工具函数,其余不碰 | 不修任何东西即可安全使用 | 能力被限制;且要自己记录哪些方法验证过 |
# 根因:pip 不会拦版本——PyPI 元数据里根本没有这些字段 $ python -m pip show finta | findstr Requires Requires: numpy, pandas # 没有版本上界 # 而 PyPI JSON 元数据里: # info['requires_python'] == '' # 空 # info['classifiers'] == [] # 0 条 # 也就是说 pip 无法按 Python 版本或依赖区间给出任何提示。 # 实测解析结果(python -m pip install finta): # Successfully installed finta-1.3 numpy-2.4.6 pandas-3.0.6 # python-dateutil-2.9.0.post0 six-1.17.0 tzdata-2026.5
另外一个容易忽略的点:finta 没有 __version__ 属性,所以「程序里检查版本」这条路走不通,只能用 pip show 或 importlib.metadata 从包元数据读。
验收脚本
装完之后怎么确认它是真的能用
四步验收
python -V、pip show finta pandas numpy 三行都存下来。本站实测的核心变量就是 pandas/numpy 版本,缺了它们后面对不上。inspect 取 TA 的全部公开属性,逐个用默认参数调用,把失败的方法与异常原文打出来。这一步能在 10 行代码内给出结论。tests/test_unit.py 用精确浮点值断言,例如 TA.SMA(ohlc,14).values[-1] == 6922.33922063。本站实测这 7 个值在 1.3 上逐条吻合,所以「数值对得上」是可以一次验证到位的。# 可直接复制运行的验收脚本(本机实测通过)
import inspect, importlib.metadata as md
import pandas as pd
from finta import TA
print('finta', md.version('finta'), '| pandas', pd.__version__)
ohlc = pd.read_csv('ohlc.csv', index_col='date', parse_dates=True).sort_index()
ohlc.columns = [c.lower() for c in ohlc.columns] # 大小写其实无所谓,但统一了更好读
ohlc = ohlc[['open', 'high', 'low', 'close', 'volume']]
names = sorted(k for k in TA.__dict__ if not k.startswith('_'))
bad = []
for n in names:
try:
getattr(TA, n)(ohlc)
except Exception as e:
bad.append((n, type(e).__name__, str(e)))
print('public:', len(names), 'usable:', len(names) - len(bad))
for row in bad:
print(' ', row)
# 官方断言值验收(tests/test_unit.py 里的期望值)
assert round(TA.SMA(ohlc, 14).values[-1], 8) == 6922.33922063 # 需用仓库自带的 CSV
print('golden values OK')
最后那行 assert 只有用仓库自带的 tests/data/bittrex_btc-usdt.csv 才成立(875 行,列头 close,high,low,open,date,volume,2015-12-12 至 2018-06-18)。换自己的数据时,请改用「同一个值在多个库之间是否一致」的思路,那部分见交叉验证页。
官方基准
官方测试里的断言值是多少?可以直接拿来验收
| 调用 | 期望值(源码断言) | 本机实测 | 是否吻合 |
|---|---|---|---|
TA.SMA(ohlc, 14).values[-1] | 6922.33922063 | 6922.33922063 | 吻合 |
TA.SMM(ohlc).values[-1] | 6490.0 | 6490.0 | 吻合 |
TA.SSMA(ohlc).values[-1] | 6907.53759817 | 6907.53759817 | 吻合 |
TA.EMA(ohlc, 50).values[-1] | 7606.84391951 | 7606.84391951 | 吻合 |
TA.DEMA(ohlc).values[-1] | 6323.41923994 | 6323.41923994 | 吻合 |
TA.TEMA(ohlc).values[-1] | 6307.48151844 | 6307.48151844 | 吻合 |
TA.TRIMA(ohlc).values[-1] | 7464.85307304 | 7464.85307304 | 吻合 |
这 7 个吻合值说明两件事:你的安装没有错,以及官方测试套件的期望值是可以直接复用的验收基准。顺带一个只有读仓库才知道的事实:requirements-test.txt 里写着 TA-Lib,.travis.yml 里还有一段从源码编译 ta-lib 0.4.0 的脚本——上游自己就是用 TA-Lib 做交叉验证的,只是 CI 已经随仓库归档停跑。本站把这套对照重做了一遍,读数见交叉验证页。
故障排查
安装阶段常见报错怎么排查
| 现象 | 可能原因 | 怎么确认 | 处置 |
|---|---|---|---|
pip install finta 成功但 import finta 报错 | 依赖解析到了不兼容的 pandas/numpy(本机实测可复现) | pip show finta numpy pandas 看实际版本 | 按表 3 的方案①钉住上界 |
LookupError: Must have a dataframe column named "close" | 传进去的 DataFrame 缺少这一列(列名被别的大小写写成了 Close 也可以,因为会自动转小写) | print(df.columns.tolist()) | 补齐缺失列,或先用 df.rename 统一列名 |
AttributeError: 'int' object has no attribute 'rename' | 第一个参数不是 DataFrame(装饰器会误把第二个参数当数据) | 看 traceback 是否落在 finta.py 的 wrap 里 | 把 DataFrame 放在第一个参数位置 |
AttributeError: module 'finta' has no attribute 'TS' | 照着老教程写了 from finta import TA, TS | 所有已发布版本都只有 TA | 删掉 TS,改用 from finta import TA |
AttributeError: module 'finta' has no attribute '__version__' | 该包不导出 __version__ | —— | 用 importlib.metadata.version('finta') 或 pip show |
| 结果里一堆 NaN 或数值与行情软件差很多 | 预热窗口没等够,或数据是最新日期在前(会造成未来函数) | 看首行的 isna() 结果;df.index.is_monotonic_increasing | 先 sort_index(),再看源码公式页的预热表 |
如果这些都没命中,可用的兜底动作只剩两个:把 finta.py 直接打开看对应方法的实现(单文件 2308 行、方法内就是指标公式),或者换一个仍在维护的库——两条路的取舍见选型与迁移页。
FAQ
关于 finta 安装与运行的常见问题
pip install finta 会失败吗?
哪些方法在当前环境下一定用不了?
ALMA、MAMA、SWI、TMF、VIDYA 的函数体只有 raise NotImplementedError,换任何环境都一样。另一类可以靠降版本修好:EVWMA、EV_MACD、EVSTC、KAMA、FRAMA、PSAR、SAR、ZLEMA。我该把 pandas 钉到哪个版本?
pandas 1.5.3 + numpy 1.26.4(Python 3.11.9)。iteritems 是在 pandas 2.0 被移除的,所以需要那 4 个方法时至少要降到 2.0 之前。具体版本以你自己环境里能同时满足其他依赖的组合为准,本站不给「通用推荐版本」。为什么这个包不能自己检查版本?
__version__,finta.__version__ 会 AttributeError。要判断版本只能从包元数据读(importlib.metadata.version)或从行为反推(例如 hasattr(TA, 'WAVEPM') 判断是不是 master)。90 个方法里我只能用 76 个,这个库还值得用吗?
SMA、EMA、RSI、MACD、BBANDS、ATR、ADX、OBV、STOCH 都在可用组内;失效的多数是自适应均线类与 PSAR。先看方法清单页确认你的指标在不在里面,再决定。官方测试能跑吗?
tests/test_unit.py(86 个测试函数)、test_reg.py 与 test_utils_unit.py,依赖写在自己的 requirements-test.txt 里(含 TA-Lib)。由于仓库已归档、CI 停跑,这些测试只能自己手动执行;本站复用了其中的断言值做验收(见上方基准表)。相关阅读:版本差异、源码公式与预热。本页结论绑定 2026-10-12 的实测环境(Python 3.11.9),数值口径以官方源码为准。