修正(2021.11.27)
データ(株価データ)によっては,
高値と安値の線を引くためのデータ(hlinesに渡すデータ)がfloatでないというエラーが発生しましたので,
# エラー箇所
hlines=[df['High'].max(), df['Low'].min()]
次のように修正しています
# float変換
max = float(df['High'].max())
min = float(df['Low'].min())
hlines=[max, min]
はじめに
前回の【Python】東証上場銘柄の株価データを取得する(その2)では
pandas_datareader を使って株価データを取得した
Python で株価チャートを描くには mplfinace,plotly を使うのがよさそうで,
今回は取得した株価データをmplfinanceを使って株価チャートを描いてみたい
まずは,mplfinace編 その1として,いくつかのチャートを描いてみたい
本記事を書く上で,matplotlib/mplfinanceを参考にしている
準備
まずはともかく,mplfinance のインストールをする
conda の場合
conda install mplfinance
pip の場合
pip install mplfinance
データ用意
自分銘柄一覧(my.xlsx)と東証上場銘柄一覧(date_j.xls)を読み込む
前回を参考にしてほしいが,自分銘柄一覧(my.xlsx)とは,自分の保有銘柄の一覧で(仮に,トヨタ,日産,ホンダ,ANA,JALを保有しているとしている),
東証上場銘柄一覧(data_j.xls)とは,日本取引所グループにある東証上場銘柄の一覧ファイルのことだ
まずは,自分銘柄と東証上場銘柄一覧を読み込んで,自分銘柄のDataFrameを作る
import pandas as pd
import pandas_datareader.data as pdr
import datetime
from dateutil.relativedelta import relativedelta
## 自分銘柄と東証上場銘柄一覧を読み込む
my_df = pd.read_excel('my.xlsx', sheet_name = 'Sheet1', dtype = str)
topix_df = pd.read_excel('data_j.xls', dtype = str)
## 自分銘柄のDataFrameを作る
code_set = set(my_df['コード'].tolist())
df = topix_df[topix_df['コード'].isin(code_set)]
df
日付 | コード | 銘柄名 | 市場・商品区分 | 33業種コード | 33業種区分 | 17業種コード | 17業種区分 | 規模コード | 規模区分 | |
---|---|---|---|---|---|---|---|---|---|---|
2886 | 20211029 | 7201 | 日産自動車 | 市場第一部(内国株) | 3700 | 輸送用機器 | 6 | 自動車・輸送機 | 2 | TOPIX Large70 |
2888 | 20211029 | 7203 | トヨタ自動車 | 市場第一部(内国株) | 3700 | 輸送用機器 | 6 | 自動車・輸送機 | 1 | TOPIX Core30 |
2926 | 20211029 | 7267 | 本田技研工業 | 市場第一部(内国株) | 3700 | 輸送用機器 | 6 | 自動車・輸送機 | 1 | TOPIX Core30 |
3793 | 20211029 | 9201 | 日本航空 | 市場第一部(内国株) | 5150 | 空運業 | 12 | 運輸・物流 | 4 | TOPIX Mid400 |
3794 | 20211029 | 9202 | ANAホールディングス | 市場第一部(内国株) | 5150 | 空運業 | 12 | 運輸・物流 | 2 | TOPIX Large70 |
チャートを描き方を学ぶのが目的なので,先頭の銘柄(日産自動車)だけにしておく
code = df['コード'].tolist()[0]
company = df['銘柄名'].tolist()[0]
6か月分のデータを取得
ed = datetime.datetime.now() # 本日
st = ed - relativedelta(months = 6) # 6か月前
df = pdr.DataReader(code + '.T', 'yahoo', st, ed)
これでデータの準備はできた
ローソク足を描く
import mplfinance as mpf
mpf.plot(data = df, type = 'candle')
mplfinance をインポートして,plot 関数を呼ぶ
plot に渡す data は,DataFrame で,Open,High,Low,Closeの列が必要
index は,DatetimeIndex の必要がある
pandas_datareaderを使って取得した株価データは,これらの要件を満たしているので何も考えなくてもよい
>>> type(df)
pandas.core.frame.DataFrame
>>> df.columns
Index(['High', 'Low', 'Open', 'Close', 'Volume', 'Adj Close'], dtype='object')
>>> type(df.index)
pandas.core.indexes.datetimes.DatetimeIndex
出来高を表示する
volume = True とするだけでよい
mpf.plot(df, type = 'candle', volume = True)
移動平均を表示する
mavで日数を渡せばよい
2つでも,3つでも日数を並べればよい
mpf.plot(df, type = 'candle', volume = True, mav = (9,17))
mpf.plot(df, type = 'candle', volume = True, mav = (9,17,26))
スタイルを変える
まずはよく使う設定の辞書を作っておく
kwargs = dict(type = 'candle', volume = True, mav = (9,17,26))
使えるスタイルは
>>> mpf.available_styles()
['binance',
'blueskies',
'brasil',
'charles',
'checkers',
'classic',
'default',
'ibd',
'kenan',
'mike',
'nightclouds',
'sas',
'starsandstripes',
'yahoo']
yahoo
## yahoo
mpf.plot(df, **kwargs, style = 'yahoo')
starsandstripes
## starsandstripes
mpf.plot(df, **kwargs, style = 'starsandstripes')
線を引く
期間内の,高値と安値に線を引いてみる
ちなみに,高値と安値は
>>> df['High'].max(), df['Low'].min()
(654.2999877929688, 516.5)
設定の辞書でyahooにしておく
kwargs = dict(type = 'candle', volume = True, mav = (9,17,26), style = 'yahoo')
hlines で横線を引く際の y座標(株価)を指定する
終値ベースでの高値と安値
mpf.plot(df, **kwargs, hlines = [float(df['Close'].max()), float(df['Close'].min())])
ちょっと線が太いので,線幅を指定する
(終値から,高値,安値に変えておく)
先ほどは,hlines にリストを渡していたが,辞書を渡す
辞書にy座標(株価)と線幅を渡す
max = float(df['High'].max())
min = float(df['Low'].min())
mpf.plot(df, **kwargs, hlines = dict(hlines=[max, min], linewidths=(.5, .5)))
次は,安値と高値を結んだ線を引いてみる
高値をとった日は
>>> df['High'].idxmax()
Timestamp('2021-11-19 00:00:00')
安値をとった日は
>>> df['Low'].idxmin()
Timestamp('2021-10-07 00:00:00')
設定の辞書でstarsandstripesにしておいて,
ごちゃごちゃしてきそうなので,移動平均もついでにやめておく
kwargs = dict(type = 'candle', style = 'starsandstripes')
alines に,2点の座標(安値と高値)を渡す必要があるので,
two_points に,安値の座標(安値をとった日付,安値)と高値の座標(高値をとった日付,高値)を設定する
two_points = [(df['High'].idxmax(), df['High'].max()),(df['Low'].idxmin(),df['Low'].min())]
mpf.plot(df, **kwargs,
hlines = dict(hlines=[max, min], linewidths=(.5, .5), colors=('r','r')),
alines = dict(alines=two_points, linewidths=(.5), colors=('b')))
線を太くし,透かす
それぞれ,linewidth,alphaで設定する
mpf.plot(df, **kwargs,
hlines = dict(hlines=[max, min], linewidths=(.5, .5), colors=('r','r')),
alines = dict(alines=two_points, linewidths=(40), colors=('b'), alpha=0.2))
グラフをファイルに出力する
savefig に,ファイル名(fname)とDPIを与える
mpf.plot(df, **kwargs,
hlines = dict(hlines=[max, min], linewidths=(.5, .5), colors=('r','r')),
alines = dict(alines=two_points, linewidths=(40), colors=('b'), alpha=0.2),
savefig = dict(fname='nissan.png',dpi=100))
おわりに
今回は,株価チャートを mplfinance を使って描いてみた
次回は,MACDやボリンジャーバンドを描いたり,
複数銘柄を並べて描くようなことをやってみたい