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との組み合わせで定期実行も簡単に設定できます。

