【-5%ルール】S&P500が5%下落したら通知する仕組みを作ろう!

S&P500の通知

学生時代から株好きな20代投資家のfuyutsuki(@Fuyutsuki)です。

✓この記事の権威性

この記事の権威性

前回紹介した私の投資ルールの中の一つであるS&P500の-5%ルール投資を行うための通知方法についてこちらで解説します。

前回の記事を読んでいない方は以下のリンクから先にご確認ください。

今回はS&P500が5%下落した際に通知が来るようにPythonを活用します。

私のブログでもよく紹介しているプログラミング言語です。やはり自動化の業務はPythonが第一候補に挙がります。

そもそもPythonて何?という方はこちらの記事でPythonについて解説しています。

今回は通知方法としてGmailを採用しました。

S&P500が-5%下落したら、自分宛にGmailが届くようにしたいと思います。

また、そもそもS&P500の株価はどのように取得するのだろうか?と疑問に思われる方も多いかと思います。

Fuyutsuki

今回はyahoo_finance_api2というPythonのAPIを使って株価データを取得していきます。

目次

Pythonの仮想環境構築

コードを記述する前に、Pythonの仮想環境を構築する必要があります。

こちらの記事で紹介している通り、virtualenvによる仮想環境の構築がおすすめです。

記事で解説しているバッチファイルをダブルクリックするだけで仮想環境の構築が完了するので、まだチェックしていない方はぜひご覧ください。

今回は以下のようなバッチファイルを作成しましょう。

@echo off
rem スクリプトが置かれている場所をカレントディレクトリにする。
cd /d %~dp0

rem 念のためvirtualenvのインストールとpipのアップグレードを行う。
pip install virtualenv
python -m pip install --upgrade pip

rem vENVの環境を構築する。
python -m venv vENV
call ./vENV/Scripts/activate

python -m pip install --upgrade pip
rem 各パッケージをインストール
pip install yahoo_finance_api2
pip install pandas
pip install numpy
pause

S&P500が5%下落したらPythonで通知

Pythonにより、S&P500が一週間に-5%下落したらGmailで通知させるようにします。

フォルダ構成は下記の画像を参考にしてください。

SP500_alert

yahoo_finance_api2について

使用するAPIがどのようなものかまず確認しておきたいと思います。

以下のURLをご確認ください。

公式ページにも記載されているように、pip install yahoo_finance_api2で簡単にインストールできることは嬉しいですね。

main.py

以下のコードが、yahoo_finance_api2を使って、S&P500が週に5%下落したら通知するためのmainコードです。

import sys
from yahoo_finance_api2 import share
from yahoo_finance_api2.exceptions import YahooFinanceError
import pandas as pd
from send_gmail import SendGmail

my_share = share.Share('^GSPC') #S&P500を指定
symbol_data = None
try:
    symbol_data = my_share.get_historical(
        share.PERIOD_TYPE_DAY, 10, # 過去10日分を取得
        share.FREQUENCY_TYPE_DAY, 1) # 日足で取得
except YahooFinanceError as e:
    print(e.message)
    # エラー終了
    sys.exit(1)
# 辞書型をDataFrameに変換
df = pd.DataFrame(symbol_data)
# timestampをdatetime型に変換
df['datetime'] = pd.to_datetime(df.timestamp, unit="ms")
df = df[['datetime','open','high','low','close','volume','timestamp']]
# timestamp列は不要なので削除
del df['timestamp']
df.rename(columns={'datetime':'Date'}, inplace=True)
df.tail(8)

# 金曜日の終値から金曜日の終値で-5%以上下落していれば通知
last_week = df.iloc[1]['close']
this_week = df.iloc[5]['close']
droprate = (1-(last_week)/(this_week))*100
if droprate <= -5:
    print('-5%下落しています',droprate)
    SendGmail().send_gmail_alert("{:.2f}".format(droprate)) #下落率を小数点以下2桁指定で渡す
elif droprate > -5:
    print('Noalert',droprate)
    SendGmail().send_gmail_no_alert(("{:.2f}".format(droprate)))

このように、S&P500の日足データを取得することができます。

S&P500日足

データ取得時刻は日本時間で午後14時30分となっていますね。

週足version

from os import times
import sys
from yahoo_finance_api2 import share
from yahoo_finance_api2.exceptions import YahooFinanceError
import pandas as pd
from send_gmail import SendGmail
import time

# yahoo_finance_api2でデータ取得
my_share = share.Share('^GSPC') #S&P500を指定
symbol_data = None
try:
    symbol_data = my_share.get_historical(
        share.PERIOD_TYPE_WEEK, 5, # 過去5週間分を取得
        share.FREQUENCY_TYPE_WEEK, 1) # 週足で取得
    # 辞書型のデータで出力される
    print('symbol_data',symbol_data)
    time.sleep(1)
except YahooFinanceError as e:
    print(e.message)
    # エラー終了
    sys.exit(1)
