今回は、株価のデータ分析に役立つローソク足とボリンジャーバンドを可視化モジュールとしてmtplotlibのみを利用して可視化してみます。これらの可視化にはmplfinanceというパッケージを用いることで簡単に描画できますが、敢えてこれを使わずに行います。
ローソク足とボリンジャーバンドの簡単な説明
今回の記事は可視化がメインなので、これについては簡単な説明を引用するだけでとします。詳しく知りたい方は引用元のサイトを読んでいただければと思います。
ボリンジャーバンドは、移動平均線と標準偏差で構成されており、移動平均を表す線とその上下に値動きの幅を示す線を加えた指標で、「価格の大半がこの帯(バンド)の中に収まる」という統計学を応用したテクニカル指標のひとつです。
https://info.monex.co.jp/technical-analysis/indicators/003.html
ローソク足は、1日の取引時間中の株価の値動き(始値、終値、高値、安値)を1本のローソクの形で表現したものです。ローソク足は大きく分けて「陽線」と「陰線」の2パターンに分類されます。始値よりも終値の方が高い場合を「陽線」と呼びます。一方、始値よりも終値の方が低い場合を「陰線」と呼びます
https://www.okasan-online.co.jp/jp/stock/beginner/study05-05.html#:~:text=%E3%83%AD%E3%83%BC%E3%82%BD%E3%82%AF%E8%B6%B3%E3%81%AF%E3%80%811%E6%97%A5,%E3%80%8C%E9%99%B0%E7%B7%9A%E3%80%8D%E3%81%A8%E5%91%BC%E3%81%B3%E3%81%BE%E3%81%99%E3%80%82
可視化の完成形
まず完成形をみないことにはあまりイメージがつかないという方もいると思いますので、先に提示します。以下のグラフが株価の動きに加えてろうそくの足とボリンジャーバンドを可視化したものです。
株価データを読み込もう!
可視化の前にデータを用意する必要がありますね。今回使用するデータはPythonの`yfinance`を利用してコカコーラの株価データを利用します。それではまず、データセットをimportしていきましょう。
import yfinance as yf
start_date = '2020-01-01
end_date = '2020-05-01'
ticker = 'KO'
df = yf.download(ticker, start_date, end_date)
df.reset_index(level = 0, inplace = True)
df.head()
![pandasのデータフレーム](https://data-to-kurasu.com/wp-content/uploads/2022/11/39ab551b7b35c4656ec5363689482f9f-1024x237.png)
このデータを利用して可視化していきましょう。
実際に可視化してみよう!
いよいよ可視化に入りたいと思います!まず、何もしない状態で可視化します。
![株価の折れ線グラフ](https://data-to-kurasu.com/wp-content/uploads/2022/11/image-1-1024x525.png)
それでは、このデータにローソク足をつけていきましょう
import numpy as np
f, ax = plt.subplots()
f.set_dpi(150)
f.set_size_inches(20,10)
ax.set_title('コカコーラ 株価データ')
ax.plot(df['Date'], df['Open'], label='始値')
ax.plot(df['Date'], df['High'], label='高値')
ax.plot(df['Date'], df['Low'], label='安値')
ax.plot(df['Date'], df['Close'], label='終値')
# ローソク足
## 実体
df['Body'] = df['Close'] - df['Open']
conditions = [df['Close'] >= df['Open'],
df['Close'] < df['Open']]
choices = ['red', 'blue']
df['Color'] = np.select(conditions, choices, default=0)
ax.bar(df['Date'], df['Body'], bottom=df['Open'], linewidth=1, color=df['Color'], alpha=0.5, zorder=2)
ax.vlines(df['Date'], df["Low"], df["High"], linewidth=2, color=df['Color'], alpha=0.5, zorder=1)
すると、次のようになります。
![株価の折れ線グラフにローソク足を追加したもの](https://data-to-kurasu.com/wp-content/uploads/2022/11/image-2-1024x525.png)
ローソク足がしっかりと表示されましたね。次にボリンジャーバンドを追加します。
import numpy as np
f, ax = plt.subplots()
f.set_dpi(300)
f.set_size_inches(20,10)
ax.set_title('コカコーラ 株価データ')
ax.plot(df['Date'], df['Open'], label='始値')
ax.plot(df['Date'], df['High'], label='高値')
ax.plot(df['Date'], df['Low'], label='安値')
ax.plot(df['Date'], df['Close'], label='終値')
# ローソク足
## 実体
df['Body'] = df['Close'] - df['Open']
conditions = [df['Close'] >= df['Open'],
df['Close'] < df['Open']]
choices = ['red', 'blue']
df['Color'] = np.select(conditions, choices, default=0)
ax.bar(df['Date'], df['Body'], bottom=df['Open'], linewidth=1, color=df['Color'], alpha=0.5, zorder=2)
ax.vlines(df['Date'], df["Low"], df["High"], linewidth=2, color=df['Color'], alpha=0.5, zorder=1)
# ボリンジャーバンド
sma = df['Close'].rolling(5).mean()
sigma = df['Close'].rolling(5).std()
upper2, lower2 = sma + sigma * 2, sma - sigma * 2
upper3, lower3 = sma + sigma * 3, sma - sigma * 3
ax.plot(df['Date'], upper2, linewidth = .5, color='purple', label='$2\sigma$')
ax.plot(df['Date'], lower2, linewidth = .5, color='purple')
ax.plot(df['Date'], upper3, linewidth = .5, color='orange', label='$3\sigma$')
ax.plot(df['Date'], lower3, linewidth = .5, color='orange')
plt.legend()
![株価の折れ線グラフ、ローソク足にボリンジャーバンドを追加したもの](https://data-to-kurasu.com/wp-content/uploads/2022/11/image-3-1024x525.png)
無事にボリンジャーバンドも表示されました。このようにして、mplfinanceを使わずにローソク足とボリンジャーバンドを可視化することができました。筆者はこのコーディングでローソク足とボリンジャーバンドの理解につながりましたので、皆さんもぜひ試してみてください。
コメント