Pythonで株価分析。
シンプルなコードでローソク足チャートを描画するなら、mplfinanceをオススメします。
ローソク足を表示するコードは、たったこれだけです。 mpf.plot(df, type=’candle’)
このブログ記事は、YouTubeの動画と連携しています。
動画で解説したサンプルコードを掲載していますので、合わせてご覧いただくことでより理解が深まると思います。
動画はこちら
【目次】
00:00 チャンネル紹介
00:27 本編開始
01:09 動画解説の流れ
01:53 mplfinance
02:23 株価データーの取得
03:34 ローソク足の描画
04:24 移動平均線を描画
05:01 2本の移動平均線を描画
05:18 3本の移動平均線を描画
05:27 ラインチャートを描画
05:50 バーチャートを描画
05:59 株価データーの形式
06:52 スタイルの変更
10:32 ローソク足の色を変更
13:37 サブプロット
17:31 追加グラフを表示
20:12 GitHubサンプルコード
27:17 MACDのプロット
33:17 チートシート
34:49 任意のラインを引く
40:42 ローソク足の色を設定
42:32 チャートを画像として保存
43:39 大きな株価データーで警告解除
45:53 plotlyチャート
47:25 おわりに
mplfinanceのインストール
pipでインストールします。
1 |
pip install --upgrade mplfinance |
mplfinanceをインポート
1 |
import mplfinance as mpf |
株価データーを取得
1 2 3 4 5 6 7 8 9 10 11 12 13 |
from pandas_datareader import data import pandas as pd import numpy as np # トヨタ自動車の株価データを取得 ポーランドの'stooq'というAPIから取得 #データーフレーム== data.DataReader(銘柄コード.JP, '取得先' 取得するはじめの期日) df = data.DataReader('7203.JP', 'stooq',start='2022-01-01') # 日付の古い順に並び替え df.sort_index(inplace=True) # APIサーバーに無用な負荷をかけないように、CSVファイルに保存 # df.to_csv('7203_stooq_s.csv') |
ローソク足を描画するコードは たった1行!!
GitHub https://github.com/matplotlib/mplfinance#newapi
1 |
mpf.plot(df, type='candle') |
出来高を表示
1 |
mpf.plot(df, type='candle', volume=True) |

株価データーに含まれていない移動平均線を描画
移動平均線1本
1 2 |
#mpf.plot(データーフレーム、チャートタイプ、出来高表示の有無、移動平均描画(足数)) mpf.plot(df,type='candle',volume=True, mav=(5)) |
移動平均線2本
1 2 |
#mpf.plot(データーフレーム、チャートタイプ、出来高表示の有無、移動平均描画(足数,足数)) mpf.plot(df,type='candle',volume=True, mav=(5,10)) |

移動平均線3本
1 2 |
#mpf.plot(データーフレーム、チャートタイプ、出来高表示の有無、移動平均描画(足数,足数、足数)) mpf.plot(df,type='candle',volume=True, mav=(5,10,15)) |

ラインチャート
1 2 3 4 |
# ラインチャートを描画するには、 # type='candle' ⇒ type='line' に変更するだけ。 mpf.plot(df,type='line',volume=True) |

バーチャート
1 2 3 |
# type指定無し(デフォルト)はバーチャート mpf.plot(df,volume=True) |

