PythonでLINE株価アラートを作る:子育て中でも市場を見逃さない方法

「コマツを2,800円で買い増したい」と思いながら仕事してたら、気づいたら3,100円まで上がってた。。。確認したのが夕方で、チャンスはとっくに過ぎてた。こういう経験、子育て中の投資家なら絶対あると思う。ずっとスマホを見ていられないし、PC画面を監視するのも無理。そこで「価格が条件に達したらLINEで通知してくれる仕組み」をPythonで作りました。これが思った以上に便利で、毎日使ってます。

LINE Notifyとは?(無料で使えます)

LINE Notifyは、外部サービスからLINEに通知を送れる公式機能です。個人アカウントで使えて、APIキー(トークン)を発行するだけでPythonから無料でメッセージを送れます。Slackと違って日本人ならほぼ全員LINEを持ってるので、設定が楽というのが最大のメリット。

※2025年以降、LINE Notifyは新規トークン発行が終了したという情報もありますが、既存トークンを持っている方や代替のLINE Messaging APIを使う方法もあります。本記事ではLINE Notifyをベースに解説しますが、動作しない場合はLINE Messaging APIへの切り替えも検討してください。

LINE Notifyのトークン取得方法

1. notify-bot.line.me にLINEアカウントでログイン
2. 「トークンを発行する」をクリック
3. 通知を送るトークルーム(個人チャットでOK)を選択
4. 発行されたトークンをコピーして保管(一度しか表示されないので注意!)

基本的な送信コード

まず送信機能だけシンプルに作ります。

import requests

LINE_NOTIFY_TOKEN = "YOUR_LINE_NOTIFY_TOKEN"  # 自分のトークンに変えてね

def send_line_notify(message: str) -> bool:
    """LINEに通知を送る"""
    url = "https://notify-api.line.me/api/notify"
    headers = {"Authorization": f"Bearer {LINE_NOTIFY_TOKEN}"}
    data = {"message": message}

    resp = requests.post(url, headers=headers, data=data)
    if resp.status_code == 200:
        print("LINE送信成功!")
        return True
    else:
        print(f"送信失敗: {resp.status_code} - {resp.text}")
        return False

# テスト送信
send_line_notify("\nテスト通知です!Pythonからちゃんと届いてますよ。")

株価アラートの本体コード

次に、株価を取得してアラート条件をチェックする部分を作ります。

import yfinance as yf
import time
from datetime import datetime

LINE_NOTIFY_TOKEN = "YOUR_LINE_NOTIFY_TOKEN"

# アラート設定
ALERTS = [
    {
        "ticker":    "6301.T",   # コマツ
        "name":      "コマツ",
        "buy_below": 2850.0,     # 2850円以下で買いアラート
        "sell_above": 3200.0,    # 3200円以上で利確アラート
        "stop_below": 2650.0,    # 2650円以下で損切りアラート
    },
    {
        "ticker":    "7203.T",   # トヨタ
        "name":      "トヨタ",
        "buy_below": 3100.0,
        "sell_above": 3800.0,
        "stop_below": 2900.0,
    },
    {
        "ticker":    "6902.T",   # デンソー
        "name":      "デンソー",
        "buy_below": 4000.0,
        "sell_above": 4800.0,
        "stop_below": 3750.0,
    },
]

# 一度通知した条件を記録(同じ通知を何度も送らないため)
notified = set()


def get_current_price(ticker: str) -> float | None:
    """yfinanceで現在値を取得"""
    try:
        t = yf.Ticker(ticker)
        hist = t.history(period="1d", interval="1m")
        if hist.empty:
            return None
        return float(hist["Close"].iloc[-1])
    except Exception as e:
        print(f"{ticker}: 価格取得エラー → {e}")
        return None


def send_line_notify(message: str) -> bool:
    url = "https://notify-api.line.me/api/notify"
    headers = {"Authorization": f"Bearer {LINE_NOTIFY_TOKEN}"}
    resp = requests.post(url, headers=headers, data={"message": message})
    return resp.status_code == 200


def check_alerts():
    """全銘柄のアラートをチェック"""
    now = datetime.now().strftime("%H:%M")
    for alert in ALERTS:
        ticker = alert["ticker"]
        name   = alert["name"]
        price  = get_current_price(ticker)

        if price is None:
            continue

        print(f"[{now}] {name}: ¥{price:,.0f}")

        # 買いアラート
        key_buy = f"{ticker}_buy"
        if price <= alert["buy_below"] and key_buy not in notified:
            msg = (
                f"\n【買いアラート】{name}({ticker})\n"
                f"現在値: ¥{price:,.0f}\n"
                f"条件: ¥{alert['buy_below']:,.0f}以下\n"
                f"({now})"
            )
            if send_line_notify(msg):
                notified.add(key_buy)

        # 利確アラート
        key_sell = f"{ticker}_sell"
        if price >= alert["sell_above"] and key_sell not in notified:
            msg = (
                f"\n【利確アラート🎉】{name}({ticker})\n"
                f"現在値: ¥{price:,.0f}\n"
                f"条件: ¥{alert['sell_above']:,.0f}以上\n"
                f"({now})"
            )
            if send_line_notify(msg):
                notified.add(key_sell)

        # 損切りアラート
        key_stop = f"{ticker}_stop"
        if price <= alert["stop_below"] and key_stop not in notified:
            msg = (
                f"\n【損切りアラート⚠️】{name}({ticker})\n"
                f"現在値: ¥{price:,.0f}\n"
                f"条件: ¥{alert['stop_below']:,.0f}以下\n"
                f"({now})"
            )
            if send_line_notify(msg):
                notified.add(key_stop)


if __name__ == "__main__":
    print("株価アラート監視を開始します(Ctrl+Cで停止)")
    CHECK_INTERVAL = 300  # 5分ごとにチェック

    while True:
        check_alerts()
        print(f"次のチェックまで{CHECK_INTERVAL}秒待機中...")
        time.sleep(CHECK_INTERVAL)

これをWindowsで自動起動させる方法

毎朝手動でスクリプトを起動するのは面倒なので、Windowsのスタートアップに登録してPC起動時に自動で動かします。

1. スクリプトを C:\scripts\stock_alert.py に保存
2. stock_alert.bat を作成して以下を記述:

@echo off
cd C:\scripts
python stock_alert.py
pause

3. Win + Rshell:startup と入力してスタートアップフォルダを開く
4. 作成した .bat ファイルのショートカットを置く

これでPC起動のたびに自動で監視が始まります。僕は家のデスクトップPCで朝7時に起動するようタスクスケジューラと組み合わせて使っています。

運用してみて気づいたこと・注意点

実際に数週間使ってみて気づいたことをメモしておきます。

・yfinanceのデータは若干遅延がある(リアルタイムではなく15分遅延の場合がある)。高速な通知が必要なら証券会社のAPIを使った方がよい。

・市場が閉じている時間帯はそのまま動かすと古い値段でチェックし続けるので、9:00〜15:30以外は動かさないようにコードで制御する必要がある。

・「一度通知したら次のチェックまで通知しない」仕組みが大事。 これを入れないとスマホがアラートで埋まります(実際にやってしまった苦い経験あり)。

まとめ

・yfinance → 株価取得(無料)
・LINE Notify → スマホに即通知(無料)
・条件判定ロジック(買い・利確・損切り)を組み合わせれば立派な監視システムになる

子育て中で画面を見る時間が取れない人にこそ、こういう「気づき補助ツール」は役に立つと思います。あくまでアラートは「気づくための道具」で、最終判断は自分でしっかり考えること。次は通知と同時にチャート画像も送れるように改良したい。

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