Python

【Python】株価を自動チェックしてメール通知するアプリを作ってみた

takahide

おはようございます。タカヒデです。

「今日の株価どうなったかな…1500円になったら売るのにな…」

そんなことを考えていませんか?

株の取引きをしたことがある方なら、必ず思ったことがあるでしょう。

そんなときに、「株価を自動でチェックし、通知するアプリ」が作れたらよいなということで作っていきたいと思います。

ということで本日は、「Pythonで株価を自動でチェックし、メール通知するアプリを作ってみよう」そんな記事になります。

読んでいただいた方が必ずしも同じ環境とは限りませんが、是非参考にしてみてください。

【前提】今回実装したいこと

まずは今回実装したい内容と、使用するシステムを整理していきましょう。

  1. 毎日、17時のタイミングで以下を実行 ⇒Windowsタスクスケジューラ
  2. 日経平均株価を取得 ⇒Python
  3. 日経平均株価が●●円を下回っていた場合にはメールで通知 ⇒Python
  4. メール通知しない場合にも株価取得履歴をログとしても残す ⇒Python

こんな内容ですすめていきます。

「決まった時間になったらWindowsタスクスケジューラがPythonを起動させて株価を取得」っていうイメージです。

なお本来であれば、「常に株価をチェックして下がったタイミングで通知」が理想かと思います。

しかし、無料のAPIだと取得制限もあったりするので1日1回のチェックにしています。

加えて、今回は自作アプリなので自動実行の制御には「Windowsタスクスケジューラ」を採用しています。

この場合、パソコンを立ち上げている場合しか通知が送られてきません。

より実用的な方法を検討される場合は、AWSなどのクラウドサービスなんかを検討してみても良いかもしれません。

STEP1:フォルダ構成

ではフォルダ構成から見ていきましょう。

今回は以下の構成にしています。

08_stock_alert_app/
├─main.py
└─.env
└─logs/
   └─stock_alert.log

それぞれ実行する内容は以下の通りです。

  • 「main.py」Pythonで株価取得やメール通知などの機能を実装
  • 「.env」取得する株価情報やメールアドレスなどの情報を記載
  • 「logs」株価取得履歴をログとして残す

STEP2:ライブラリのインストール

続けてライブラリをインストールします。

今回インストールが必要なライブラリは以下の2つです。

  • yfinance:株価データを取得
  • python-dotenv:Pythonから「.env」ファイルに書いた内容を取得

ターミナル上で以下のコマンドを実行しましょう。

pip install yfinance python-dotenv

STEP3:Googleアプリパスワードの取得

今回メール送信機能の実装はGmailを利用します。

その場合、Googleのアプリパスワードを取得する必要があります。

以下のリンクからGoogleアプリパスワードの設定を行いましょう。

なお、事前にGoogleアカウントの2段階認証を有効にしておく必要があるので注意してください。

https://myaccount.google.com/apppasswords

以下の「アプリ名」の欄に任意のアプリ名を入力し、「作成」を押下します。

ここで作成されたパスワードは公開せずにメモしておきましょう。

STEP4:Pythonコードの作成

続けて、Pythonで株価通知アプリの本体となるコードを記載していきます。

「main.py」を作成し、以下のコードを記載します。

なお、今回は3段階に分けて機能を実装します。

  1. 株価情報の取得
  2. メール送信機能の実装
  3. ログの出力

この流れで進めていきます。

①:株価情報の取得

まずは株価情報を取得し、取得した情報を出力するところまで実装します。

先に「.env」ファイルを作成し、以下の内容を記載してください。

TICKER=^N225
ALERT_PRICE=62800

GMAIL_ADDRESS=送信元アドレス
GMAIL_APP_PASSWORD=STEP3で取得したGoogleアプリパスワード
TO_EMAIL=送信先アドレス

なお、

  • 「TICKER=^N225」日経平均株価
  • 「ALERT_PRICE=62800」通知する金額の閾値

となります。

続けて「main.py」のコードです。

import os
from datetime import datetime
import yfinance as yf
from dotenv import load_dotenv

# .envファイルの読み込み
load_dotenv()

# .envから設定値の取得
TICKER = os.getenv("TICKER")
ALERT_PRICE = float(os.getenv("ALERT_PRICE"))


# 指定した銘柄の最新価格を取得する関数
def get_latest_price(ticker):
    data = yf.Ticker(ticker)

    # 直近1日分のデータを取得
    hist = data.history(period="1d")

    # データが空の場合はエラーにする
    if hist.empty:
        raise ValueError("データを取得できませんでした")

    # 最新の終値を取得
    latest_price = hist["Close"].iloc[-1]

    return latest_price


