※本記事のコードや情報は執筆時点の仕様に基づいています。ライブラリのバージョンアップにより仕様が変更される可能性があるため、必ず公式ドキュメントも併せて確認してください。
Pythonでテクニカル指標を計算しようとすると、RSIやMACDを一から自力実装するのは意外と手間がかかります。
計算ロジックの微妙な違い(SMA方式かEMA方式か、Wilder方式かなど)で結果がズレることもあり、「本当にこの計算で合っているのか」と不安になる場面が少なくありません。
TA-Lib(Technical Analysis Library)を使えば、200種類以上のテクニカル指標を関数1つで正確に算出できます。
しかし、TA-Libは「インストールで挫折する」ことで有名なライブラリです。特にWindows環境ではCコンパイラの依存関係でエラーが頻発し、多くの初心者がここで脱落しています。
この記事では、Windows・Mac・Linuxの各環境でTA-Libを確実にインストールする手順を示し、RSI・ボリンジャーバンド・MACDの3指標を実際に算出するコードを提供します。
すべてコピペでそのまま動作する実装に限定していますので、自分の分析対象に差し替えて応用してください。
TA-Libとは何か:主要な特徴と採用理由
TA-Libを導入する前に、このライブラリの特徴と「なぜ自力実装ではなくTA-Libを使うべきなのか」を明確にします。
TA-Libの3つの強み
TA-Lib(Technical Analysis Library)は、金融市場のテクニカル分析に特化したオープンソースライブラリです。
* 指標数の豊富さ:RSI・MACD・ボリンジャーバンドなど200種類以上のテクニカル指標を網羅しています
* 計算速度:C言語で実装されたコアエンジンをPythonから呼び出す構造のため、pandasの自力実装より数倍〜数十倍高速です
* 計算精度の信頼性:金融業界で長年使われてきた実績があり、TradingViewやMetaTraderなどのチャートツールと同じ計算ロジックを採用しています
自力実装では「RSIのEMA方式とSMA方式の違い」などで計算結果がズレることがありますが、TA-Libを使えばその心配がなくなります。
TA-Libが対応する指標カテゴリ
TA-Libの指標は、大きく以下のカテゴリに分類されます。
* オーバーラップ系:移動平均線(SMA・EMA・WMA・DEMA・TEMAなど)、ボリンジャーバンド、パラボリックSARなど
* モメンタム系:RSI、MACD、ストキャスティクス、CCI、ADX、ウィリアムズ%Rなど
* ボリューム系:OBV(On Balance Volume)、AD(Accumulation/Distribution)など
* ボラティリティ系:ATR(Average True Range)、NATR(Normalized ATR)など
* パターン認識系:ローソク足パターン(ハンマー、包み足、三兵など)61種類
すべての指標は talib.関数名() の1行で呼び出せるため、学習コストが非常に低い点も魅力です。
【コピペOK】OS別インストール手順
TA-Libのインストールは、OSによって手順が大きく異なります。
自分の環境に合ったセクションを参照してください。
Windowsでのインストール(最もエラーが多い環境)
Windowsでは pip install ta-lib を直接実行するとビルドエラーが発生します。
これはTA-LibのPythonラッパーがC言語のTA-Libコアに依存しているためです。
以下の手順で回避してください。
# 手順1:TA-Libのビルド済みホイールをダウンロードしてインストール
# 以下のURLから自分のPythonバージョンに合った.whlファイルを取得します
# https://github.com/cgohlke/talib-build/releases
#
# 例:Python 3.11 + 64bit環境の場合
# TA_Lib-0.4.32-cp311-cp311-win_amd64.whl をダウンロード
#
# ダウンロード後、以下を実行
pip install TA_Lib-0.4.32-cp311-cp311-win_amd64.whl
# 手順2:インストール確認
python -c "import talib; print(talib.__version__)"
Pythonのバージョンとホイールファイルのバージョンが一致しない場合、not a supported wheel on this platform エラーが出ます。python --version でバージョンを確認してから、対応するファイルをダウンロードしてください。
Mac(macOS)でのインストール
macOSではHomebrewでCライブラリを先にインストールし、その後Pythonラッパーを入れます。
# 手順1:HomebrewでTA-Libのコアライブラリをインストール
brew install ta-lib
# 手順2:Pythonラッパーをpipでインストール
pip install ta-lib
# 手順3:インストール確認
python -c "import talib; print(talib.__version__)"
Linux(Ubuntu/Debian)でのインストール
Linuxではソースからビルドするのが最も確実です。
# 手順1:TA-Libのソースコードをダウンロード・ビルド
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/
cmake .
make -j
sudo make install
# 手順2:Pythonラッパーをインストール
pip install ta-lib
# 手順3:インストール確認
python -c "import talib; print(talib.__version__)"
【コピペOK】RSI・ボリンジャーバンド・MACDを算出するコード
TA-Libのインストールが完了したら、実際にテクニカル指標を算出してみましょう。
yfinanceで株価データを取得し、RSI・ボリンジャーバンド・MACDの3指標を一括計算して、チャートとして保存するコードを提供します。
事前準備:ライブラリのインストール
pip install yfinance pandas matplotlib ta-lib
【コピペOK】3指標の一括算出+チャート保存コード
import yfinance as yf
import pandas as pd
import talib
import matplotlib.pyplot as plt
# ==============================
# 設定エリア
# ==============================
SYMBOL = "7203.T" # トヨタ自動車
PERIOD = "1y" # 取得期間(1年間)
RSI_WINDOW = 14 # RSI計算期間
BB_WINDOW = 20 # ボリンジャーバンド期間
BB_NBDEV = 2 # ボリンジャーバンド偏差倍率
MACD_FAST = 12 # MACD短期EMA期間
MACD_SLOW = 26 # MACD長期EMA期間
MACD_SIGNAL = 9 # MACDシグナル期間
# ==============================
# データ取得
# ==============================
def fetch_data(symbol: str, period: str) -> pd.DataFrame:
""yfinanceで株価データを取得します。""
ticker = yf.Ticker(symbol)
df = ticker.history(period=period)
if df.empty:
raise ValueError(f"{symbol} のデータを取得できませんでした。")
return df
# ==============================
# テクニカル指標の算出
# ==============================
def calc_indicators(df: pd.DataFrame) -> pd.DataFrame:
""TA-Libで3指標(RSI・ボリンジャーバンド・MACD)を算出します。""
df = df.copy()
close = df["Close"].values
# RSI
df["RSI"] = talib.RSI(close, timeperiod=RSI_WINDOW)
# ボリンジャーバンド
df["BB_Upper"], df["BB_Middle"], df["BB_Lower"] = talib.BBANDS(
close,
timeperiod=BB_WINDOW,
nbdevup=BB_NBDEV,
nbdevdn=BB_NBDEV,
matype=0, # 0=SMA
)
# MACD
df["MACD"], df["MACD_Signal"], df["MACD_Hist"] = talib.MACD(
close,
fastperiod=MACD_FAST,
slowperiod=MACD_SLOW,
signalperiod=MACD_SIGNAL,
)
return df
# ==============================
# チャート描画+保存
# ==============================
def plot_indicators(df: pd.DataFrame, symbol: str):
""3指標を含む4段チャートを描画して保存します。""
fig, axes = plt.subplots(4, 1, figsize=(14, 16), sharex=True)
# --- 1段目:株価+ボリンジャーバンド ---
ax1 = axes[0]
ax1.plot(df.index, df["Close"], color="black", linewidth=1.0, label="Close")
ax1.plot(df.index, df["BB_Upper"], color="red", linewidth=0.7, linestyle="--", label="BB Upper")
ax1.plot(df.index, df["BB_Middle"], color="blue", linewidth=0.7, linestyle="--", label="BB Middle")
ax1.plot(df.index, df["BB_Lower"], color="green", linewidth=0.7, linestyle="--", label="BB Lower")
ax1.fill_between(df.index, df["BB_Upper"], df["BB_Lower"], alpha=0.08, color="blue")
ax1.set_title(f"{symbol} - Price & Bollinger Bands", fontsize=13)
ax1.set_ylabel("Price (JPY)")
ax1.legend(loc="upper left", fontsize=9)
ax1.grid(True, alpha=0.3)
# --- 2段目:RSI ---
ax2 = axes[1]
ax2.plot(df.index, df["RSI"], color="purple", linewidth=1.0, label="RSI")
ax2.axhline(70, color="red", linestyle="--", alpha=0.5, label="Overbought (70)")
ax2.axhline(30, color="green", linestyle="--", alpha=0.5, label="Oversold (30)")
ax2.set_title("RSI (14)", fontsize=13)
ax2.set_ylabel("RSI")
ax2.set_ylim(0, 100)
ax2.legend(loc="upper left", fontsize=9)
ax2.grid(True, alpha=0.3)
# --- 3段目:MACD ---
ax3 = axes[2]
ax3.plot(df.index, df["MACD"], color="blue", linewidth=1.0, label="MACD")
ax3.plot(df.index, df["MACD_Signal"], color="red", linewidth=1.0, label="Signal")
ax3.bar(df.index, df["MACD_Hist"], color="gray", alpha=0.4, label="Histogram")
ax3.axhline(0, color="black", linewidth=0.5)
ax3.set_title("MACD (12, 26, 9)", fontsize=13)
ax3.set_ylabel("MACD")
ax3.legend(loc="upper left", fontsize=9)
ax3.grid(True, alpha=0.3)
# --- 4段目:出来高 ---
ax4 = axes[3]
ax4.bar(df.index, df["Volume"], color="steelblue", alpha=0.6)
ax4.set_title("Volume", fontsize=13)
ax4.set_ylabel("Volume")
ax4.grid(True, alpha=0.3)
plt.tight_layout()
fig.savefig("ta_lib_chart.png", dpi=150, bbox_inches="tight", facecolor="white")
plt.close(fig)
print("✔ チャートを保存しました: ta_lib_chart.png")
# ==============================
# 指標値の一覧表示
# ==============================
def print_latest_values(df: pd.DataFrame):
""直近日の指標値をコンソールに表示します。""
latest = df.iloc[-1]
date_str = df.index[-1].strftime("%Y-%m-%d")
print(f"n--- {date_str} 時点の指標値 ---")
print(f" 終値: {latest['Close']:.1f}")
print(f" RSI(14): {latest['RSI']:.2f}")
print(f" BB Upper: {latest['BB_Upper']:.1f}")
print(f" BB Middle: {latest['BB_Middle']:.1f}")
print(f" BB Lower: {latest['BB_Lower']:.1f}")
print(f" MACD: {latest['MACD']:.2f}")
print(f" MACD Signal: {latest['MACD_Signal']:.2f}")
print(f" MACD Histogram: {latest['MACD_Hist']:.2f}")
# ==============================
# メイン処理
# ==============================
if __name__ == "__main__":
# 1. データ取得
print(f"=== {SYMBOL} のテクニカル指標を算出 ===n")
df = fetch_data(SYMBOL, PERIOD)
# 2. 指標算出
df = calc_indicators(df)
# 3. 直近値の表示
print_latest_values(df)
# 4. チャート描画+保存
plot_indicators(df, SYMBOL)
# 5. CSV出力(任意)
output_cols = ["Close", "Volume", "RSI", "BB_Upper", "BB_Middle", "BB_Lower", "MACD", "MACD_Signal", "MACD_Hist"]
df[output_cols].to_csv("ta_lib_output.csv")
print("✔ CSVを保存しました: ta_lib_output.csv")
コードの処理フロー解説
上記のコードは、以下の5ステップで構成されています。
* データ取得:yfinanceで指定銘柄の1年分の日足データを取得します
* 指標算出:TA-Libの RSI()・BBANDS()・MACD() 関数で3指標を一括計算します
* 直近値表示:最新日の各指標値をコンソールに出力します
* チャート描画:株価+ボリンジャーバンド・RSI・MACD・出来高の4段チャートをPNG画像として保存します
* CSV出力:全期間の指標値をCSVファイルとして保存します
calc_indicators() 関数内に talib.ATR() や talib.STOCH() などを追加すれば、算出する指標を自由に拡張できます。
TA-Lib関数の使い方:引数と戻り値の読み解き方
TA-Libの関数は統一的なインターフェースを持っていますが、関数ごとに引数や戻り値の数が異なります。
ここでは、関数を正しく使うための実践的なルールを解説します。
入力データの渡し方
TA-Libの関数は、NumPy配列(numpy.ndarray)を入力として受け取ります。
pandasのSeriesをそのまま渡すと内部で自動変換されますが、明示的に .values で変換しておくほうが安全です。
# 推奨:明示的にNumPy配列へ変換
rsi = talib.RSI(df["Close"].values, timeperiod=14)
# 非推奨:pandas.Seriesをそのまま渡す(動作はするが警告が出る場合がある)
rsi = talib.RSI(df["Close"], timeperiod=14)
戻り値が複数ある関数の扱い方
ボリンジャーバンドやMACDのように、戻り値が複数ある関数はタプルで返されます。
* talib.BBANDS():3つの戻り値(upper, middle, lower)
* talib.MACD():3つの戻り値(macd, signal, hist)
* talib.STOCH():2つの戻り値(slowk, slowd)
* talib.RSI():1つの戻り値(rsi)
戻り値の数を間違えると ValueError: too many values to unpack が発生します。公式ドキュメントまたは help(talib.関数名) で戻り値の数を確認してから使用してください。
計算期間(timeperiod)とNaN
TA-Libの関数は、計算に必要なデータが不足している先頭部分を NaN で埋めます。
RSI(14日)の場合、先頭14行は NaN になります。
グラフ描画や売買シグナル生成の際に NaN が残っていると予期しない動作を起こすため、dropna() で除去するか、NaN を明示的にスキップするロジックを入れてください。
よくあるエラーと対処法
TA-Libのインストール・利用で初心者がつまずきやすいポイントを整理します。
error: Microsoft Visual C++ 14.0 or greater is required(Windows)
Windows環境で pip install ta-lib を直接実行した場合に発生する最も多いエラーです。
TA-LibのPythonラッパーがCコードをコンパイルしようとして、Visual C++のビルドツールが見つからないために失敗しています。
以下を試してください。
* ビルド済みホイール(.whlファイル)を使う:本記事のWindowsインストール手順に従ってください
* conda経由でインストールする:conda install -c conda-forge ta-lib でビルド済みバイナリがインストールされます
* Visual Studio Build Toolsをインストールする:Microsoft公式サイトから「C++によるデスクトップ開発」ワークロードを入れれば pip install ta-lib が通るようになります
ImportError: libta_lib.so.0: cannot open shared object file(Linux)
LinuxでPythonラッパーのインストールは成功したが、コアライブラリのパスが通っていない場合に発生します。
以下を実行してライブラリキャッシュを更新してください。
sudo ldconfig
それでも解決しない場合は、/usr/local/lib にライブラリファイルが存在するか確認し、LD_LIBRARY_PATH 環境変数に追加してください。
talib.RSI() の結果が自力実装と微妙にズレる
TA-LibのRSIはWilder(指数移動平均)方式を採用しています。
pandasの rolling().mean() で実装したSMA方式のRSIとは計算ロジックが異なるため、結果がズレるのは正常な動作です。
TradingViewやMetaTraderのRSIと一致させたい場合は、TA-Libの計算結果をそのまま信頼してください。これらのツールもWilder方式を採用しています。
まとめ
この記事では、テクニカル分析ライブラリ「TA-Lib」のOS別インストール手順と、RSI・ボリンジャーバンド・MACDを実際に算出するPythonコードを解説しました。
要点を整理します。
* TA-Libは200種類以上のテクニカル指標を関数1つで算出できるライブラリであり、計算精度と速度の両面で自力実装より優れています
* Windowsでは pip install ta-lib が通らないケースが大半のため、ビルド済みホイール(.whlファイル)またはcondaを使ってインストールしてください
* 関数の戻り値の数は指標ごとに異なるため、公式ドキュメントまたは help() で事前に確認してください
* TA-LibのRSIはWilder方式であり、SMA方式の自力実装とは結果がズレる点に注意してください
* 先頭のNaN行はグラフ描画やシグナル生成でエラーの原因になるため、明示的に除去またはスキップしてください
次のステップとして、TA-Libで算出した指標を売買シグナルに変換し、バックテストでパフォーマンスを検証する工程に進んでみてください。
calc_indicators() 関数に talib.ATR() や talib.STOCH() を追加するだけで、分析対象の指標を自由に拡張できます。

