「毎日株価チェックするのが面倒」——GitHub Actionsを使えば、クラウド上で株価分析スクリプトを毎日無料で自動実行できます。PC不要・サーバー不要で完全自動化が実現します。
GitHub Actionsとは?
GitHub Actionsは、GitHubが提供するCI/CDサービスです。無料枠でも月2,000分の実行時間が使え、毎日1回5分の分析なら月150分程度なので十分無料で運用できます。
プロジェクト構成
stock-analysis/
├── .github/
│ └── workflows/
│ └── daily_analysis.yml # GitHub Actionsの設定
├── analyze.py # 分析スクリプト
├── requirements.txt # 依存ライブラリ
└── README.md
分析スクリプトの作成(analyze.py)
#!/usr/bin/env python3
"""analyze.py - 毎日実行される株価分析スクリプト"""
import yfinance as yf
import pandas as pd
import numpy as np
from datetime import datetime
import json
import os
WATCHLIST = {
"7203.T": "トヨタ",
"9984.T": "ソフトバンクG",
"6758.T": "ソニー",
"AAPL": "Apple",
"NVDA": "NVIDIA",
}
def analyze():
results = []
today = datetime.now().strftime("%Y-%m-%d")
for ticker, name in WATCHLIST.items():
try:
df = yf.download(ticker, period="3mo", progress=False, auto_adjust=True)
if df.empty:
continue
close = df["Close"]
current = float(close.iloc[-1])
prev = float(close.iloc[-2])
change_1d = (current / prev - 1) * 100
change_1m = (current / close.iloc[-22] - 1) * 100 if len(close) > 22 else 0
ma20 = float(close.rolling(20).mean().iloc[-1])
ma50 = float(close.rolling(50).mean().iloc[-1]) if len(close) >= 50 else None
rsi_delta = close.diff()
gain = rsi_delta.clip(lower=0).rolling(14).mean()
loss = (-rsi_delta.clip(upper=0)).rolling(14).mean()
rsi = float(100 - (100 / (1 + gain.iloc[-1] / loss.iloc[-1])))
signal = []
if current > ma20:
signal.append("MA20上")
if rsi < 30:
signal.append("RSI売られすぎ")
elif rsi > 70:
signal.append("RSI買われすぎ")
results.append({
"date": today, "ticker": ticker, "name": name,
"price": round(current, 2),
"change_1d": round(change_1d, 2),
"change_1m": round(change_1m, 2),
"ma20": round(ma20, 2),
"rsi": round(rsi, 1),
"signals": ", ".join(signal) if signal else "なし"
})
except Exception as e:
print(f"エラー {ticker}: {e}")
df_results = pd.DataFrame(results)
print(df_results.to_string(index=False))
# 結果をJSONで保存
output_dir = "reports"
os.makedirs(output_dir, exist_ok=True)
df_results.to_json(f"{output_dir}/{today}.json", orient="records", force_ascii=False)
df_results.to_csv(f"{output_dir}/latest.csv", index=False, encoding="utf-8-sig")
print(f"\n分析完了: {len(results)}銘柄 ({today})")
return df_results
if __name__ == "__main__":
analyze()
GitHub Actionsワークフローの設定
# .github/workflows/daily_analysis.yml
name: Daily Stock Analysis
on:
# 毎日日本時間9:00(UTC 0:00)に実行
schedule:
- cron: '0 0 * * 1-5' # 平日のみ
# 手動実行も可能
workflow_dispatch:
jobs:
analyze:
runs-on: ubuntu-latest
steps:
- name: リポジトリをチェックアウト
uses: actions/checkout@v4
- name: Python環境を設定
uses: actions/setup-python@v5
with:
python-version: '3.11'
cache: 'pip'
- name: 依存ライブラリをインストール
run: pip install -r requirements.txt
- name: 株価分析を実行
run: python analyze.py
- name: 結果をコミット(変更があれば)
run: |
git config --local user.email "action@github.com"
git config --local user.name "GitHub Action"
git add reports/
git diff --quiet && git diff --staged --quiet || \
git commit -m "Daily analysis $(date +%Y-%m-%d)"
git push
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
requirements.txtの作成
yfinance==0.2.38
pandas==2.1.4
numpy==1.26.3
Slack通知の追加
# analyze.pyの後に追加
- name: Slack通知
if: always()
uses: 8398a7/action-slack@v3
with:
status: ${{ job.status }}
text: "株価分析完了! reportsフォルダを確認してください。"
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
Secret変数の設定方法
GitHubリポジトリの Settings → Secrets and variables → Actions で追加します:
- SLACK_WEBHOOK_URL: SlackのIncoming Webhook URL
- LINE_TOKEN: LINE Notify のアクセストークン
まとめ
GitHub Actionsを使えば、無料でクラウド上に株価分析の自動実行環境が構築できます。毎日の分析結果はリポジトリに自動コミットされるので、過去の分析履歴も管理できます。

