Pythonを使って株価データを取得し、テクニカル分析を行い、その結果をメールで通知するプログラムの作り方を説明します。
株式市場のトレーダーや投資家にとって、自動化されたデータ収集とテクニカル分析の結果を受け取ることは非常に便利です。お金を払えばそのようなサービス提供を受けることは可能ですが、ここでは自作のプログラムで同じような機能を設定してみたいと思います。
プログラムはPythonで作成します。以下のステップを順に行なうプログラムですが、今回は1~3を行なうプログラムです。
- 株価データの取得
- テクニカル指標の計算
- 結果の評価
- メール通知の設定
プログラム
プログラムは以下となりますが、各セクションについて説明します。
# ライブラリの読み込み
import pandas as pd
import numpy as np
import talib as ta
from pandas_datareader import data
import matplotlib.pyplot as plt
%matplotlib inline
import warnings
warnings.simplefilter('ignore')
import datetime
from datetime import timedelta
# データ取得期間の開始日と終了日(現在から1年間を自動で指定)
end = datetime.datetime.now()
start = end - timedelta(days=365)
# データ取得する'銘柄’、’取得先のWeb’を指定
df = data.DataReader('^NKX', 'stooq', start, end)
df = df.sort_index()
date=df.index
close=df['Close']
# テクニカル指標の設定(移動平均、MACD、RSI、ボリンジャーバンド)
span01=5
span02=25
span03=50
df['sma01'] = close.rolling(window=span01).mean()
df['sma02'] = close.rolling(window=span02).mean()
df['sma03'] = close.rolling(window=span03).mean()
df['macd'], df['macdsignal'], df['macdhist'] = ta.MACD(close, fastperiod=12, slowperiod=26, signalperiod=9)
df['RSI'] = ta.RSI(close, timeperiod=span02)
df['upper'], df['middle'], df['lower'] = ta.BBANDS(close, timeperiod=span02, nbdevup=2, nbdevdn=2, matype=0)
#グラフ 5種類全表示
plt.figure(figsize=(30,15))
#移動平均
ax1 = plt.subplot(5,1,1)
plt.plot(date,close,label='Close',color='#99b898')
plt.plot(date,df['sma01'],label='sma01',color='#e84a5f')
plt.plot(date,df['sma02'],label='sma02',color='#ff847c')
plt.plot(date,df['sma03'],label='sma03',color='#feceab')
plt.legend()
#出来高
ax2 = plt.subplot(5,1,2, sharex=ax1)
plt.bar(date,df['Volume'],label='Volume',color='grey')
plt.legend()
#MACD
ax3 = plt.subplot(5,1,3, sharex=ax1)
plt.fill_between(date, df['macdhist'], color = 'grey', alpha=1.0, label='MACD_hist')
plt.hlines(0, df.index.min(), df.index.max(), "grey", linestyles="dashed")
plt.legend()
#RSI
ax4 = plt.subplot(5,1,4, sharex=ax1)
plt.plot(date, df['RSI'], label='RSI', color = 'blue')
plt.ylim(30,70)
linestyles='dashed'
plt.legend()
#ボリンジャーバンド
ax5 = plt.subplot(5,1,5, sharex=ax1)
plt.plot(date,close,label='Close',color='#99b898')
plt.fill_between(date, df['upper'], df['lower'], color="grey", alpha=0.3)
plt.legend()
ライブラリの読み込み
必要なライブラリを読み込みます。
pandas
はデータの処理や分析に使用されるライブラリ、
numpy
は数値計算をサポートするライブラリです。
talib
(※)はさまざまなテクニカル指標の計算に使用され、
pandas_datareader
は株価データを取得するために使用されます。
matplotlib
はグラフの描画に使用され、
warnings
は警告メッセージを制御するために使用されます。
datetime
は日付と時刻の操作を可能にするモジュールです。
ライブラリについては、以下の記事でも説明しています。また、上のコードには書いていませんが、インストールが必要なものは、事前にしてから実行してください。
※talibのインストールは分かりにくいので下のリンクの記事に詳しく書いています。参照してください。
【Python】金融データ分析に必須なライブラリTa-Libのインストール – ライフ&ジョブブログ (life-and-job.com)
株価データの取得
次に、データの取得期間を設定します。datetime
モジュールを使用して現在の日付を取得し、1年前の日付を計算して取得期間の開始日とします。
その後、指定した銘柄(この場合は’^NKX’)の株価データをdata.DataReader
関数を使用して取得し、df
というデータフレームに格納します。
データフレームのインデックスを日付順にソートし、株価データ(’Close’)をdate
とclose
に格納します。
テクニカル指標の計算
次に、移動平均、MACD、RSI、ボリンジャーバンドなどのテクニカル指標を計算します。
移動平均(sma01(5日移動平均)、sma02(25日移動平均)、sma03(50日移動平均))は、rolling
関数を使用して指定した期間ごとの平均を計算し、データフレームに追加します。
移動平均はワシでもわかるぞ、株価の何日間かの単純平均値のことじゃな。あとは分からんぞ。。
MACD(Moving Average Convergence Divergence)は、ta.MACD
関数を使用して計算されます。MACD線、シグナル線、ヒストグラムの値がデータフレームに追加されます。
MACD線は、短期のEMA(指数平滑移動平均)と長期のEMA(指数平滑移動平均線)がどのくらい差があるのか、変化を線で表した指標です。MACDは「Moving Average Convergence Divergence」の略で、「マックディー」と読みます。日本語に訳すと移動平均収束発散となります。移動平均線を応用したテクニカルの手法で、2つの移動平均線を使用して、買いと売りのタイミングを判断することができます。移動平均線は一般的に使用されるSMA(単純移動平均線)と異なり、昨日や今日といった直近の価格の比重が重いEMA(指数平滑移動平均線)を使用します。MACDは数あるテクニカル手法の中でも比較的精度が高いとされ、特に新規売買のシグナルとトレンドの方向性を認識するのに有効とされています。
MACDで使用される2本のラインにはそれぞれ名称があり、その計算式も異なります。名称と計算式は以下の通りです。
MACD:短期EMA(指数平滑移動平均線)-長期EMA(指数平滑移動平均線)
シグナル:MACDのSMA(単純移動平均線 )
ヒストグラムは、MACD線とシグナル線の間隔(差)を表す、通常棒グラフで表される指標です。
MACD線とシグナル線がクロスした時に間隔は0になるので、当然のごとくヒストグラムの値も0になります。つまり、MACD線がシグナル線を上回り、ゴールデンクロスしたときにMACD線=シグナル線となりヒストグラムの値は0になります。
・ゴールデンクロス:MACDがシグナルを上抜けること。買いのサイン
・デッドクロス:MACDがシグナルを下抜けること。売りのサイン
と判断します。
RSI(Relative Strength Index)は、ta.RSI
関数を使用して計算されます。指定した期間ごとのRSIの値がデータフレームに追加されます。
RSIとは、「Relative Strength Index」の頭文字をとった略語で、日本語だと「相対力指数」と言われるようです。買われすぎか、売られすぎかを判断するための指標として利用されています。
RSIは0~100の数値で表され、一般的に70~80%以上で買われすぎ、20~30%以下で売られすぎと判断されるようです。
ボリンジャーバンドは、ta.BBANDS
関数を使用して計算されます。上限、中間、下限のバンドの値がデータフレームに追加されます。
このプログラムでは過去25日間(span02)の移動平均値の標準偏差の2倍(2σ)を上限(df[‘upper’])下限( df[‘lower’])にしたグラフを作成します。その中に終値が収まらなかった場合は、買われすぎか、売られすぎと判断されることが多いようね。
グラフの作成
最初のグラフは、株価データと移動平均(sma01、sma02、sma03)を表示します。
2番目のグラフは、出来量を表すバー(棒グラフ)として表示します。
3番目のグラフは、MACDヒストグラムを表示します。MACDヒストグラムは、MACD線とシグナル線の差を表し、ヒストグラムの形状で示されます。
4番目のグラフは、RSI(Relative Strength Index)を表示します。RSIは、過去の一定期間の値動きに基づいて買われ過ぎまたは売られ過ぎの状態を示す指標です。このグラフでは、RSIの値が青色の折れ線グラフとして表示されます。また、y軸の範囲は30から70に制限されています。
最後のグラフは、ボリンジャーバンドを表示します。ボリンジャーバンドは、移動平均線の上下に一定の標準偏差を加えたバンドであり、価格の上下限を示します。このグラフでは、株価データと共にボリンジャーバンドが表示されます。
これらのグラフは、それぞれのテクニカル指標の傾向や相互関係を視覚的に理解するのに役立ちます。プログラムを実行すると、指定した銘柄の株価データとテクニカル指標がグラフとして表示されるため、トレーダーや投資家は市場の動向を分析し、意思決定する際の参考とすることができます。
計算したテクニカル指標を元に、投資戦略やルールに基づいて結果を評価します。たとえば、RSIが30%未満の場合に買いシグナルとし、MACDがシグナルラインを上回った場合に売りシグナルとするなどのルールを設定して売買を行なうことになります。
実行する
プログラムを実行すると、以下のようなグラフが作成されます。テクニカル指標が視覚化されており、これだけでも分かりやすいと思います。
評価結果をメールで通知させる(次回)
今回はテクニカル指標を計算してグラフ化までするプログラムを作成しました。
銘柄コードを変更したり、これをベースに改造すれば様々なデータを分析することができます。
次回は、テクニカル分析の結果を評価し、設定条件をクリアしたときにメールで通知する機能を作ってみたいと思います。
- 株価データの取得
- テクニカル指標の計算
- 結果の評価
- メール通知の設定…次回
コメント