5
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Python】株価データ分析 株価チャートを描く~mplfinance編 その1~

Last updated at Posted at 2021-11-25

修正(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を保有しているとしている),
image.png
東証上場銘柄一覧(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')

output_13_0.png

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)

output_20_0.png

移動平均を表示する

mavで日数を渡せばよい

2つでも,3つでも日数を並べればよい

mpf.plot(df, type = 'candle', volume = True, mav = (9,17))

output_24_0.png

mpf.plot(df, type = 'candle', volume = True, mav = (9,17,26))

output_25_0.png

スタイルを変える

まずはよく使う設定の辞書を作っておく

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

output_30_0.png

starsandstripes

## starsandstripes
mpf.plot(df, **kwargs, style = 'starsandstripes')

output_32_0.png

線を引く

期間内の,高値と安値に線を引いてみる

ちなみに,高値と安値は

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

output_36_0.png

ちょっと線が太いので,線幅を指定する
(終値から,高値,安値に変えておく)
先ほどは,hlines にリストを渡していたが,辞書を渡す
辞書にy座標(株価)と線幅を渡す

max = float(df['High'].max())
min = float(df['Low'].min())
mpf.plot(df, **kwargs, hlines = dict(hlines=[max, min], linewidths=(.5, .5)))

output_38_0.png
うん,細くなった,素敵

次は,安値と高値を結んだ線を引いてみる

高値をとった日は

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

output_45_0.png
いいね!

線を太くし,透かす
それぞれ,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))

output_46_0.png
いいね!!

グラフをファイルに出力する

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やボリンジャーバンドを描いたり,
複数銘柄を並べて描くようなことをやってみたい

5
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?