AWS Lambdaで低コスト自動売買システムを構築する方法

自動化・運用

AWS Lambdaはサーバーレスでコードを実行できるサービスです。月100万リクエストまで無料枠があり、1日1回実行する株価分析・アラートシステムであれば実質無料で運用できます。

AWS Lambdaを使うメリット

  • サーバーの管理・維持が不要
  • 実行時のみ課金(アイドル時は0円)
  • EventBridgeで定期実行が簡単に設定できる
  • SESやSNSと連携してメール・SMS通知が可能

Lambdaで動かすPythonスクリプト

import json
import yfinance as yf
import pandas as pd
import numpy as np
import urllib.request
import os
from datetime import datetime

# 環境変数から設定を取得(Lambda環境変数に設定)
SLACK_WEBHOOK = os.environ.get("SLACK_WEBHOOK_URL", "")
WATCHLIST = ["7203.T", "9984.T", "AAPL", "NVDA"]

def analyze_stock(ticker):
    """銘柄を分析してアラート条件を判定"""
    df = yf.download(ticker, period="3mo", progress=False)
    if df.empty:
        return None
    
    close = df["Close"]
    current = float(close.iloc[-1])
    prev = float(close.iloc[-2])
    change_pct = (current / prev - 1) * 100
    
    # RSI計算
    delta = close.diff()
    gain = delta.clip(lower=0).rolling(14).mean()
    loss = (-delta.clip(upper=0)).rolling(14).mean()
    rsi = float(100 - (100 / (1 + gain.iloc[-1] / loss.iloc[-1])))
    
    # アラート判定
    alerts = []
    if abs(change_pct) >= 5:
        alerts.append(f"前日比{change_pct:+.1f}%(大幅変動)")
    if rsi <= 30:
        alerts.append(f"RSI={rsi:.0f}(売られすぎ)")
    elif rsi >= 70:
        alerts.append(f"RSI={rsi:.0f}(買われすぎ)")
    
    return {
        "ticker": ticker,
        "price": round(current, 2),
        "change_pct": round(change_pct, 2),
        "rsi": round(rsi, 1),
        "alerts": alerts
    }

def send_slack_notification(message):
    """SlackにWebhookでメッセージを送信"""
    if not SLACK_WEBHOOK:
        print("SLACK_WEBHOOK_URL not set")
        return
    
    payload = json.dumps({"text": message}).encode("utf-8")
    req = urllib.request.Request(
        SLACK_WEBHOOK,
        data=payload,
        headers={"Content-Type": "application/json"}
    )
    with urllib.request.urlopen(req) as response:
        return response.status

def lambda_handler(event, context):
    """Lambdaのエントリーポイント"""
    today = datetime.now().strftime("%Y-%m-%d %H:%M")
    results = []
    alert_messages = []
    
    for ticker in WATCHLIST:
        data = analyze_stock(ticker)
        if data:
            results.append(data)
            if data["alerts"]:
                for alert in data["alerts"]:
                    alert_messages.append(f"[{ticker}] {alert}")
    
    # サマリーメッセージ作成
    summary = f"【株価レポート】{today}\n"
    for r in results:
        summary += f"{r['ticker']}: {r['price']} ({r['change_pct']:+.1f}%)\n"
    
    if alert_messages:
        summary += "\n【アラート】\n" + "\n".join(alert_messages)
    
    print(summary)
    send_slack_notification(summary)
    
    return {
        "statusCode": 200,
        "body": json.dumps({"message": "完了", "analyzed": len(results)})
    }

# ローカルテスト用
if __name__ == "__main__":
    result = lambda_handler({}, None)
    print(result)

Lambda Layer(依存ライブラリ)の準備

# ローカルでレイヤー用パッケージを準備
mkdir -p lambda_layer/python
cd lambda_layer
pip install yfinance pandas numpy -t python/ --platform manylinux2014_x86_64 --only-binary=:all:
zip -r layer.zip python/
# このlayer.zipをLambdaレイヤーとしてアップロード

EventBridgeで定期実行の設定

AWS Console → EventBridge → ルール → ルールを作成 から設定します。

スケジュール式(cron形式):
毎平日9:10に実行: cron(10 0 ? * MON-FRI *)
毎日15:30に実行: cron(30 6 ? * MON-FRI *)
※ EventBridgeはUTC時刻。JST = UTC + 9時間

CloudWatchでログを確認

Lambda実行ログはCloudWatch Logsに自動保存されます。エラー発生時もログで原因を特定できます。

月額コスト試算

1日2回実行、実行時間30秒、メモリ256MBの場合:

  • Lambda無料枠:月100万リクエスト・40万GB秒 → 実質0円
  • CloudWatch Logs:最初の5GBは無料 → 0円
  • 合計:月額ほぼ0円

まとめ

AWS Lambdaを使うことで、サーバー管理不要・低コストで株価監視システムを24時間稼働させられます。EventBridgeとの組み合わせで定期実行も簡単に設定できます。

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