ローソク足チャートを matplotlib だけで描こうとすると、四角と髭を 1 本ずつ描く処理を書く必要があります。これを薄くラップして、OHLC(始値・高値・安値・終値) と日付があれば 1 行で描けるようにしたのが mplfinance です。
本記事では、mplfinance の基本的な呼び出しと、移動平均線・出来高サブプロットを組み合わせるパターンを示します。
目次
- インストール
- サンプルデータの準備
- 最もシンプルな呼び出し
- 出来高サブプロットを足す
- 移動平均線を重ねる
- カスタム指標を重ねる(addplot)
- スタイル(色・テーマ)
- 期間を絞って描く
インストール
pip install mplfinance pandas検証バージョン: Python 3.12.5 / mplfinance 0.12.10b0 / pandas 2.2.3
サンプルデータの準備
mplfinance は Open、High、Low、Close、Volume の 5 列を持つ DataFrame で、DatetimeIndex を期待します。J-Quants V2 API は O/H/L/C/Vo という省略名で返すため、取得後に mplfinance 用の列名へ変換します。学習用に乱数で OHLC を生成します。
import numpy as npimport pandas as pd
rng = np.random.default_rng(7)dates = pd.date_range("2026-01-05", periods=80, freq="B")close = 2900 + rng.normal(0, 30, len(dates)).cumsum()
# J-Quants V2 の列名(O/H/L/C/Vo)で疑似 OHLC を生成df = pd.DataFrame(index=dates)df.index.name = "Date"df["O"] = close + rng.normal(0, 5, len(dates))df["H"] = np.maximum(df["O"], close) + np.abs(rng.normal(0, 8, len(dates)))df["L"] = np.minimum(df["O"], close) - np.abs(rng.normal(0, 8, len(dates)))df["C"] = closedf["Vo"] = rng.integers(8_000_000, 15_000_000, len(dates))
# mplfinance は Open/High/Low/Close/Volume を要求するため変換するdf = df.rename(columns={"O": "Open", "H": "High", "L": "Low", "C": "Close", "Vo": "Volume"})print(df.head())mplfinance は 列名・インデックス名の大文字小文字に厳格 です。Open/High/Low/Close/Volume と Date を厳守します(J-Quants V2 の O/H/L/C/Vo から変換した状態)。
最もシンプルな呼び出し
import mplfinance as mpf
mpf.plot(df, type="candle", style="charles", savefig="candle_basic.png")
type="candle" でローソク足、style="charles" でカジュアルな白背景になります。savefig を渡すとファイル保存だけして画面表示はしません。
type には "line"(終値ライン)、"ohlc"(バーチャート)、"renko" などがあります。
出来高サブプロットを足す
volume=True を指定すると、下段に出来高の棒グラフが自動で並びます。
mpf.plot( df, type="candle", style="charles", volume=True, figratio=(12, 6), title="Synthetic OHLC", savefig="candle_volume.png",)figratio は縦横比、title はタイトルです。サブプロットの高さ比は内部で自動調整されます。
移動平均線を重ねる
mav 引数に整数のタプルを渡すと、その期間の単純移動平均を自動で計算して重ねます。
mpf.plot( df, type="candle", style="charles", mav=(5, 25, 75), volume=True, figratio=(12, 6), title="OHLC with SMA(5,25,75)", savefig="candle_mav.png",)
5 日・25 日・75 日の SMA が線で表示されます。色は style から自動で割り当てられます。
mav を自分で計算した値で重ねたい場合や、EMA を表示したい場合は、後述の addplot を使います。
カスタム指標を重ねる(addplot)
ボリンジャーバンドや独自シグナルを重ねるときは addplot を使います。先に DataFrame に同じインデックスで値を加え、mpf.make_addplot で指示します。
df["sma_25"] = df["Close"].rolling(25).mean()df["upper"] = df["sma_25"] + 2 * df["Close"].rolling(25).std()df["lower"] = df["sma_25"] - 2 * df["Close"].rolling(25).std()
addplots = [ mpf.make_addplot(df["sma_25"], color="C0", width=1.0), mpf.make_addplot(df["upper"], color="C1", width=0.8, linestyle="--"), mpf.make_addplot(df["lower"], color="C1", width=0.8, linestyle="--"),]
mpf.plot( df, type="candle", style="charles", addplot=addplots, volume=True, figratio=(12, 6), title="Bollinger bands (25, 2σ)", savefig="candle_bb.png",)make_addplot は panel= 引数で「下段に別パネルを足す」こともできます。RSI や MACD などのオシレーター系を別パネルで描く時に使います。
df["rsi"] = 50 + rng.normal(0, 10, len(dates)) # 学習用ダミーaddplots = [ mpf.make_addplot(df["rsi"], panel=2, color="C2", ylabel="RSI"),]mpf.plot( df, type="candle", style="charles", addplot=addplots, volume=True, panel_ratios=(3, 1, 1), figratio=(12, 7), savefig="candle_rsi.png",)panel=0 がメインパネル、panel=1 が出来高パネル、それ以降は追加パネルになります。panel_ratios で各パネルの高さ比を指定します。
スタイル(色・テーマ)
style で全体の見た目を切り替えます。
| スタイル | 印象 |
|---|---|
"default" | 標準。やや古典的 |
"charles" | 薄い白背景、ローソクは赤緑 |
"yahoo" | Yahoo! Finance 風の白基調 |
"binance" | 黒背景、暗号資産系の見た目 |
"checkers" | チェック柄の落ち着いた背景 |
カスタムスタイルを作りたいときは mpf.make_marketcolors と mpf.make_mpf_style を使います。
mc = mpf.make_marketcolors(up="#2ca02c", down="#d62728", inherit=True)custom_style = mpf.make_mpf_style(base_mpf_style="yahoo", marketcolors=mc)mpf.plot(df, type="candle", style=custom_style, savefig="candle_custom.png")期間を絞って描く
長期データを丸ごと描くと潰れて見えません。スライスで期間を絞ってから渡します。
df_recent = df.loc["2026-03":]mpf.plot(df_recent, type="candle", style="charles", mav=(5, 25), volume=True, savefig="candle_recent.png")DatetimeIndex の文字列スライス(#4-4「pandas で時系列を扱う」)が使えるため、簡潔に範囲を指定できます。
注意点
- mplfinance はラッパーである以上、こまかい体裁調整(目盛りフォント、第 2 軸など)は限界があります。込み入った調整が必要なら、生の matplotlib に戻るか、Plotly(#4-8「Plotly でインタラクティブな株価チャート」)を検討します
- 出来高列に欠損があると描画に失敗します。
fillna(0)などで埋めてから渡します mavのような自動計算は便利ですが、長期 SMA を含めるとデータの先頭が歯抜けになります。期間を絞るか、SMA を別途計算してaddplotで渡すのも一手です
生成AI へのプロンプト例
mplfinance はインターフェースがやや独特なので、要件を具体化してプロンプトを書きます。
mplfinance でローソク足チャートを描くコードを書いてください。
入力:- df: DatetimeIndex を持つ DataFrame- 列: O, H, L, C, Vo- 期間: 直近 6 ヶ月分
要件:- メインパネルに SMA(25) と SMA(75) を重ねる(自分で計算して addplot で渡す)- 下段に出来高、さらに下段に RSI(14) のサブパネル- panel_ratios は (3, 1, 1)- スタイルは "charles"、figratio は (12, 7)- 結果は dpi=120 で candle.png に保存- mplfinance 0.12 系「列名」「パネル構成」「期間」を明示するのがコツです。
まとめ
- mplfinance は OHLC + 出来高の DataFrame を受け取り、ローソク足を 1 行で描ける
mavで SMA を自動描画、addplotで任意の指標を重ねられる- 出来高は
volume=True、追加パネルはpanel=で指定する - 込み入った体裁調整が必要なら matplotlib(#4-6「matplotlib で描く基本のチャート」)や Plotly(#4-8「Plotly でインタラクティブな株価チャート」)に切り替える