安装与运行时实测

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 改过代码。

Python 3.11.9finta 1.314 个异常5 个未实现桩
pip install finta 成功解析到 numpy 2.4.6 + pandas 3.0.6
90 个方法逐个调用76 个成功、14 个抛异常
换 pandas 1.5.3 重跑失败降到 6 个 → 8 个故障来自环境
依据本机三套隔离环境实测(_evidence/runtime_naive.txt、_evidence/runtime_pandas1.txt)整理的可运行性示意;数字绑定 2026-10-12 的包版本,不是官方结论。

安装路径

finta 有哪几种装法?各自得到什么

表 1:三条安装路径对照
路径命令装到的东西适用场景注意点
PyPI 发布版(默认)python -m pip install fintafinta 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.gitmaster(af01fa5)+ 最新依赖需要 VC / WAVEPM,或想用修好的 OBV / WTO没有版本号、没有 wheel;与 1.3 的 OBV/WTO 结果不同(见项目状态页)

没有第四条路:FinTA 没有 conda 包、没有 Docker 镜像、也没有官方镜像源,本机也没有任何 EasyClaw 技能封装了它(29 个技能、603 个文件里 finta 出现 0 次)。

失败清单

14 个报错的方法分别是哪些?报错原文是什么

表 2:在 numpy 2.4.6 + pandas 3.0.6 上逐个调用后的完整失败清单
方法异常类型报错原文(实测)性质在 pandas 1.5.3 上
ALMANotImplementedError(空消息)函数体只有 raise NotImplementedError同样失败
MAMANotImplementedError(空消息)同上同样失败
SWINotImplementedError(空消息)同上;README 却把 SWI 列为受支持指标同样失败
TMFNotImplementedError(空消息)同上;README 同样列了它同样失败
VIDYANotImplementedError(空消息)同上;README 同样列了它同样失败
LWMATypeErrorTA.LWMA() missing 1 required positional argument: 'period'90 个公开方法里只有它没有默认参数同样失败(属 API 设计,不是 bug)
EVWMAAttributeError'Series' object has no attribute 'iteritems'pandas 2.0 移除了 Series.iteritems可用
EV_MACDAttributeError同上同上可用
EVSTCAttributeError同上同上可用
KAMAAttributeError同上同上;README 的经典示例 TA.BBANDS(ohlc, MA=TA.KAMA(ohlc,20)) 因此整体失效可用
FRAMAValueErrorassignment destination is read-onlynumpy 2 对只读数组的写入更严格可用
PSARKeyError0与 pandas 新版的位置索引行为有关可用
SARKeyError0同上可用
ZLEMAValueErrorperiods must be an integernumpy 2 不再接受被当作整数传递的旧类型可用

对照方法清单页可以看到一个关键分布:5 个补不回来的桩(源码里就是空的)加上 1 个 API 设计(LWMA 必须传参),剩下 8 个都可以靠降 pandas/numpy 版本解决。换句话说:报错不等于这个库坏了,先确认是「实现缺失」还是「依赖漂移」。

根因

为什么 pip 不拦一下?根因与三种处置

表 3:三种处置方案的对比
方案具体做法能修好哪些代价
① 钉住依赖上界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)。换自己的数据时,请改用「同一个值在多个库之间是否一致」的思路,那部分见交叉验证页。

    官方基准

    官方测试里的断言值是多少?可以直接拿来验收

    表 4:仓库 tests/test_unit.py 的断言值 × 本机实测(同一份 CSV,finta 1.3)
    调用期望值(源码断言)本机实测是否吻合
    TA.SMA(ohlc, 14).values[-1]6922.339220636922.33922063吻合
    TA.SMM(ohlc).values[-1]6490.06490.0吻合
    TA.SSMA(ohlc).values[-1]6907.537598176907.53759817吻合
    TA.EMA(ohlc, 50).values[-1]7606.843919517606.84391951吻合
    TA.DEMA(ohlc).values[-1]6323.419239946323.41923994吻合
    TA.TEMA(ohlc).values[-1]6307.481518446307.48151844吻合
    TA.TRIMA(ohlc).values[-1]7464.853073047464.85307304吻合

    这 7 个吻合值说明两件事:你的安装没有错,以及官方测试套件的期望值是可以直接复用的验收基准。顺带一个只有读仓库才知道的事实:requirements-test.txt 里写着 TA-Lib,.travis.yml 里还有一段从源码编译 ta-lib 0.4.0 的脚本——上游自己就是用 TA-Lib 做交叉验证的,只是 CI 已经随仓库归档停跑。本站把这套对照重做了一遍,读数见交叉验证页。

    故障排查

    安装阶段常见报错怎么排查

    表 5:安装期与首次运行期的排查表
    现象可能原因怎么确认处置
    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 会失败吗?
    本站实测不会失败,而且装得很快。失败风险不在安装阶段,而在安装之后的运行阶段:pip 会把 numpy 与 pandas 解析到最新版,而 2021 年的 FinTA 代码里有 8 个方法用不了新版 API。所以「装上了」不能当作验收标准。
    哪些方法在当前环境下一定用不了?
    分两类。一类是补不回来的: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),数值口径以官方源码为准。

    接下来读哪一页?

    确认了能跑之后,最容易踩的下一个坑是数据本身——列名、缺列报错,以及「最新日期在前」会让指标吃到未来数据。数据契约与索引顺序页给了可复现的实测数值。