def main():
    now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

    print(f"実行日時:{now}")
    print(f"対象:{TICKER}")
    print(f"通知条件:{ALERT_PRICE:,.0f}円を下回ったら通知")

    latest_price = get_latest_price(TICKER)

    print(f"取得した日経平均株価:{latest_price:,.2f}円")

    if latest_price < ALERT_PRICE:
        print("通知対象:指定価格を下回りました")
    else:
        print("通知対象外:指定価格を下回っていません")


if __name__ == "__main__":
    main()

これで実行すると、以下のような出力がされます。

実行日時:2026-05-12 19:44:05
対象:^N225
通知条件:62,700円を下回ったら通知
取得した日経平均株価:62,742.57円
通知対象外:指定価格を下回っていません

株価情報の取得まではできましたね。

②:株価情報をメールで送信

続けて、株価情報をメール送信するところまで実装していきましょう。

「main.py」を以下のコードに書き換えます。

import os
import smtplib  #追加
from datetime import datetime
from email.mime.text import MIMEText    #追加
import yfinance as yf
from dotenv import load_dotenv

# .envファイルの読み込み
load_dotenv()

# .envから設定値の取得
TICKER = os.getenv("TICKER")
ALERT_PRICE = float(os.getenv("ALERT_PRICE"))

#メール情報の取得   追加
GMAIL_ADDRESS=os.getenv("GMAIL_ADDRESS")
GMAIL_APP_PASSWORD=os.getenv("GMAIL_APP_PASSWORD")
TO_EMAIL=os.getenv("TO_EMAIL")

# 指定した銘柄の最新価格を取得する関数
def get_latest_price(ticker):
    data = yf.Ticker(ticker)

    # 直近1日分のデータを取得
    hist = data.history(period="1d")

    # データが空の場合はエラーにする
    if hist.empty:
        raise ValueError("データを取得できませんでした")

    # 最新の終値を取得
    latest_price = hist["Close"].iloc[-1]

    return latest_price

#メールを送信する   追加
def send_email(subject,body):
    #本文
    msg=MIMEText(body,"plain","utf-8")

    #件名
    msg["Subject"]=subject

    #送信元
    msg["From"]=GMAIL_ADDRESS

    #送信先
    msg["To"]=TO_EMAIL

    #メール送信
    with smtplib.SMTP("smtp.gmail.com",587)as server:
        #暗号化
        server.starttls()

        #Gmailにログイン
        server.login(GMAIL_ADDRESS,GMAIL_APP_PASSWORD)

        #メール送信処理
        server.send_message(msg)


def main():
    now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

    print(f"実行日時:{now}")
    print(f"対象:{TICKER}")
    print(f"通知条件:{ALERT_PRICE:,.0f}円を下回ったら通知")

    latest_price = get_latest_price(TICKER)

    print(f"取得した日経平均株価:{latest_price:,.2f}円")

    if latest_price < ALERT_PRICE:
        print("通知対象:指定価格を下回りました")

        #追加
        subject="日経平均株価アラート"
        body=f"""
株価が指定価格を下回りました。
実行日時:{now}
対象:{TICKER}
取得した日経平均株価:{latest_price:,.2f}
{ALERT_PRICE:,.0f}円を下回っています
"""

        send_email(subject,body)
        print("メールを送信しました")

    else:
        print("通知対象外:指定価格を下回っていません")

if __name__ == "__main__":
    main()

これで実行すると実際にメールが通知されます。

なお、実行時の日経平均株価によって閾値を下回っていない可能性があるので、「.env」ファイルの「ALERT_PRICE」の値を変更してみてください。

③:ログの出力

続けてログの出力です。

「main.py」を以下のコードに書き換えましょう。

import os
import smtplib
import logging  # 追加
from pathlib import Path  # 追加
from datetime import datetime
from email.mime.text import MIMEText
import yfinance as yf
from dotenv import load_dotenv

# .envファイルの読み込み
load_dotenv()

# .envから設定値の取得
TICKER = os.getenv("TICKER")
ALERT_PRICE = float(os.getenv("ALERT_PRICE"))

# メール情報の取得
GMAIL_ADDRESS = os.getenv("GMAIL_ADDRESS")
GMAIL_APP_PASSWORD = os.getenv("GMAIL_APP_PASSWORD")
TO_EMAIL = os.getenv("TO_EMAIL")

# ログフォルダとログファイルの設定  追加
BASE_DIR = Path(__file__).resolve().parent
LOG_DIR = BASE_DIR / "logs"
LOG_FILE = LOG_DIR / "stock_alert.log"
LOG_DIR.mkdir(exist_ok=True)

# ログの設定 追加
logging.basicConfig(
    filename=LOG_FILE,
    level=logging.INFO,
    format="%(asctime)s %(levelname)s %(message)s",
    encoding="utf-8",
)


