05.1.2
mplfinance
DataFrame を渡すと mpf.plot(df, type="candle") の 1 行でローソク足が描けます。このページでは pandas_datareader で NVIDIA(NVDA)の 2021 年 1〜6 月の株価を取得して CSV にキャッシュし、mav=[5, 25, 75] で 3 本の移動平均線、volume=True で出来高パネル、returnfig=True と fig.legend で凡例を順に足していきます。1 枚ずつ要素が増えるので、どの引数が図のどの部分を変えるかを対応づけて覚えられます。読み終えると、別の銘柄・別の期間でも 10 行以内で同じチャートを再現できるようになります。直感 #
株価の折れ線グラフは「終値がどう動いたか」しか教えてくれません。ローソク足は 1 日を 1 本の箱で表し、箱の上下が始値と終値、箱から伸びる線(ひげ)が高値と安値なので、「寄り付きから下げたが引けで戻した」といった 1 日の中の攻防まで読めます。mplfinance は OHLC の列名さえ揃っていれば、その箱とひげの描画、移動平均線の計算、出来高の棒グラフをすべて引数の指定だけで済ませてくれます。使い方は mplfinance リポジトリの『Tutorial』 にあります。このページではその中から type、mav、volume、returnfig の 4 つの引数を順に試します。
データの読み込み #
株価の取得には pandas_datareader を使います。Yahoo Finance への問い合わせが失敗したときに捕まえる例外 RemoteDataError も合わせて読み込みます。
| |
次の関数は、銘柄コードと期間を受け取って株価を取得し、savedir に CSV として保存します。2 回目以降は CSV を読むだけです。
| |
NVIDIA(NVDA)の 2021 年 1 月 1 日から 6 月 30 日までを取得します。head() で OHLC の 6 列が揃っているかを確認します。
| |
| High | Low | Open | Close | Volume | Adj Close | |
|---|---|---|---|---|---|---|
| Date | ||||||
| 2020-12-31 | 131.509995 | 129.149994 | 131.365005 | 130.550003 | 19242400.0 | 130.413864 |
| 2021-01-04 | 136.524994 | 129.625000 | 131.042496 | 131.134995 | 56064000.0 | 130.998245 |
| 2021-01-05 | 134.434998 | 130.869995 | 130.997498 | 134.047501 | 32276000.0 | 133.907700 |
| 2021-01-06 | 132.449997 | 125.860001 | 132.225006 | 126.144997 | 58042400.0 | 126.013443 |
| 2021-01-07 | 133.777496 | 128.865005 | 129.675003 | 133.440002 | 46148000.0 | 133.300842 |
OHLC をローソク足と折れ線で描く #
OHLC とは始値(Open)・高値(High)・安値(Low)・終値(Close)の 4 つの値です。同じ df を type="candle" と type="line" の 2 通りで描き、ローソク足が折れ線より多くの情報を持っていることを確かめます。
| |


実行結果の読み方 #
1 枚目では 2021 年 2 月中旬の下落局面に長い陰線(下げの箱)が続き、5 月下旬から 6 月にかけて短い陽線が積み上がる様子が見えます。2 枚目の折れ線は同じ期間の終値だけなので、2 月の下げが「大きな値幅の日が連続した」のか「じりじり下げた」のかは区別できません。
移動平均線 #
移動平均線は、直近 n 日の終値(Close)の平均を日ごとに結んだ線で、5 日線なら 1 週間分の揺れを平らにして流れを見るための指標です。
現在のテクニカル分析では、短期、中期、長期の3本の移動平均線を同時に表示させる例が多く、日足チャートでは、5日移動平均線、25日移動平均線、75日移動平均線がよく使われる。(引用元:Wikipedia 移動平均線)
5 / 25 / 75 日移動平均線を描くには mav 引数に日数のリストを渡すだけで、rolling().mean() を自分で計算する必要はありません。
| |

凡例の表示 #
3 本の線のどれが 5 日線かが図から分からないので、matplotlib の Figure を受け取って凡例を足します。
| |
<matplotlib.legend.Legend at 0x7f8be96e5b80>

ボリュームの表示 #
出来高(1 日に売買された株数)は株価の動きが「どれだけの参加者を伴っていたか」を示します。volume=True を足すと下段に出来高の棒グラフが加わります。あわせて title と datetime_format で図のタイトルと日付表記も整えます。
| |
<matplotlib.legend.Legend at 0x7f8beac867f0>

同じ引数で style だけを "yahoo" に替えると、Yahoo Finance の画面に近い緑と赤の配色になります。配色以外の情報は 1 枚前の図とまったく同じです。
| |

使いどころと落とし穴 #
mpf.plot は索引が DatetimeIndex で、列名が Open / High / Low / Close / Volume でないと動きません。CSV から読み戻したときは pd.to_datetime(res.index) を忘れないこと、日本株データのように列名が小文字や日本語の場合は df.rename(columns=...) で揃えることが最初のつまずきどころです。移動平均線は窓の長さ分だけ先頭が NaN になるため、75 日線を見たいなら少なくとも 4 か月以上の期間を取得します。pandas_datareader の Yahoo ソースは仕様変更で止まることがあります。取得に失敗したら yfinance パッケージに切り替えてください。
まとめ #
ローソク足は mpf.plot(df, type="candle") の 1 行で描け、mav=[5, 25, 75] で移動平均線、volume=True で出来高パネル、returnfig=True と fig.legend で凡例が順に足せます。データ側は get_finance_data() のように CSV にキャッシュしておくと、Yahoo への問い合わせを 1 回で済ませながら何度でも図を作り直せます。次は RSI のページで、この OHLC データからテクニカル指標を計算してチャートに重ねます。