株価データーの形式
これまで見てきたように、mplfinanceでは1行のコードで株価チャートを描画することができました。
この超絶なシンプルさを実現する為に、株価データーの形式にほんの少しだけ制限があります。
– インデックスはdatetime型であること
– 4本値 Open,High,Low,Close すべてのデーターが揃っていること
– 出来高を表示させるのであれば、Volumeのデーターが含まれていること
ー 4本値及び出来高の列名は、Open,High,Low,Close,Volumeであること
スタイルの変更
mplfinance styles are used to customize:
candle colors(ローソク足の色)
moving average colors(移動平均線の色)
background, grid, and figure colors(背景、グリッド、および図の色)
grid style(グリッドスタイル)
y-axis on the right or left(軸)
matplotlib defaults(matplotlibのデフォルト)
1 2 3 4 |
# This allows multiple outputs from a single jupyter notebook cell: # 以下のコードを実行することにより、単一のjupyterノートブックセルから複数の出力が可能になります。 from IPython.core.interactiveshell import InteractiveShell InteractiveShell.ast_node_interactivity = "all" |
1 2 |
# Jupyter Notebookでmatplotlibを使用する場合のおまじない %matplotlib inline |
1 2 3 4 5 |
# mplfinanceをmpfという名前でインポート # インポートしたバージョンを取得 import mplfinance as mpf mpf.__version__ |
‘0.12.8b9’
1 2 3 4 |
# 現在インストールされているmpfスタイルを確認します。 # 以下のコードでmpfスタイルの一覧を取得する事ができます。 mpf.available_styles() |
[‘binance’,
‘blueskies’,
‘brasil’,
‘charles’,
‘checkers’,
‘classic’,
‘default’,
‘ibd’,
‘kenan’,
‘mike’,
‘nightclouds’,
‘sas’,
‘starsandstripes’,
‘yahoo’]
1 2 3 4 5 6 |
# First we set the kwargs that we will use for all of these examples: # GitHubのサンプルコードの通りに記述します。 # kwargsキーワード引数 にパラメーターを渡します。 kwargs = dict(type='candle',mav=(2,4,6),volume=True,figratio=(11,8),figscale=0.85) |
1 2 |
# kwargsキーワード引数 **を付けて可変長引数として指定 mpf.plot(df,**kwargs,style='classic') |
1 2 |
#シンプルに記述 style='ここでスタイルを指定' mpf.plot(df, type='candle', volume=True, style='classic') |
ローソク足の色を変更
- ローソク足の色を変更する方法
- make_marketcolorメソッドで色を指定
- make_mpf_styleメソッドでスタイルを作成
1 2 3 4 5 |
#上昇色:グリーン、下降色:レッドを指定 mc = mpf.make_marketcolors(up='g',down='r') s = mpf.make_mpf_style(marketcolors=mc) mpf.plot(df,type='candle', volume=True, style=s) |
1 2 3 4 5 6 7 |
#上昇色、下降色の入れ替え #上昇色:レッド、下降色:グリーンを指定 mc = mpf.make_marketcolors(up='r',down='g') s = mpf.make_mpf_style(marketcolors=mc) mpf.plot(df,type='candle',volume=True, style=s) |
1 2 3 4 5 6 7 |
#カラーコードで上昇色、下降色を指定する #上昇色: レッド(#ff0000)、下降色:グリーン(#008000)を指定 mc = mpf.make_marketcolors(up='#ff0000',down='#008000') s = mpf.make_mpf_style(marketcolors=mc) mpf.plot(df,type='candle',volume=True, style=s) |
カラーコードはこちらのサイトを参考にさせていただきました。
WEB色見本 原色大辞典 – HTMLカラーコード https://www.colordic.org/
その他のスタイル変更
ローソク足を描画するコードは たった1行!!
こうして始まった解説ですが、細かい設定を変更するとコードは長くなってしまいます。
その他のスタイル設定はこちらのサイトが参考になります。
vucavucalife https://vucavucalife.com/python-mplfinance-candle-stick-style/
グラフを追加する サブプロット
株価データー再確認
1 2 |
df.head(3) df.tail(3) |

安値を結ぶ線を追加
- グラフを追加する方法
- make_addplotメソッドで追加するデーターを指定
- plotメソッドのaddplot引数でデーター追加を指定
1 2 3 |
apdict = mpf.make_addplot(df['Low']) mpf.plot(df, type='candle', volume=True, addplot=apdict) |
プロットの種類を変更
1 2 3 4 |
# type='scatter' apdict = mpf.make_addplot(df['Low'], type='scatter') mpf.plot(df, type='candle', volume=True,addplot=apdict) |

