TradingAgents/docs/Reddit_API_Rate_Limit_Analy...

4.8 KiB
Raw Blame History

Reddit API レート制限の分析と最適なデータ収集戦略

調査結果サマリー

Reddit API の現在のレート制限2024年

  1. 認証済みOAuthクライアント: 100 queries per minute (QPM)
  2. 非認証クライアント: 10 QPM実質使用不可
  3. バッチサイズ: 1リクエストで最大100アイテム取得可能
  4. レート計算方法: 10分間の平均で計算バースト対応
  5. 制限単位: OAuth Client ID ごと(ユーザーごとではない)

重要な制約

  • 1000件制限: 各検索・リストで最大1000件までしか取得できない
  • 過去データ制限: 6ヶ月以上前の投稿は取得が困難
  • 料金: 無料枠を超えると $0.24 per 1,000 API calls

データ収集量の最適化案

現実的なデータ収集設定

1. 少量運用(推奨:初期導入・テスト用)

対象銘柄: 10銘柄
Global News: 各subreddit 50件/日 × 5 = 250件
Company News: 各銘柄 50件/日 × 10 = 500件
日次取得時間: 約1分
月次バックフィル30日: 約5分

2. 中規模運用(推奨:通常運用)

対象銘柄: 50銘柄
Global News: 各subreddit 100件/日 × 5 = 500件
Company News: 各銘柄 50件/日 × 50 = 2,500件
日次取得時間: 約2分
月次バックフィル30日: 約21分

3. 大規模運用S&P500等

対象銘柄: 500銘柄
Global News: 各subreddit 100件/日 × 5 = 500件
Company News: 各銘柄 20件/日 × 500 = 10,000件
日次取得時間: 約7分
月次バックフィル30日: 約3.5時間

レート制限を考慮した実装戦略

1. リクエスト間隔の設定

# 安全な設定
SAFE_REQUEST_INTERVAL = 0.75  # 秒80 requests/minute

# アグレッシブな設定(モニタリング必須)
AGGRESSIVE_REQUEST_INTERVAL = 0.6  # 秒100 requests/minute

# 推奨:段階的アプローチ
if total_requests < 100:
    interval = 0.6  # 短時間なら高速
elif total_requests < 1000:
    interval = 0.75  # 中規模は安全に
else:
    interval = 1.0  # 大規模は慎重に

2. 効率的なデータ取得パターン

A. 日次更新(推奨)

# 毎日深夜に前日分のデータを取得
# メリット: API負荷分散、安定運用
# デメリット: リアルタイム性なし
schedule.every().day.at("02:00").do(fetch_yesterday_data)

B. 複数回更新

# 1日3回更新市場開始前、昼、終了後
# メリット: 準リアルタイム
# デメリット: API使用量3倍
schedule.every().day.at("08:00").do(fetch_recent_data)
schedule.every().day.at("13:00").do(fetch_recent_data)
schedule.every().day.at("17:00").do(fetch_recent_data)

C. 優先度ベース

# 重要銘柄は頻繁に、その他は日次
HIGH_PRIORITY = ["AAPL", "MSFT", "NVDA", "TSLA"]
fetch_interval = {
    "high": 4,  # 4時間ごと
    "medium": 12,  # 12時間ごと
    "low": 24  # 24時間ごと
}

3. エラーハンドリングとレート制限対策

class RedditRateLimiter:
    def __init__(self):
        self.request_times = deque(maxlen=100)
        self.minute_window = 60
        
    def wait_if_needed(self):
        now = time.time()
        # 直近100リクエストをチェック
        if len(self.request_times) == 100:
            oldest = self.request_times[0]
            if now - oldest < self.minute_window:
                sleep_time = self.minute_window - (now - oldest) + 1
                time.sleep(sleep_time)
        
        self.request_times.append(now)

推奨構成

初期導入時

  1. 対象: TOP 10銘柄 + Global News
  2. 頻度: 日次更新深夜2時
  3. データ量: 各50-100件/日
  4. 所要時間: 約1-2分/日
  5. 月間API使用量: 約1,650 calls

本番運用時

  1. 対象: 50銘柄 + Global News
  2. 頻度:
    • 重要10銘柄: 6時間ごと
    • その他40銘柄: 日次
  3. データ量:
    • 重要銘柄: 100件/回
    • その他: 50件/日
  4. 所要時間: 約10分/日(分散実行)
  5. 月間API使用量: 約15,000 calls

スケーラビリティ考慮事項

  • 500銘柄以上は複数のClient IDを使用検討
  • 時間帯分散(米国市場時間外を活用)
  • キャッシュ活用でAPI呼び出し削減
  • 増分更新(新規投稿のみ取得)

まとめ

Reddit APIのレート制限100 QPMを考慮すると、中規模運用50銘柄程度が最もバランスが良い。データ収集量は各投稿50-100件/日が現実的で、これにより:

  • 十分な市場センチメント把握が可能
  • API制限内で安定運用
  • 日次更新が数分で完了
  • 月次バックフィルも30分以内

大規模運用500銘柄以上の場合は、優先度設定や時間分散などの工夫が必要。