ホーム » Python » 【Python】株価データを取得し、テクニカル指標をグラフ化するプログラム(その2)

【Python】株価データを取得し、テクニカル指標をグラフ化するプログラム(その2)

Python

Pythonを使って株価データを取得し、テクニカル分析を行い、その結果をメールで通知するプログラムの作り方を説明します。

【Python】株価データを取得し、テクニカル指標をグラフ化するプログラム(その1)で、株価データを取得し、テクニカル指標(MACDやRSI、ボリンジャーバンド)をグラフ化するプログラムを作成しました。これによって、売買の判断基準を満足しているかどうか、視覚で判断しやすくなるようになりました。

  1. 株価データの取得
  2. テクニカル指標の計算
  3. 結果の評価
  4. メール通知の設定

今回は、この判断基準を満足しているかどうかをPythonのプログラムで判断し、その結果をメールで通知するようにします。さらに、この作業を定期的に自動で行なうプログラムを作成しました。

プログラム

【Python】株価データを取得し、テクニカル指標をグラフ化するプログラム(その1)で作成したプログラムに以下を追加します。

# 判定条件を満足したときにメールを送信する作業を定期的に実行するプログラム
# 判定条件を満足したときにメールを送信する作業を関数として定義する
def job():
    import smtplib
    from email.mime.text import MIMEText

    # メール送信作業を関数として定義する
    def send_email(subject, message, sender_email, receiver_email, password):
        # メールの設定
        msg = MIMEText(message)
        msg['Subject'] = subject
        msg['From'] = sender_email
        msg['To'] = receiver_email
    
        # SMTPサーバーに接続してメールを送信
        with smtplib.SMTP('smtp.gmail.com', 587) as smtp:
            smtp.starttls()
            smtp.login(sender_email, password)
            smtp.send_message(msg)
        
        # メールの送信設定
        sender_email = '送信元のメールアドレス@gmail.com'  # 送信元のメールアドレス
        receiver_email = '送信先のメールアドレス'  # 送信先のメールアドレス
        password = '送信元メールアドレスのパスワード'  # 送信元メールアドレスのパスワード
        
    # MACDhistの符号が逆転したかどうかを判定する関数
    def check_macdhist_reversal(df):
        # MACDhist列の値を取得
        macdhist = df['macdhist']
        # 直近2つの値を比較し、符号が逆転したかどうかを判定
        if macdhist[-2] > 0 and macdhist[-1] < 0:
            return True
        elif macdhist[-2] < 0 and macdhist[-1] > 0:
            return True
        else:
            return False   

    # MACDhistの符号が逆転した場合にメールで通知する処理
    if check_macdhist_reversal(df):
        subject = 'MACDhistの符号が逆転しました!'
        message = 'MACDhistの符号が逆転しました。取引に注意してください。'
        sender_email = '送信元のメールアドレス@gmail.com'  # 送信元のメールアドレス
        receiver_email = '送信先のメールアドレス'  # 送信先のメールアドレス
        password = '送信元メールアドレスのパスワード'  # 送信元メールアドレスのパスワード
        send_email(subject, message, sender_email, receiver_email, password)
    
    # RSIが基準値を超えたか判定する関数
    def check_rsi(df):
        # RSIの値を取得
        rsi = df['RSI']
        # 直近の値が基準を超えたかどうかを判定
        if rsi[-1] > 70 :
            return True
        elif rsi[-1] < 30 :
            return True
        else:
            return False
    
    # RSIが基準値を超えた場合にメールで通知する処理
    if check_rsi(df):
        subject = 'RSIが基準値を超えました!'
        message = 'RSIが基準値を超えました。取引に注意してください。'
        sender_email = '送信元のメールアドレス@gmail.com'  # 送信元のメールアドレス
        receiver_email = '送信先のメールアドレス'  # 送信先のメールアドレス
        password = '送信元メールアドレスのパスワード'  # 送信元メールアドレスのパスワード
        send_email(subject, message, sender_email, receiver_email, password)
        
    # ボリンジャーバンドの上下限値を終値が超えたかどうかを判定する関数
    def check_bband_reversal(df):
        # BBANDの値を取得
        upper = df['upper']
        lower = df['lower']
    
        # 直近の上下限値と終値を比較し、終値がバンドを超えたかどうかを判定
        if close[-1] > upper[-1] :
            return True
        elif close[-1] < lower[-1] :
            return True
        else:
            return False
        
    # ボリンジャーバンドの上下限値を終値が超えた場合にメールで通知する処理
    if check_bband_reversal(df):
        subject = 'ボリンジャーバンドの上下限値を終値が超えました!'
        message = 'ボリンジャーバンドの上下限値を終値が超えました。取引に注意してください。'
        sender_email = '送信元のメールアドレス@gmail.com'  # 送信元のメールアドレス
        receiver_email = '送信先のメールアドレス'  # 送信先のメールアドレス
        password = '送信元メールアドレスのパスワード'  # 送信元メールアドレスのパスワード
        send_email(subject, message, sender_email, receiver_email, password)