# 辞書型をDataFrameに変換
df = pd.DataFrame(symbol_data)
# 末尾(最後)の行を返す
df.tail(5)
# timestampをdatetime型に変換
df['datetime'] = pd.to_datetime(df.timestamp, unit="ms")
df = df[['datetime','open','high','low','close','volume','timestamp']]
# timestamp列は不要なので削除
del df['timestamp']
df.rename(columns={'datetime':'Date'}, inplace=True)
df.tail(5)# 金曜日の終値から金曜日の終値で-5%以上下落していれば通知
last_week = df.iloc[3]['close']
this_week = df.iloc[4]['close']
droprate = (1-(last_week)/(this_week))*100
if droprate <= -5:
    print('-5%下落しています',droprate)
    SendGmail().send_gmail_alert("{:.2f}".format(droprate)) #下落率を小数点以下2桁指定で渡す
elif droprate > -5:
    print('Noalert',droprate)
    SendGmail().send_gmail_no_alert(("{:.2f}".format(droprate)))

こちらが週足です。

S&P500週足

日本時刻で毎週月曜日の午前5時に更新されているようですね。

日足と週足のどちらを使うかは好みで決めていただければ良いと思います。S&P500の株価が更新される時間に合わせてPythonプログラムを実行すれば問題なく動作しますので。

send_gmail.py

Gmailで通知するためのpythonコードです。

main.pyに記述しても良いですが、そうするとmain.pyが縦に長くなってしまい、可読性が落ちるためpythonコードを分けています。

from email import message
import smtplib
import datetime
from tabnanny import check

class SendGmail:
    def __init__(self):
        # メールの設定
        self.SMTP_HOST = 'smtp.gmail.com'
        self.SMTP_PORT = 587
        self.FROM_ENAIL = 'xxxxxx@gmail.com'
        self.TO_EMAIL = 'xxxxxx@gmail.com'
        self.USERNAME = 'xxxxxx@gmail.com'
        self.PASSWORD = 'xxxxxx'
        self.nowdate = datetime.datetime.now().strftime('%Y年%m月%d日')

    def send_gmail_alert(self,droprate):
        #メッセージ内容_alert
        self.msg_alert = message.EmailMessage()
        self.msg_alert.set_content(self.nowdate + '_' + droprate +'%'+ '_' + 'S&P500_-5%下落')
        self.msg_alert['Subject'] = self.nowdate + '_' + droprate +'%' + '_' + 'S&P500_-5%下落'
        self.msg_alert['From'] = self.FROM_ENAIL
        self.msg_alert['To'] = self.TO_EMAIL
        # サーバーとのやりとり
        self.server = smtplib.SMTP(self.SMTP_HOST, self.SMTP_PORT)
        self.server.ehlo()
        self.server.starttls()
        self.server.ehlo()
        self.server.login(self.USERNAME,self.PASSWORD)
        self.server.send_message(self.msg_alert(droprate))
        self.server.quit()

    def send_gmail_no_alert(self,droprate):
        #メッセージ内容_no_alert
        self.msg_no_alert = message.EmailMessage()
        self.msg_no_alert.set_content(self.nowdate + '_' + droprate +'%' + '_' + 'S&P500_NoAlert')
        self.msg_no_alert['Subject'] = self.nowdate + '_' + droprate +'%' + '_' + 'S&P500_NoAlert'
        self.msg_no_alert['From'] = self.FROM_ENAIL
        self.msg_no_alert['To'] = self.TO_EMAIL
        # サーバーとのやりとり
        self.server = smtplib.SMTP(self.SMTP_HOST, self.SMTP_PORT)
        self.server.ehlo()
        self.server.starttls()
        self.server.ehlo()
        self.server.login(self.USERNAME,self.PASSWORD)
        self.server.send_message(self.msg_no_alert)
        self.server.quit()

プログラム実行結果

アカウント名は白抜きの長方形で隠していますが、下の画像の溶暗メールが指定したメールアドレスに届きます。

S&P500-alert

プログラム自体は以上です。

「日付・週に何%増加または下落したのか・アラートが発動したのかどうか」を一目で確認することができます。

後はこのプログラムを指定した時刻に自動で実行できる状態にすれば完璧です。

これについては、また別の記事で紹介させていただきますので、またぜひチェックしに来てください!

まとめ

今回の記事では、S%P500の-5%ルールが発動した時にPythonでGmailを活用して通知する方法について解説してきました。

このように、Pythonを使うことで効率的に時間を捻出することができます。

プログラミングというと敷居が高く思うかもしれませんが、例えば日々の業務効率化にも役立ちますし、何かと勉強しておくと役に立ちます。

私はUdemyで独学してプログラミングを習得しましたので興味のある方はこちらもご確認ください。

頻繁に80~90%オフのセールが実施されていますので、気になる口座はセール中に購入しましょう!

最後まで読んでいただきありがとうございました。

私のブログでは投資及びプログラミングについて有益な情報を発信していますので、ぜひまた読みに来てください!

随時更新しております!

S&P500の通知

この記事が気に入ったら
フォローしてね!

この記事を書いた人

学生時代から株好きな20代投資家エンジニア。日本株の個別株投資メイン。Twitterでは重要指標である”出来高急増”銘柄をツイート。

コメント

コメントする

目次