mplfinance

mplfinanceとはファイナンスデータを可視化するためのmatplotlibの拡張です。今回はこれを使って、金融データからグラフを作ってみようと思います。基本的な使い方はmplfinanceのリポジトリの『Tutorial』にて説明されており、これをみながらグラフを作ってみます。

データの読み込み

import os
import time
import pandas as pd
import pandas_datareader.data as web
from pandas_datareader._utils import RemoteDataError
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
# 銘柄名、期間、保存先ファイル
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とは始値・高値・安値・終値のことで、普段最もよくみるグラフの一つです。 ローソク足と、線でのプロットをしてみます。

import mplfinance as mpf

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

png

png

移動平均線

株価や外国為替のテクニカル分析において使用される指標の一つに、移動平均線というものがあります。

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

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

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

png

凡例の表示

どの線が何日移動平均線かわかりにくいので、凡例を追加します。

import japanize_matplotlib
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>

png

ボリュームの表示

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>

png

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)
)

png