1 2 3 4 |
# type='scatter' marker▲ apdict = mpf.make_addplot(df['Low'], type='scatter', marker='^', markersize=500) mpf.plot(df, type='candle', volume=True,addplot=apdict) |
高値と安値を結ぶ線を追加
1 2 3 |
tcdf = df[['High','Low']] # DataFrame with two columns apd = mpf.make_addplot(tcdf) mpf.plot(df, type='candle', addplot=apd) |

別の記述方法
1 2 3 4 |
apds = [mpf.make_addplot(df['High']), mpf.make_addplot(df['Low']),] mpf.plot(df, type='candle', addplot=apds) |

追加したグラフの色を指定
1 2 3 4 5 |
#個人的にはこちらの記述の方が直感的に分かりやすいと感じています。 apds = [mpf.make_addplot(df['High'],color='g'), mpf.make_addplot(df['Low'],color='r'),] mpf.plot(df, type='candle', addplot=apds) |

下のパネルに追加グラフを描画する
GitHub https://github.com/matplotlib/mplfinance/blob/master/examples/panels.ipynb
- 下のパネルに追加グラフを描画する方法
- panelで何段目のパネル(枠)グラフを描くかを指定します。
- secondary_yでy軸を別軸にするかを指定します。
- panelは、1がローソク足チャートの次になります。以降2、3、4・・・と追加されます。
1 2 3 4 5 6 7 |
# panelで何段目のパネル(枠)グラフを描くかを指定します。 # secondary_yでy軸を別軸にするかを指定します。 apds = [mpf.make_addplot(df['High'],color='g', panel=1, secondary_y=False)] #apds = [mpf.make_addplot(df['High'],color='g', panel=1, secondary_y=True)] mpf.plot(df, type='candle', addplot=apds) |
1 2 3 4 |
apds = [mpf.make_addplot(df['High'],color='g', panel=1, secondary_y=False), mpf.make_addplot(df['Low'],color='r', panel=2, secondary_y=False)] mpf.plot(df, type='candle', addplot=apds) |
パネルの入れ替え
1 |
mpf.plot(df,type='candle', volume=True) |

1 2 |
# メインパネルとボリュームパネルの入れ替え mpf.plot(df,type='candle',volume=True,main_panel=1,volume_panel=0) |
パネルのサイズ変更
1 2 |
# パネルのサイズは比率で指定する。 panel_ratios=(1,1) mpf.plot(df, type='candle', volume=True, panel_ratios=(1,1)) |

1 2 |
# パネルのサイズは比率で指定する。 panel_ratios=(4,1) mpf.plot(df, type='candle', volume=True, panel_ratios=(4,1)) |
GitHubのサンプルコードでサブプロットをもっと詳しく
GitHubのmatplotlib/mplfinanceページに掲載されている、サンプルコードを使ってもっと詳しく解説します。
今までの解説と重複する部分がありますが、ご容赦願います。
サブプロットの解説は飛ばして次に進みたい方は、動画の概要欄の目次からスキップしてください。
※サンプルコードは一部変更しています
https://github.com/matplotlib/mplfinance/blob/master/examples/panels.ipynb
解説で使用する株価データーは、こちらのページから取得する事ができます。
https://github.com/matplotlib/mplfinance/tree/master/examples/data
株価データーをGitHubのCSVファイルからデーターフレームに取得
1 2 3 4 5 6 7 |
# GitHubのファイルパス path = 'https://raw.githubusercontent.com/matplotlib/mplfinance/master/examples/data/SPY_20110701_20120630_Bollinger.csv' # Dateをdatetime型インデックスに指定してデーターフレームに取得 df = pd.read_csv(path,index_col=0,parse_dates=True) df |
取得したデータフレームから5か月分のデータを取得しましょう。
1 |
df = df.loc['2011-07-01':'2011-12-30',:] |
1 2 3 |
import mplfinance as mpf mpf.__version__ mpf.plot(df,type='candle', volume=True) |
‘0.12.8b9’
メインのパネルとボリュームを含むパネルを切り替えます。
1 |
mpf.plot(df,type='candle',volume=True,main_panel=1,volume_panel=0) |
両方のパネルを同じサイズにします。
1 2 3 |
# パネルのサイズは比率で指定する。 panel_ratios=(1,1) mpf.plot(df,type='candle',volume=True,panel_ratios=(1,1)) |