# 指定した銘柄の最新価格を取得する関数
def get_latest_price(ticker):
    data = yf.Ticker(ticker)

    # 直近1日分のデータを取得
    hist = data.history(period="1d")

    # データが空の場合はエラーにする
    if hist.empty:
        raise ValueError("データを取得できませんでした")

    # 最新の終値を取得
    latest_price = hist["Close"].iloc[-1]

    return latest_price


# メールを送信する
def send_email(subject, body):
    # 本文
    msg = MIMEText(body, "plain", "utf-8")

    # 件名
    msg["Subject"] = subject

    # 送信元
    msg["From"] = GMAIL_ADDRESS

    # 送信先
    msg["To"] = TO_EMAIL

    # メール送信
    with smtplib.SMTP("smtp.gmail.com", 587) as server:
        # 暗号化
        server.starttls()

        # Gmailにログイン
        server.login(GMAIL_ADDRESS, GMAIL_APP_PASSWORD)

        # メール送信処理
        server.send_message(msg)


def main():
    now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

    # 追加
    logging.info("処理を開始しました")
    logging.info(f"実行日時:{now}")
    logging.info(f"対象:{TICKER}")
    logging.info(f"通知条件:{ALERT_PRICE:,.0f}円を下回ったら通知")

    print(f"実行日時:{now}")
    print(f"対象:{TICKER}")
    print(f"通知条件:{ALERT_PRICE:,.0f}円を下回ったら通知")

    latest_price = get_latest_price(TICKER)

    # 追加
    logging.info(f"取得した日経平均株価:{latest_price:,.2f}円")
    print(f"取得した日経平均株価:{latest_price:,.2f}円")

    if latest_price < ALERT_PRICE:
        # 追加
        logging.info("通知対象:指定価格を下回りました")
        print("通知対象:指定価格を下回りました")

        subject = "日経平均株価アラート"
        body = f"""
株価が指定価格を下回りました。
実行日時:{now}
対象:{TICKER}
取得した日経平均株価:{latest_price:,.2f}
{ALERT_PRICE:,.0f}円を下回っています
"""

        send_email(subject, body)
        # 追加
        logging.info("メールを送信しました")
        print("メールを送信しました")

    else:
        # 追加
        logging.info("通知対象外:指定価格を下回っていません")
        print("通知対象外:指定価格を下回っていません")

    # 追加
    logging.info("処理を終了しました")


if __name__ == "__main__":
    main()

実行すると同一フォルダ内に「stock_alert.log」というファイルが作成されます。

中身を見てみると、ログ情報が記載されていることが分かります。

ここまでで、「株価情報の取得⇒メール通知⇒ログの出力」までの処理が完了です。

STEP5:Windowsタスクスケジューラの設定

最後に、「毎日、17時のタイミングでPythonを自動実行」するよう、Windowsタスクスケジューラを設定していきます。

なお、今回は私の作業時間の関係で23時に実行されるか試してみます。

Windows左下の検索窓から「タスク スケジューラ」と検索し実行します。

「基本タスクの作成」を押下。

「名前」を入力。

私は「株価アラート」と入力しました。

実行の周期を選択。

開始時間や間隔を入力。

「プログラムの開始」を選択。

以下の3つを入力。

  • プログラム/スクリプト:Pythonを実行するファイルのパス
    • 例:C:\Users\ユーザー名\AppData\Local\Programs\Python\Launcher\py.exe
  • 引数の追加:実行したいPythonファイルのパス
    • 例:C:\programming\08_stock_alert_app\main.py
  • 開始:Pythonファイルが置いてある作業フォルダのパス
    • 例:C:\programming\08_stock_alert_app

ここは私がやっていて上手くいかなかったので以下の別記事で対処方法を紹介しています。
コチラも参考にしてみてください。

あわせて読みたい
WindowsタスクスケジューラでPythonアプリの起動ができなかったので対処を記録する
WindowsタスクスケジューラでPythonアプリの起動ができなかったので対処を記録する

問題なければ「完了」を押下。

真ん中に「株価アラート」が追加されました。

追加したタスクに対し、右クリックから「実行する」を選択、もしくは指定した時間になるのを待ってみてください。

Pythonが実行され、通知が行われるか確認してみましょう。

以上で「Pythonで株価を自動でチェックし、メール通知するアプリ」の完成です。

完成

いかがでしょうか、アプリは作れましたか?

前提でもお伝えした通り、「1日1回のチェック」「パソコンを立ち上げていないと自動実行されない」という実用性がまだ不足しています。

今後はより実用的なアプリを作り紹介できればと思います。

お疲れさまでした。

ABOUT ME
タカヒデ
タカヒデ
ITを楽しく勉強中
通信会社の企画職で働く30代
非エンジニアでありながら半分趣味でITエンジニアリングやプログラミングを学習中
IT初心者が楽しいと思えるように発信することを目指しています
↓Xもやっているのでフォローしてね
記事URLをコピーしました