Raspberry Piで24時間稼働する株価監視ツールを作る

自動化・運用

Raspberry Piは低消費電力・低コストで24時間365日稼働できる小型コンピュータです。自宅サーバーとして株価監視ツールを常時稼働させるのに最適です。

必要なもの

  • Raspberry Pi 4(または3B+) ~5,000円程度
  • microSDカード(16GB以上)
  • 電源アダプター
  • (オプション)モバイルディスプレイ

初期セットアップ

# Raspberry Pi OSを最新に更新
sudo apt update && sudo apt upgrade -y

# Python環境を準備
python3 --version  # Python 3.9+ を確認
pip3 install yfinance pandas numpy matplotlib requests

# 仮想環境を作成(推奨)
python3 -m venv ~/stock-env
source ~/stock-env/bin/activate
pip install yfinance pandas numpy requests

24時間監視スクリプト

#!/usr/bin/env python3
"""stock_monitor.py - Raspberry Piで常時稼働する株価監視スクリプト"""
import yfinance as yf
import pandas as pd
import numpy as np
import time
import requests
import logging
import os
from datetime import datetime

# ログ設定
logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s - %(levelname)s - %(message)s",
    handlers=[
        logging.FileHandler("/home/pi/stock_monitor.log"),
        logging.StreamHandler()
    ]
)
logger = logging.getLogger(__name__)

# 設定
WATCHLIST = {
    "7203.T": "トヨタ",
    "9984.T": "ソフトバンクG",
    "6758.T": "ソニー",
    "AAPL": "Apple",
    "NVDA": "NVIDIA",
}
CHECK_INTERVAL = 300      # 5分ごとにチェック
ALERT_THRESHOLD = 3.0     # 3%以上の変動でアラート
LINE_TOKEN = os.getenv("LINE_TOKEN", "")  # LINE Notifyトークン

def send_line_notify(message):
    """LINE Notifyにメッセージを送信"""
    if not LINE_TOKEN:
        logger.warning("LINE_TOKEN not set")
        return
    headers = {"Authorization": f"Bearer {LINE_TOKEN}"}
    payload = {"message": f"\n{message}"}
    try:
        res = requests.post(
            "https://notify-api.line.me/api/notify",
            headers=headers, data=payload, timeout=10
        )
        return res.status_code == 200
    except Exception as e:
        logger.error(f"LINE通知エラー: {e}")
        return False

def is_trading_hours():
    """取引時間内かどうかを確認(東証)"""
    now = datetime.now()
    if now.weekday() >= 5:  # 土日
        return False
    hour, minute = now.hour, now.minute
    # 9:00-11:30, 12:30-15:30
    morning = (9, 0) <= (hour, minute) <= (11, 30)
    afternoon = (12, 30) <= (hour, minute) <= (15, 30)
    return morning or afternoon

prev_prices = {}

def check_stocks():
    global prev_prices
    alerts = []
    
    for ticker, name in WATCHLIST.items():
        try:
            df = yf.download(ticker, period="5d", progress=False, auto_adjust=True)
            if df.empty:
                continue
            
            current = float(df["Close"].iloc[-1])
            
            if ticker in prev_prices:
                change = (current / prev_prices[ticker] - 1) * 100
                if abs(change) >= ALERT_THRESHOLD:
                    msg = f"[{name}({ticker})] 急変動: {change:+.1f}% (現値:{current:.0f})"
                    alerts.append(msg)
                    logger.warning(msg)
            
            prev_prices[ticker] = current
            logger.info(f"{ticker}: {current:.2f}")
        
        except Exception as e:
            logger.error(f"{ticker}取得エラー: {e}")
    
    if alerts:
        msg = "\n".join([f"【株価アラート】"] + alerts)
        send_line_notify(msg)

def main():
    logger.info("株価監視開始")
    send_line_notify("【株価監視】起動しました")
    
    while True:
        try:
            if is_trading_hours():
                check_stocks()
            else:
                logger.info("取引時間外 - スキップ")
            
            time.sleep(CHECK_INTERVAL)
        except KeyboardInterrupt:
            logger.info("監視を停止")
            break
        except Exception as e:
            logger.error(f"予期しないエラー: {e}")
            time.sleep(60)

if __name__ == "__main__":
    main()

systemdサービスとして登録(自動起動)

# サービスファイルを作成
sudo nano /etc/systemd/system/stock-monitor.service
[Unit]
Description=Stock Price Monitor
After=network.target

[Service]
User=pi
WorkingDirectory=/home/pi
Environment="LINE_TOKEN=your_line_notify_token"
ExecStart=/home/pi/stock-env/bin/python3 /home/pi/stock_monitor.py
Restart=always
RestartSec=30

[Install]
WantedBy=multi-user.target
# サービスを有効化・起動
sudo systemctl daemon-reload
sudo systemctl enable stock-monitor
sudo systemctl start stock-monitor

# 動作確認
sudo systemctl status stock-monitor
tail -f /home/pi/stock_monitor.log

消費電力・コスト

Raspberry Pi 4の消費電力は最大7W程度。24時間365日稼働した場合:

  • 年間電力: 7W × 24h × 365日 = 約61kWh
  • 電気代: 61kWh × 25円 = 約1,500円/年

まとめ

Raspberry Piを使えば年間1,500円程度の電気代で24時間365日の株価監視システムが構築できます。LINE通知と組み合わせることで、急変動を即座に知ることができます。

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