ドル円のRSIアラートをPythonで自動化したら、子育て中でもエントリーを見逃さなくなった話

自動化・運用

「ドル円のチャート、もう一週間まともに見てない。。。」

ドル円は毎日それなりに動くので、以前は子供が寝たあとにチャートを確認する習慣がありました。でも最近は寝かしつけで僕も一緒に寝落ちすることが増え、気づいたら一週間チャートを開いてない、なんてことも。。。せめて「ここはアラートだけ出してほしい」というポイントを通知してくれるシステムがあれば、と思って自動化したのが今回のテーマです。

なぜRSIアラートにしたのか

本当はAIで売買判断まで全部任せたい気持ちもあるんですが、ドル円は中央銀行や指標発表の影響が大きく、機械任せにすると痛い目を見るのも何度か経験済みです。なので今回は「判断は自分、見逃し防止だけ機械に任せる」というラインに留めました。具体的には、1時間足のRSI(14)が30以下/70以上に入ったタイミングで通知する、シンプルな仕組みです。

データはどこから取るか

個人で安定して使える無料寄りのドル円データだと、yfinance(”JPY=X”)あたりが手軽です。本気で運用に乗せるならOANDAやTraderMadeなどのAPIに寄せたほうが安心ですが、まずはアラート用なのでyfinanceで十分という判断にしました。

Pythonコード:RSIを計算してWebhookに通知

通知先はSlackのIncoming Webhookにしています。LINE Notifyの後継的なものがいくつかありますが、僕は仕事でSlackを使っているのでそこに飛ばすのが一番見ます笑。

import os
import yfinance as yf
import pandas as pd
import requests

SLACK_WEBHOOK = os.environ["SLACK_WEBHOOK"]

def rsi(series: pd.Series, period: int = 14) -> pd.Series:
    delta = series.diff()
    gain = delta.clip(lower=0).rolling(period).mean()
    loss = (-delta.clip(upper=0)).rolling(period).mean()
    rs = gain / loss
    return 100 - (100 / (1 + rs))

def notify(text: str) -> None:
    requests.post(SLACK_WEBHOOK, json={"text": text}, timeout=10)

def main() -> None:
    df = yf.download("JPY=X", period="30d", interval="1h", progress=False)
    df["RSI"] = rsi(df["Close"], 14)
    latest = df.dropna().iloc[-1]
    price = float(latest["Close"])
    r = float(latest["RSI"])

    if r <= 30:
        notify(f":arrow_down: USDJPY {price:.3f} RSI={r:.1f} 売られすぎゾーン")
    elif r >= 70:
        notify(f":arrow_up: USDJPY {price:.3f} RSI={r:.1f} 買われすぎゾーン")
    else:
        print(f"no alert (RSI={r:.1f})")

if __name__ == "__main__":
    main()

cron/GitHub Actionsで5分おきに動かす

自宅PCで動かしてもいいんですが、寝落ち対策が目的なので「PCが起動してなくても飛ぶ」状態にしたいです。僕はGitHub Actionsで動かしています。Schedule trigger で5分おきに発火させて、SlackのWebhook URLはSecretsに入れる。これだけで、深夜にRSIが振れたタイミングも逃さず通知が来るようになりました。

# .github/workflows/usdjpy_alert.yml の例(コメント)
# on:
#   schedule:
#     - cron: "*/5 * * * *"
# 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 pandas requests
#       - run: python usdjpy_alert.py
#         env:
#           SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}

まとめ:「自動判断」より「自動見張り」のほうが家庭と相性がいい

結局、僕みたいに子育てで時間が削られている個人投資家にとっては、「自動売買」よりも「自動見張り」のほうがリターンへの寄与が大きい気がしています。エントリーは自分で判断したいけど、見逃したくはない。そのバランス、ちょうどいい人も多いんじゃないかと思います。次は同じ仕組みを日経平均先物の押し目検知にも応用してみる予定です。気になる方は試してみてください。

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