# スケジュール登録
import schedule
import time
import datetime
schedule.every().day.at("19:00").do(job)

# イベント実行
while True:
    schedule.run_pending()
    time.sleep(1)

判定条件を満足したときにメールを送信する作業を関数として定義する

以下の判断を行なわせ、判定条件を満足していたらメールを送信するよう、jobという名前で関数を定義します。

  • MACDhistの符号が逆転したかどうかを判定
  • RSIが基準値を超えたかどうかを判定
  • RSIが基準値を超えたかどうかを判定

メール送信作業を設定

send_emailという関数を定義します。

この関数は、引数としてメールの件名、本文、送信元のメールアドレス、送信先のメールアドレス、送信元のメールアドレスのパスワードを受け取り、それらを設定してメールを送信します。

送信元のメールアドレス、送信先のメールアドレス、送信元のメールアドレスのパスワードには、それぞれ設定したい、アドレスやパスワードを入力してください。

ここでは、gmailでのメール送信の設定を行なっています。OutlookやYahoo!メールのときは、

smtplib.SMTP(‘smtp.gmail.com‘, 587)のSMTPサーバーポート番号の部分が変わるので注意してください。

Outlook.com : smtp-mail.outlook.com,587

Yahoo!メール : smtp.mail.yahoo.co.jp,465

パスワードの設定が分からない方は、下の「パスワード設定」をご覧ください。

MACDhistの符号が逆転したか判定

ヒストグラムは、MACD線とシグナル線の間隔(差)を表す、通常棒グラフで表される指標です。

MACD線とシグナル線がクロスした時に間隔は0になるので、当然のごとくヒストグラムの値も0になります。つまり、MACD線がシグナル線を上回り、ゴールデンクロスしたときにMACD線=シグナル線となりヒストグラムの値は0になります。

そのため、収集したデータの中で、ヒストグラムの値であるMACDhistを使って判定します。

macdhist[-2] とmacdhist[-1]はそれぞれ、2日前、1日前のヒストグラムの値で、これらの正負が変わったかどうかを条件式で判定するようにし、その結果をcheck_macdhist_reversal(df)という関数に与えています。逆転していればTrue、してなければFalseになります。

check_macdhist_reversal(df)がTrueであれば、メールの件名、本文に指定の文章を与え、メール送信の関数send_emailを実行します。

RSIが基準値を超えたか判定する

同じように、check_rsiという関数を用いてRSIが基準値を超えたかどうかを判定し、超えていた場合メールを送信します。

ボリンジャーバンドの上下限値を終値が超えたか判定する

check_bband_reversal関数を用いてボリンジャーバンドの上下限値を終値が超えたかどうかを判定し、超えていた場合メールを送信します。

定期実行させる

scheduleモジュールを用いてスケジュールを設定します。

schedule.every().day.at("19:00").do(job)という行は、毎日19時にjob関数を実行するようスケジュールを登録しています。もちろんこの時間は任意に設定できます。

while Trueschedule.run_pending()によって登録されたスケジュールに基づき、実行すべきイベントがあればそれを実行します。一度実行すると無限ループを組んでいつまでも実行していきますので、停止させたければ、Stopで止めてください。

実行する

実行し、条件を満足していると以下のようにメッセージが届くようになります。

これで自動で定期的に結果が通知されることにより、売買のタイミングを見逃さずに売買を行なうことが出来るようになります。

gmail
テクニカル分析は、将来の価格変動を予測するのに役立つツールですが、確実な予測を提供するものではないことに注意することが重要です。実際の投資は自己責任で行なうことにご注意ください。

Gmailのパスワード設定

Gmailを開き、右上のアカウントアイコンをクリックします。

するとポップアップメニューが表示されるので「Googleアカウントを管理」をクリックします。

gmail-password1

つぎに、左側のサイドバーのセキュリティをクリックします。

gmail-password2

2段階認証プロセスがオンになっていることを確認して、アプリパスワードの設定をしてください。

ここで設定されたパスワードを使用することになります。(この後の画面は省略します)

gmail-password3

まとめ

Pythonを使って株価データを取得し、MACDやボリンジャーバンドなどのテクニカル指標が判定基準を満たしていると、メールで通知し、さらに定期的に自動で判定するようにするプログラムを追加しました。

これをベースに様々な判定条件を追加することもできます。

株価情報はStooqというサイトから収集しています。日経平均だけでなく、他の銘柄も取得でき、為替や仮想通貨(暗号資産)、金銀原油などの価格も取得できるようですので、サイトを検索して調べると分かります。

また、今回のテクニカル分析に必要なMACD、ボリンジャーバンドなどのデータ取得にはTa-Libというライブラリが必要になりますが、このインストールが難しいとの話が良く出てきます。

これらについては、別の記事にまとめたいと思います。

コメント

タイトルとURLをコピーしました