K_DM Book
用語集
対象者 標準
対象者別の入口 →

対象者の設定はこのブラウザの中にだけ保存されます。

言語 JA

mplfinance

05.1.2

mplfinance

最終更新 2020-02-12 読了時間 5 分
まとめ
mplfinance は matplotlib の上に作られた金融チャート専用ライブラリで、始値・高値・安値・終値(OHLC)の 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 も合わせて読み込みます。

1
2
3
4
5
import os
import time
import pandas as pd
import pandas_datareader.data as web
from pandas_datareader._utils import RemoteDataError

次の関数は、銘柄コードと期間を受け取って株価を取得し、savedir に CSV として保存します。2 回目以降は CSV を読むだけです。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
def get_finance_data(
    ticker_symbol: str, start="2021-01-01", end="2021-06-30", savedir="data"
) -> pd.DataFrame:
    """株価を記録したデータを取得します

    Args:
        ticker_symbol (str): Description of param1
        start (str): 期間はじめの日付, optional.
        end (str): 期間終わりの日付, optional.

    Returns:
        res: 株価データ

    """
    res = None
    filepath = os.path.join(savedir, f"{ticker_symbol}_{start}_{end}_historical.csv")
    os.makedirs(savedir, exist_ok=True)

    if not os.path.exists(filepath):
        try:
            time.sleep(5.0)
            res = web.DataReader(ticker_symbol, "yahoo", start=start, end=end)
            res.to_csv(filepath, encoding="utf-8-sig")
        except (RemoteDataError, KeyError):
            print(f"ticker_symbol ${ticker_symbol} が正しいか確認してください。")
    else:
        res = pd.read_csv(filepath, index_col="Date")
        res.index = pd.to_datetime(res.index)

    assert res is not None, "データ取得に失敗しました"
    return res

NVIDIA(NVDA)の 2021 年 1 月 1 日から 6 月 30 日までを取得します。head() で OHLC の 6 列が揃っているかを確認します。

1
2
3
4
5
6
7
8
# 銘柄名、期間、保存先ファイル
ticker_symbol = "NVDA"
start = "2021-01-01"
end = "2021-06-30"

# データを取得する
df = get_finance_data(ticker_symbol, start=start, end=end, savedir="../data")
df.head()

HighLowOpenCloseVolumeAdj Close
Date
2020-12-31131.509995129.149994131.365005130.55000319242400.0130.413864
2021-01-04136.524994129.625000131.042496131.13499556064000.0130.998245
2021-01-05134.434998130.869995130.997498134.04750132276000.0133.907700
2021-01-06132.449997125.860001132.225006126.14499758042400.0126.013443
2021-01-07133.777496128.865005129.675003133.44000246148000.0133.300842

OHLC をローソク足と折れ線で描く #

OHLC とは始値(Open)・高値(High)・安値(Low)・終値(Close)の 4 つの値です。同じ df を type="candle" と type="line" の 2 通りで描き、ローソク足が折れ線より多くの情報を持っていることを確かめます。

1
2
3
4
import mplfinance as mpf

mpf.plot(df, type="candle", style="starsandstripes", figsize=(12, 4))
mpf.plot(df, type="line", style="starsandstripes", figsize=(12, 4))

OHLCをプロットの図

OHLCをプロットの図

実行結果の読み方 #

1 枚目では 2021 年 2 月中旬の下落局面に長い陰線(下げの箱)が続き、5 月下旬から 6 月にかけて短い陽線が積み上がる様子が見えます。2 枚目の折れ線は同じ期間の終値だけなので、2 月の下げが「大きな値幅の日が連続した」のか「じりじり下げた」のかは区別できません。

移動平均線 #

移動平均線は、直近 n 日の終値(Close)の平均を日ごとに結んだ線で、5 日線なら 1 週間分の揺れを平らにして流れを見るための指標です。

現在のテクニカル分析では、短期、中期、長期の3本の移動平均線を同時に表示させる例が多く、日足チャートでは、5日移動平均線、25日移動平均線、75日移動平均線がよく使われる。(引用元:Wikipedia 移動平均線)

5 / 25 / 75 日移動平均線を描くには mav 引数に日数のリストを渡すだけで、rolling().mean() を自分で計算する必要はありません。

1
mpf.plot(df, type="candle", style="starsandstripes", figsize=(12, 4), mav=[5, 25, 75])

5/25/75日移動平均線をプロットするために mav オプションを指定しますの図

凡例の表示 #

3 本の線のどれが 5 日線かが図から分からないので、matplotlib の Figure を受け取って凡例を足します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import matplotlib.patches as mpatches

fig, axes = mpf.plot(
    df,
    type="candle",
    style="starsandstripes",
    figsize=(12, 4),
    mav=[5, 25, 75],
    returnfig=True,
)
fig.legend(
    [f"{days} days" for days in [5, 25, 75]], bbox_to_anchor=(0.0, 0.78, 0.28, 0.102)
)
<matplotlib.legend.Legend at 0x7f8be96e5b80>

凡例の表示の図

ボリュームの表示 #

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
fig, axes = mpf.plot(
    df,
    title="NVDA 2021/1/B~2021/6/E",
    type="candle",
    style="starsandstripes",
    figsize=(12, 4),
    mav=[5, 25, 75],
    volume=True,
    datetime_format="%Y/%m/%d",
    returnfig=True,
)
fig.legend(
    [f"{days} days" for days in [5, 25, 75]], bbox_to_anchor=(0.0, 0.78, 0.28, 0.102)
)
<matplotlib.legend.Legend at 0x7f8beac867f0>

ボリュームの表示の図

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
fig, axes = mpf.plot(
    df,
    title="NVDA 2021/1/B~2021/6/E",
    type="candle",
    style="yahoo",
    figsize=(12, 4),
    mav=[5, 25, 75],
    volume=True,
    datetime_format="%Y/%m/%d",
    returnfig=True,
)
fig.legend(
    [f"{days} days" for days in [5, 25, 75]], bbox_to_anchor=(0.0, 0.78, 0.28, 0.102)
)

ボリュームの表示の図

使いどころと落とし穴 #

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 データからテクニカル指標を計算してチャートに重ねます。