決算シーズンに乗り遅れないよう、決算発表日が近づいたらSlackやLINEに自動で通知するBotを作ります。GitHub ActionsまたはPCのcronで毎日実行するだけで完全自動化できます。
LINE Notify Botの実装
import requests
import json
import os
def send_line_notify(message, token):
"""LINE Notifyにメッセージを送信"""
headers = {"Authorization": f"Bearer {token}"}
payload = {"message": f"\n{message}"}
res = requests.post(
"https://notify-api.line.me/api/notify",
headers=headers, data=payload
)
return res.status_code == 200
# 使用例
LINE_TOKEN = os.getenv("LINE_TOKEN") # 環境変数から取得
send_line_notify("テスト通知:正常に動作しています", LINE_TOKEN)
Slack Webhook Botの実装
def send_slack_message(message, webhook_url, blocks=None):
"""Slack Incoming Webhookにメッセージを送信"""
payload = {"text": message}
if blocks:
payload["blocks"] = blocks
res = requests.post(
webhook_url,
data=json.dumps(payload),
headers={"Content-Type": "application/json"}
)
return res.status_code == 200
# リッチメッセージ(Block Kit)
def send_slack_earnings_alert(webhook_url, ticker, earnings_date, days_until):
"""決算アラートをSlackに送信(Block Kit形式)"""
emoji = "🔴" if days_until <= 1 else "🟡" if days_until <= 3 else "🟢"
blocks = [
{
"type": "header",
"text": {"type": "plain_text", "text": f"{emoji} 決算アラート: {ticker}"}
},
{
"type": "section",
"fields": [
{"type": "mrkdwn", "text": f"*銘柄*\n{ticker}"},
{"type": "mrkdwn", "text": f"*決算日*\n{earnings_date}"},
{"type": "mrkdwn", "text": f"*残り*\n{days_until}日"},
]
}
]
return send_slack_message(f"決算アラート: {ticker}", webhook_url, blocks)
決算スケジュール取得と通知の統合
import yfinance as yf
import pandas as pd
from datetime import datetime, timedelta
import os
def get_upcoming_earnings_simple(tickers, days_ahead=7):
"""今後N日以内の決算情報を取得"""
today = datetime.today()
upcoming = []
for ticker in tickers:
try:
t = yf.Ticker(ticker)
cal = t.calendar
if cal is None or cal.empty:
continue
if "Earnings Date" in cal.index:
dates = cal.loc["Earnings Date"]
if not hasattr(dates, "__iter__"):
dates = [dates]
for ed in dates:
try:
ed = pd.to_datetime(ed).replace(tzinfo=None)
days = (ed - today).days
if 0 <= days <= days_ahead:
upcoming.append({"ticker": ticker, "date": ed.strftime("%Y-%m-%d"), "days": days})
except:
pass
except:
pass
return upcoming
def run_earnings_alert_bot(watchlist, line_token=None, slack_webhook=None):
"""決算アラートBotのメイン処理"""
today = datetime.now().strftime("%Y-%m-%d %H:%M")
print(f"決算アラートチェック: {today}")
upcoming = get_upcoming_earnings_simple(watchlist, days_ahead=7)
if not upcoming:
msg = f"【{today}】\n今後7日以内に決算はありません"
print(msg)
else:
lines = [f"【決算アラート】{today}"]
for item in sorted(upcoming, key=lambda x: x["days"]):
emoji = "🔴" if item["days"] <= 1 else "🟡" if item["days"] <= 3 else "🟢"
lines.append(f"{emoji} {item['ticker']}: {item['date']}(あと{item['days']}日)")
msg = "\n".join(lines)
print(msg)
# 通知送信
if line_token:
send_line_notify(msg, line_token)
if slack_webhook:
send_slack_message(msg, slack_webhook)
# 実行
WATCHLIST = ["AAPL", "NVDA", "MSFT", "GOOGL", "AMZN", "7203.T", "9984.T"]
run_earnings_alert_bot(
watchlist=WATCHLIST,
line_token=os.getenv("LINE_TOKEN"),
slack_webhook=os.getenv("SLACK_WEBHOOK_URL")
)
GitHub Actionsで毎朝自動実行
# .github/workflows/earnings_alert.yml
name: Earnings Alert Bot
on:
schedule:
- cron: '0 23 * * 0-4' # 毎平日朝8時(JST)
workflow_dispatch:
jobs:
alert:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.11'
- run: pip install yfinance requests pandas
- run: python earnings_bot.py
env:
LINE_TOKEN: ${{ secrets.LINE_TOKEN }}
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
LINE Notifyのトークン取得方法
- LINE Notifyにアクセス
- 「マイページ」→「トークンを発行する」
- 通知先のトークルーム(1:1またはグループ)を選択
- 発行されたトークンをコピーして環境変数に設定
まとめ
LINE/Slack Botと決算スケジュール取得を組み合わせることで、重要な決算日を見逃すことがなくなります。GitHub Actionsで毎朝自動実行すれば、スマホへのプッシュ通知として届きます。