1 2 |
# パネルのサイズは比率で指定する。 panel_ratios=(4,1) mpf.plot(df,type='candle',volume=True,panel_ratios=(4,1)) |
3番目のパネルを追加
ボリンジャーデータを含む3番目のパネルを追加しましょう。
デフォルトでは、addplotはPanel0を使用します。
1 2 3 4 5 6 7 8 9 |
ap0 = [ mpf.make_addplot(df['UpperB'],color='g'), # uses panel 0 by default mpf.make_addplot(df['LowerB'],color='b'), # uses panel 0 by default ] mpf.plot(df,type='candle',volume=True,addplot=ap0) ap2 = [ mpf.make_addplot(df['UpperB'],color='g',panel=2), # panel 2 specified mpf.make_addplot(df['LowerB'],color='b',panel=2), # panel 2 specified ] mpf.plot(df,type='candle',volume=True,addplot=ap2) |

3つのパネルサイズの指定
- パネルサイズを指定する方法は2つです
- パネル毎に指定
- 2つのサイズを指定して、最初の番号はメインパネルに適用され、2番目の番号は他のすべてのパネルに適用
※デフォルトはメインパネルが他のパネルの2.5倍
1 2 3 4 5 |
#まずは3つのパネルを表示させます。 ap2 = [ mpf.make_addplot(df['UpperB'],color='g',panel=1), mpf.make_addplot(df['LowerB'],color='b',panel=1), ] mpf.plot(df,type='candle',volume=True,main_panel=2,volume_panel=0,addplot=ap2) |

上のチャートの場合、デフォルトはメインパネルが他のパネルの2.5倍。
- パネル毎に指定
- specifying panel_ratios=(2,2,5) ←この指定と同じ
- 2つのサイズを指定して、最初の番号はメインパネルに適用され、2番目の番号は他のすべてのパネルに適用
- pecifying panel_ratios=(5,2) ←この指定と同じ
1 2 3 |
# パネル毎に指定 比率 4:3:3 mpf.plot(df,type='candle',volume=True,main_panel=2,volume_panel=0, addplot=ap2,panel_ratios=(4,3,3)) |

1 2 3 |
# パネル毎に指定 比率 4:1.5:5 mpf.plot(df,type='candle',volume=True,main_panel=2,volume_panel=0, addplot=ap2,panel_ratios=(4,1.5,5)) |
MACDプロットを作成する
MACDを算出します。
1 2 3 4 |
#Pandasを使用して、12期間と26期間の指数平滑移動平均(EMA)を計算します。 exp12 = df['Close'].ewm(span=12, adjust=False).mean() exp26 = df['Close'].ewm(span=26, adjust=False).mean() |
1 2 |
# MACDラインは、これら2つの移動平均の差として定義されます。 macd = exp12 - exp26 |
1 2 3 4 5 |
# MACDシグナルを、MACDラインの9周期の指数平滑移動平均として定義します。 # また、ヒストグラムとしてプロットするMACDラインとMACDシグナルの差を計算します。 signal = macd.ewm(span=9, adjust=False).mean() histogram = macd - signal |
MACDをプロットする
1 2 3 4 5 6 7 8 9 10 |
apds = [mpf.make_addplot(exp12,color='lime'), mpf.make_addplot(exp26,color='c'), mpf.make_addplot(histogram,type='bar',width=0.7,panel=1, color='dimgray',alpha=1,secondary_y=False), mpf.make_addplot(macd,panel=1,color='fuchsia',secondary_y=True), mpf.make_addplot(signal,panel=1,color='b',secondary_y=True), ] mpf.plot(df,type='candle',addplot=apds,figscale=1.1,figratio=(8,5),title='\nMACD', style='blueskies',volume=True,volume_panel=2,panel_ratios=(6,3,2)) |

同じプロットを別のスタイルに変更して描画
1 2 3 4 |
s = mpf.make_mpf_style(base_mpf_style='classic',rc={'figure.facecolor':'lightgray'}) mpf.plot(df,type='candle',addplot=apds,figscale=1.1,figratio=(8,5),title='\nMACD', style=s,volume=True,volume_panel=2,panel_ratios=(6,3,2)) |

チート
簡単にローソク足が描画出来る mplfinance ですが、多様なカスタマイズも可能です。
しかし、そろそろ頭が混乱してきた頃ではないでしょうか?
↓↓↓こちらのサイトでmplfinanceのチートシートが公開されています。 (投稿者さんありがとうございます。)
Qiita mplfinanceで作成するローソク足チャートのチートシート
https://qiita.com/kotabook/items/a9d62e0e1bbe1f45d64a
水平線
1 |
mpf.plot(df,type='candle', volume=True, hlines=[130,120]) |

水平線のスタイル変更
1 |
mpf.plot(df,hlines=dict(hlines=[130,120],colors=['g','r'],linestyle='-.'),type='candle') |

垂直線
1 |
mpf.plot(df,type='candle',vlines=dict(vlines=['2011-07-06','2011-9-23','2011-12-25'],linewidths=(1,2,3))) |
範囲指定
1 2 |
# 透明度 alpha=0.4 mpf.plot(df,type='candle',vlines=dict(vlines='2011-09-23',linewidths=125,alpha=0.4)) |

1 2 3 4 |
# 垂直線の色を変更 mpf.plot(df,type='candle', vlines=dict(vlines=['2011-07-06','2011-9-23','2011-12-25'], linewidths=(1,2,3),colors=('r','g','b'))) |
1 2 3 4 5 6 |
# コードの書き方を変更 vls=['2011-07-06', '2011-9-23', '2011-12-25'] mpf.plot(df,type='candle', vlines=dict(vlines=vls, linewidths=(1,2,3),colors=('r','g','b'))) |
2つ以上の点を指定
1 2 3 4 5 |
# 期間内の最高値・最安値・最終日の終値をライン描画 more_points = [('2011-07-07',135.699997),('2011-10-04',107.43),('2011-12-30',125.5)] mpf.plot(df,type='candle', alines=more_points) |
1 2 3 4 5 6 7 8 9 10 11 |
# 新規にローソク足(4本値)データーを作成 ix = pd.DatetimeIndex(['2021-10-11','2021-10-12','2021-10-13','2021-10-14','2021-10-15']) df = pd.DataFrame(dict( Open=[131.4, 131.9, 132.0, 130.9, 131.6], High=[133.2, 132.7, 133.2, 132.7, 131.8], Low=[131.3, 131.3, 131.5, 130.6, 130.7], Close=[132.1, 131.4, 131.8, 132.1, 131.0], Volume=[19591, 21467, 20406, 22611, 22001]), index=ix) df mpf.plot(df,volume=True,style='yahoo',type='candle') |

3番目のキャンドルを黄色に、4番目のキャンドルを青に着色する。
1 2 |
mco = [None,None,'yellow','blue',None] mpf.plot(df,volume=True,style='yahoo',type='candle',marketcolor_overrides=mco) |

1 2 3 4 |
# mco_faceonly=True でキャンドルの実体のみ変更する(枠線は変わらない) mco = [None,None,'yellow','blue',None] mpf.plot(df,volume=True,style='yahoo',type='candle',marketcolor_overrides=mco,mco_faceonly=True) |
自由にカスタマイズする事ができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# =============================================================================================== # Here we specify `up` as rgba using the matplotlib convention: rgb are floats from 0.0 and 1.0 : mc = mpf.make_marketcolors(base_mpf_style='yahoo',up=(0.7,1.0,0.7,0.4),down='fuchsia', edge={'up':'blue','down':'#000000'},wick='#cc6600') mco = [None,None,mc,mc,None] mpf.plot(df,volume=True,style='yahoo',type='candle',marketcolor_overrides=mco) # ==================================================================================== # Here we specify `up` as rgba using the convention that rgb are ints from 0 and 255 : mc = mpf.make_marketcolors(base_mpf_style='yahoo',up=(178,255,178,0.4),down='fuchsia', edge={'up':'blue','down':'#000000'},wick='#cc6600') mco = [None,None,mc,mc,None] mpf.plot(df,volume=True,style='yahoo',type='candle',marketcolor_overrides=mco) |

画像として保存する
1 2 |
# savefig='testsave.png' でローソク足チャートを png形式で保存する。 mpf.plot(df,type='candle',volume=True,savefig='testsave.png') |
保存した画像ファイルを表示する。
1 2 |
# 画像ファイルを表示させるためのライブラリーをインポートします。 import IPython.display as IPydisplay |
1 2 3 |
%ls -l testsave.png IPydisplay.Image(filename='testsave.png') |
ドライブ C のボリューム ラベルは Windows です
ボリューム シリアル番号は B67A-9E44 です
C:\Users\ashio\workspace\Template のディレクトリ
C:\Users\ashio\workspace\Template のディレクトリ
2022/02/13 13:31 22,260 testsave.png
1 個のファイル 22,260 バイト
0 個のディレクトリ 310,327,472,128 バイトの空き領域
1 2 |
# savefig='testsave.png' でローソク足チャートを jpeg形式で保存する。 mpf.plot(df,type='candle',volume=True,savefig='testsave.jpg') |
1 |
IPydisplay.Image(filename='testsave.jpg') |

大きなデーターで警告が出る場合
大きなデーターをmplfinanceで描画しようとすると警告が出る場合があります。
1 2 3 4 5 6 7 8 9 10 11 12 |
from pandas_datareader import data import pandas as pd import numpy as np # 株価データを取得 #df = data.DataReader('7203.JP', 'stooq') # 日付の古い順に並び替え #df.sort_index(inplace=True) # APIサーバーに無用な負荷をかけないように、CSVファイルに保存 #df.to_csv('7203_stooq.csv') |
1 2 |
#保存した株価データーをデーターフレームに取得 インデックスをdatetime型で取得 df = pd.read_csv('7203_stooq.csv',index_col='Date',parse_dates=True) |
1 2 3 4 5 |
#このままローソク足を描画すると警告が出ます mpf.plot(df,type='candle') #警告を出さないためにオプション指定 mpf.plot(df,type='candle',warn_too_much_data=1500) |

plotly紹介
今回の動画では、たった1行でローソク足チャートを描画することができる、
mplfinanceを紹介しました。
株価データーをあれこれ分析している最中に、パッとローソク足チャートを表示できる快適さは、何者にも変えられません。
ただし、定型的なチャート分析にはplotlyを使っています。
ごく簡単にplotlyを紹介して、この動画解説を終わりにしたいと思います。
1 2 3 4 5 6 7 8 9 10 11 12 |
import plotly.graph_objects as go import pandas as pd df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/finance-charts-apple.csv') fig = go.Figure(data=[go.Candlestick(x=df['Date'], open=df['AAPL.Open'], high=df['AAPL.High'], low=df['AAPL.Low'], close=df['AAPL.Close']) ]) fig.update_layout(xaxis_rangeslider_visible=False) #fig.show() |

※この上のチャートは画像として表示していますので、インタラクティブな表現はしません。
この記事を書いた人
あしおゆたか
株式投資歴22年のシステムトレーダー(←主な取引手法)
机上の理論ではなく、実体験に基づいた記事作りをモットーにしています。
スポーツクラブに毎週2日~3日通い、サウナ後の暴飲暴食が趣味。
◇主な投資対象
日本株式
株式ETF(上場投資信託)
日経225先物
日経225先物オプション
◇運営者情報はこちら