【無料】GitHub Actionsで株価分析を毎日自動実行する方法

自動化・運用

「毎日株価チェックするのが面倒」——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を使えば、無料でクラウド上に株価分析の自動実行環境が構築できます。毎日の分析結果はリポジトリに自動コミットされるので、過去の分析履歴も管理できます。

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