TA-Lib は、C で書かれたテクニカル分析ライブラリ本体と、その Python ラッパー(TA-Lib)を組み合わせて使うパッケージです。手軽に 100 種類以上の指標を呼び出せる反面、C ライブラリの依存関係でインストール時につまずきやすい ことで知られています。本記事では OS 別の導入手順と、SMA・RSI を呼び出すところまでを整理します。
目次
- TA-Lib の構成
- OS 別インストール手順
- インストールの確認
- SMA を呼び出す
- RSI を呼び出す
- チャートに重ねる
- ハマりやすい罠
- 自前実装との結果比較
TA-Lib の構成
TA-Lib は 2 段構造 です。
- C 製の本体ライブラリ:
ta-lib(以下「C 本体」) - Python バインディング:
TA-Lib(pip install TA-Libで入る方)
Python パッケージだけを pip install TA-Lib してもビルドが落ちることが多いのは、C 本体が見つからないためです。先に C 本体を入れてから Python ラッパーを入れる、という順序が原則です。
OS 別インストール手順
macOS(Homebrew)
brew install ta-libpip install TA-LibApple Silicon(arm64)の場合、Homebrew の C 本体が /opt/homebrew/lib に入るため、Python バインディングのビルドで LDFLAGS の指定が必要になることがあります。
export TA_LIBRARY_PATH=/opt/homebrew/libexport TA_INCLUDE_PATH=/opt/homebrew/includepip install TA-LibUbuntu / Debian
公式 apt には C 本体が無いため、ソースからビルドします。
sudo apt-get updatesudo apt-get install -y build-essential wget
cd /tmpwget https://github.com/ta-lib/ta-lib/releases/download/v0.6.4/ta-lib-0.6.4-src.tar.gztar -xzf ta-lib-0.6.4-src.tar.gzcd ta-lib-0.6.4./configure --prefix=/usrmakesudo make installsudo ldconfig
pip install TA-LibWindows
Windows では、C 本体を自分でビルドするのは手間がかかります。Conda 経由 が最短です。
conda install -c conda-forge ta-libAnaconda / Miniconda を使っていない場合、Visual C++ ビルドツール + 公式配布のバイナリをダウンロードする手順もありますが、Conda のほうがトラブルは少なくなります。
Docker(再現性重視)
OS 依存を避けたい場合、Docker でビルド済みイメージを使う構成が現実的です。
FROM python:3.12-slim
RUN apt-get update && apt-get install -y \ build-essential wget \ && rm -rf /var/lib/apt/lists/*
RUN cd /tmp \ && wget https://github.com/ta-lib/ta-lib/releases/download/v0.6.4/ta-lib-0.6.4-src.tar.gz \ && tar -xzf ta-lib-0.6.4-src.tar.gz \ && cd ta-lib-0.6.4 \ && ./configure --prefix=/usr \ && make && make install \ && rm -rf /tmp/ta-lib-0.6.4*
RUN pip install --no-cache-dir TA-Lib pandas numpyCI で使うなら、ベースイメージのキャッシュが効くようコマンド順を意識します。
インストールの確認
最小コードでバージョンを確認します。
import talibprint(talib.__version__)print(talib.get_function_groups().keys())get_function_groups() を呼ぶと、Overlap Studies / Momentum Indicators / Pattern Recognition などのカテゴリ一覧が確認できます。
SMA を呼び出す
TA-Lib は NumPy 配列を入出力 にする設計です。pandas の Series を渡すなら .values で NumPy 化します。
import numpy as npimport pandas as pdimport talib
rng = np.random.default_rng(seed=2)n = 200returns = rng.normal(loc=0.0005, scale=0.012, size=n)close = pd.Series( 1500 * np.exp(np.cumsum(returns)), index=pd.date_range("2025-09-01", periods=n, freq="B"), name="C",)
sma25 = talib.SMA(close.values, timeperiod=25)sma25 = pd.Series(sma25, index=close.index, name="sma25")print(sma25.tail())冒頭 24 日は NaN が返ります(pandas の rolling と同じ挙動)。
pandas-wrapper として、talib.abstract 経由で DataFrame をそのまま渡す書き方も用意されています。
from talib import abstract
ohlc = pd.DataFrame({"C": close.values}, index=close.index)sma25_df = abstract.SMA(ohlc, timeperiod=25)RSI を呼び出す
rsi14 = talib.RSI(close.values, timeperiod=14)rsi14 = pd.Series(rsi14, index=close.index, name="rsi14")print(rsi14.tail())TA-Lib の RSI は Wilder のスムージング を使います。#9-4「RSI を計算してチャートに重ねる」 で書いた自前実装と数値が一致するはずです。差が出るときは adjust の指定や ddof の選択が原因になることが多いです。
チャートに重ねる
import matplotlib.pyplot as plt
fig, (ax1, ax2) = plt.subplots( nrows=2, sharex=True, figsize=(11, 6), gridspec_kw={"height_ratios": [3, 1]},)ax1.plot(close.index, close.values, color="black", linewidth=0.8, label="C")ax1.plot(sma25.index, sma25.values, color="tab:blue", label="SMA(25)")ax1.set_title("TA-Lib SMA & RSI")ax1.legend()ax1.grid(alpha=0.3)
ax2.plot(rsi14.index, rsi14.values, color="tab:purple")ax2.axhline(70, color="red", linestyle="--", alpha=0.6)ax2.axhline(30, color="green", linestyle="--", alpha=0.6)ax2.set_ylim(0, 100)ax2.set_ylabel("RSI(14)")ax2.grid(alpha=0.3)
plt.tight_layout()plt.savefig("talib_first.png", dpi=120)plt.close(fig)
ハマりやすい罠
- pip でビルドが落ちる: C 本体が入っていない / 検出できない。本体の
prefixとTA_LIBRARY_PATHを一致させる - macOS で
ld: library not found for -lta-lib: arm64 と x86_64 の混在。brew --prefix ta-libの出力を確認して環境変数を合わせる - Windows でコンパイラが無い: Visual C++ ビルドツールが必要。Conda を使うのが手軽
- 戻り値が NumPy 配列: pandas に変換するときは
indexを渡し直す。これを忘れると後段のconcatで日付が崩れる ddofの違い: 自前実装の標準偏差(ddof=1既定)と TA-Lib(ddof=0)で結果がずれることがある
自前実装との結果比較
SMA は単純平均なので、自前実装と TA-Lib の値は 小数点以下の数桁まで一致 します。RSI(Wilder)も、初期 N 日のシードを単純平均にしておけば、概ね一致します。
def rsi_wilder(close: pd.Series, window: int = 14) -> pd.Series: delta = close.diff() up = delta.clip(lower=0).ewm(alpha=1/window, adjust=False, min_periods=window).mean() dn = (-delta).clip(lower=0).ewm(alpha=1/window, adjust=False, min_periods=window).mean() rs = up / dn.replace(0, np.nan) return 100 - 100 / (1 + rs)
own = rsi_wilder(close, 14).rename("own")tal = pd.Series(talib.RSI(close.values, timeperiod=14), index=close.index, name="tal")diff = (own - tal).abs().dropna()print(diff.describe())差が大きい場合は、TA-Lib のソースで使われる初期化方法と自前実装の seed の取り方を見直します。
生成AI へのプロンプト例
C 本体のインストールを含めたセットアップスクリプトを依頼するときの例です。
Ubuntu 22.04 LTS のクリーンな環境で、TA-Lib(C 本体 + Python バインディング)をセットアップする shell スクリプトを書いてください。
要件:- 非対話実行(apt-get -y を徹底)- ta-lib のソースは GitHub Releases から取得- /usr に prefix インストール- 完了後に python -c "import talib; print(talib.__version__)" で動作確認- 失敗したら exit 1 で止める(set -euo pipefail)- スクリプト末尾に、Apple Silicon の macOS で同じことをやる場合の手順をコメントで添えるまとめ
- TA-Lib は C 本体 + Python ラッパー の 2 段構造
- 先に C 本体、次に
pip install TA-Libの順序が基本 - macOS は brew、Linux はソースビルド、Windows は Conda が最短
- 関数は NumPy 配列を入出力。pandas Series に戻すときは
indexを再付与する - 自前実装と数値が一致するか比較して、ライブラリの挙動を理解しておく