SlackやLINEに決算アラートを自動送信するBotの作り方

自動化・運用

決算シーズンに乗り遅れないよう、決算発表日が近づいたら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のトークン取得方法

  1. LINE Notifyにアクセス
  2. 「マイページ」→「トークンを発行する」
  3. 通知先のトークルーム(1:1またはグループ)を選択
  4. 発行されたトークンをコピーして環境変数に設定

まとめ

LINE/Slack Botと決算スケジュール取得を組み合わせることで、重要な決算日を見逃すことがなくなります。GitHub Actionsで毎朝自動実行すれば、スマホへのプッシュ通知として届きます。

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