Pythonでやってみた2:株価取得/可視化(pandas-datareader)
概要
Pythonを使用した株価分析をします。具体的には下記の通りです。
あくまで練習用のため、実際にトレードする場合は証券会社のツールを使用する方がよいです。
1.株価データ取得:pandas_datareader
株価データの取得はpandas_datareaderを使用します。pandasとは異なるため事前に下記でライブラリのインストールが必要です。
pip install pandas-datareader
pandas_datareaderでは下記複数のサイトのAPIでデータ取得できます。
今回はサイトへの登録が不要なStooqを使用してデータ取得します。
参考銘柄として直近の買収騒動で株価が乱高下している東京機械製作所(6335)を使用します。コードは下記の通りであり、出力はPandasのDf形式です。
[In]
import pandas_datareader as pdr
def getstockprice(stockcode):
return pdr.data.DataReader(stockcode, 'stooq')
df = getstockprice('6335.jp')
df
[Out]
Open High Low Close Volume
Date
2021-10-21 1731.00 1767.00 1650.00 1675.00 144100
2021-10-20 1720.00 1842.00 1706.00 1752.00 323200
2021-10-19 1770.00 1859.00 1652.00 1717.00 296100
2021-10-18 1747.00 1926.00 1747.00 1762.00 238700
2021-10-15 2001.00 2050.00 1736.00 1795.00 461300
... ... ... ... ... ...
2016-10-31 728.69 747.87 728.69 738.28 97935
2016-10-28 747.87 757.45 728.69 738.28 124009
2016-10-27 738.28 747.87 738.28 738.28 68002
2016-10-26 738.28 747.87 728.69 738.28 145703
2016-10-25 767.04 776.63 728.69 738.28 412077
1218 rows × 5 columns
2.データプロット・移動平均
データを取得したら次はデータ加工、可視化です。データは終値(Close)を使用します。
DataFrame型はMatplotlibの機能を含むためdf.plot()でグラフ化できます。
[In]
df = getstockprice('6335.jp')
df['Close'].plot()
[Out->下図参照]
dfのrollingを使用して移動平均の計算も可能です(見映え用で体裁追加)。
[In]
import japanize_matplotlib
import matplotlib.pyplot as plt
df = getstockprice('6335.jp')
plt.figure(figsize=(13,8))
df['Close'].plot(label='東京機械製作所')
df['Close'].rolling(5).mean().plot(label='5日移動平均', linestyle='dashed')
df['Close'].rolling(25).mean().plot(label='25日移動平均', linestyle='dashed')
df['Close'].rolling(75).mean().plot(label='75日移動平均', linestyle='dashed')
plt.legend()
plt.grid()
このデータより2021年に入ってから恐ろしい動きをしていることがわかります。データを2021年以降に絞って再プロットします。
[In]
import datetime
#pandasの条件抽出で2021/1/1移行のデータを取得
df_2021 = df[df.index>datetime.datetime(2021,1,1)]
#同様にプロット
plt.figure(figsize=(13,8))
df_2021['Close'].plot(label='東京機械製作所')
df_2021['Close'].rolling(5).mean().plot(label='5日移動平均', linestyle='dashed', lw=0.5)
df_2021['Close'].rolling(25).mean().plot(label='25日移動平均', linestyle='dashed', lw=0.5)
df_2021['Close'].rolling(75).mean().plot(label='75日移動平均', linestyle='dashed', lw=0.5)
plt.legend()
plt.grid()
3.箱ひげ図の作成:mplfinance
箱ひげ図の作成はmplfinanceを使用することで簡単に記載できます。サクッと記載するなら下記の通りです。
[In]
import mplfinance as mpf
df_2021 = df_2021.sort_index() #Dateが降順のため昇順に修正
mpf.plot(df_2021 ,type='candle', figratio=(10,5), mav=(5, 25, 75), #mav:移動平均線の表示
volume=True, style='yahoo') #Volume=TrueはVolumeカラムが必須
見たいポイントに線も追加できます。
[In]
mpf.plot(df_2021 ,type='candle', figratio=(10,5), volume=True, style='yahoo',
vlines=dict(vlines=['2021-08-16', '2021-09-21'],colors=['r', 'g'],
linewidths=[1, 1], linestyle='-.'))
4.テクニカル指標:MACD追加
最後にテクニカル指標のMACDを追加してみます。
[In]
import mplfinance as mpf
_df_2021 = df_2021.sort_index()
MACD = talib.MACD(_df_2021['Close'],fastperiod=12,slowperiod=26,signalperiod=9)
df_MACD = pd.DataFrame(MACD, index=["MACD(12,26)","MACDsignal", "MACDhist"]).T
plt.figure(figsize=(13,15))
ymin, ymax = df_MACD['MACD(12,26)'].min(), df_MACD['MACD(12,26)'].max()
plots = [
mpf.make_addplot((df_MACD['MACD(12,26)']),panel=2, ylabel='MACD(12,26)', color='r', ylim=(ymin,ymax)),
mpf.make_addplot((df_MACD['MACDsignal']),panel=2, ylabel='MACDsignal', color='g', ylim=(ymin,ymax)),
]
mpf.plot(df_2021, addplot= plots, type='candle', figratio=(12,7), mav=(5, 25, 75), volume=True, style='yahoo') #Volume=TrueはVolumeカラムが必須
参考資料
あとがき
普通に株を買うだけならいろいろな指標やツールがある証券会社の方が絶対よいですが、自作の自動売買システムを作成するのであれば見える化の技術は必須だと思います。
時間あるときにMACDとか追加できるTa-Libも追加したい。
ちなみにビットコインの自動売買システムを自分用で作成したけど価格予想モデルが全然で資産-20%で負けました。難しい!!
この記事が気に入ったらサポートをしてみませんか?