TradingAgents/docs/Reddit_API_Requirements.md

8.8 KiB
Raw Blame History

Reddit API (praw) 実装要件定義書

1. 概要

既存のローカルファイルベースのRedditデータ取得を、Reddit API (praw)を使用したリアルタイム取得に変更し、過去データの収集とキャッシュ機能を実装する。

2. 機能要件

2.1 データ取得範囲

Global News カテゴリ

以下のsubredditから金融・経済関連のグローバルニュースを取得

  • r/worldnews - 世界ニュース
  • r/news - 一般ニュース
  • r/economics - 経済ニュース
  • r/finance - 金融ニュース
  • r/business - ビジネスニュース

Company News カテゴリ

以下のsubredditから企業・株式関連情報を取得

  • r/stocks - 株式投資全般
  • r/StockMarket - 株式市場動向
  • r/wallstreetbets - トレーダーコミュニティ
  • r/investing - 投資戦略
  • r/SecurityAnalysis - 企業分析

2.2 企業関連投稿の検索戦略(推奨)

ハイブリッドアプローチを採用:

  1. 直接検索: Reddit検索APIで企業名/ティッカーを検索API効率的
  2. ストリーム監視: 新着投稿をリアルタイムで取得し、企業名/ティッカーでフィルタリング
  3. 人気投稿スキャン: 各subredditのtop/hot投稿を定期取得してフィルタリング
# 検索例
def search_company_posts(ticker: str, company_name: str):
    # 1. Reddit検索API
    search_queries = [
        f'"{ticker}"',
        f'"{company_name}"',
        f'${ticker}',  # Cashtag
    ]
    
    # 2. タイトルと本文でのマッチング
    # 3. 重複排除post ID使用

2.3 データ収集粒度API制限を考慮した推奨設定

Reddit API制限

  • 認証済みアプリ: 100リクエスト/分QPM
  • 1リクエストで最大100アイテム取得可能
  • 10分間の平均でレート制限を計算バースト対応

最適化されたデータ収集設定

  • Global News:
    • 各subredditから上位50-100件/日1リクエストで取得可能
    • 5 subreddits × 1リクエスト = 5リクエスト/日
  • Company News:
    • 各企業につき上位50件/日1リクエストで取得
    • 人気10銘柄の場合: 10リクエスト/日
    • 追加銘柄: バッチ処理で効率化

バッチ処理戦略

  • 1分あたり最大80リクエストに制限バッファ20%
  • 大量銘柄の場合は時間分散:
    • 50銘柄 = 約1分で完了
    • 500銘柄 = 約7分で完了レート制限考慮
  • ソート基準: Hot → Top (24h) → New の優先順位

2.4 重複排除

  • Reddit post IDを使用してグローバルに重複を排除
  • 同一投稿が複数subredditに投稿された場合、最初に取得したものを保持

3. CLI インターフェース

3.1 過去データ取得(対話形式)

python -m cli.main reddit fetch-historical

# 対話形式のプロンプト
> Which category? (global_news/company_news/both): both
> Start date (YYYY-MM-DD): 2024-01-01
> End date (YYYY-MM-DD) [default: today]: 2024-03-31
> For company news, select tickers:
  1. Popular Tech Stocks (15 tickers)
  2. S&P 500 Top 20
  3. Global Indices (20 ETFs)
  4. All Combined (50+ tickers)
  5. Quick Test (5 tickers)
  6. Custom (enter your own)
> Select option (1-6): 1
> Confirm fetch? This may take several minutes. (y/n): y

3.2 日次更新

# 昨日のデータを取得
python -m cli.main reddit update --date yesterday

# 特定日のデータを取得
python -m cli.main reddit update --date 2024-03-15

# 自動実行用(エラー時はログ記録)
python -m cli.main reddit update --auto

3.3 データ検証

# キャッシュ状況確認
python -m cli.main reddit status

# 特定期間のデータ完全性チェック
python -m cli.main reddit verify --start 2024-01-01 --end 2024-03-31

4. キャッシュ設計

4.1 ディレクトリ構造

/Users/y_sato/Library/Mobile Documents/com~apple~CloudDocs/curosur/API疎通確認ずみ/APIテスト完了済み/TradingAgents/Datasource/
└── reddit_data/
    ├── global_news/
    │   ├── r_worldnews_2024-01-01.jsonl
    │   ├── r_economics_2024-01-01.jsonl
    │   └── ...
    ├── company_news/
    │   ├── AAPL_2024-01-01.jsonl
    │   ├── MSFT_2024-01-01.jsonl
    │   └── ...
    └── metadata/
        ├── fetch_history.json  # 取得履歴
        ├── post_ids.db        # 重複チェック用
        └── ticker_presets.json # デフォルトTickerリスト

4.2 JSONL形式既存互換

{
  "id": "1a2b3c4",
  "title": "Apple announces new product",
  "selftext": "Content here...",
  "url": "https://reddit.com/...",
  "ups": 1234,
  "created_utc": 1704067200,
  "subreddit": "r/stocks",
  "author": "username",
  "num_comments": 56,
  "ticker": "AAPL"  // 企業投稿の場合
}

5. 実装アーキテクチャ

5.1 モジュール構成

tradingagents/dataflows/
├── reddit_praw_client.py    # prawクライアントラッパー
├── reddit_fetcher.py         # データ取得ロジック
├── reddit_cache_manager.py   # キャッシュ管理
└── reddit_utils.py           # 既存互換性レイヤー

5.2 エラーハンドリング

  • API接続エラー: 上位層に例外を伝播
  • Rate limit エラー: 自動リトライ with exponential backoff
  • 認証エラー: 即座に例外を発生させる

5.3 設定管理

# tradingagents/config.py に追加
REDDIT_CONFIG = {
    "user_agent": "TradingAgents/1.0",
    "rate_limit_pause": 1.0,  # 秒
    "max_retries": 3,
    "data_base_dir": "/Users/y_sato/Library/Mobile Documents/com~apple~CloudDocs/curosur/API疎通確認ずみ/APIテスト完了済み/TradingAgents/Datasource",
    "cache_dir": "reddit_data",
    "global_news_subreddits": [
        "worldnews", "news", "economics", "finance", "business"
    ],
    "company_news_subreddits": [
        "stocks", "StockMarket", "wallstreetbets", "investing", "SecurityAnalysis"
    ],
    "daily_post_limits": {
        "global_news": 100,
        "company_news": 50
    },
    "default_ticker_presets": {
        "tech": ["AAPL", "MSFT", "NVDA", "GOOGL", "META", "AMZN", "TSLA", "AMD", "INTC", "NFLX", "AVGO", "ORCL", "ADBE", "CRM", "QCOM"],
        "sp500": ["AAPL", "MSFT", "NVDA", "AMZN", "META", "GOOGL", "GOOG", "BRK.B", "LLY", "AVGO", "JPM", "TSLA", "V", "UNH", "XOM", "MA", "JNJ", "WMT", "PG", "HD"],
        "indices": ["SPY", "QQQ", "DIA", "IWM", "EWJ", "DXJ", "EWG", "EWQ", "EWU", "FEZ", "EEM", "FXI", "INDA", "EWZ", "XLK", "XLF", "XLE", "XLV"],
        "quick": ["AAPL", "MSFT", "NVDA", "TSLA", "SPY"]
    }
}

6. 自動実行設定

6.1 Cron設定例

# 毎日午前6時に前日データを取得
0 6 * * * cd /path/to/TradingAgents && python -m cli.main reddit update --auto >> logs/reddit_update.log 2>&1

# 毎週月曜日に先週のデータ完全性をチェック
0 9 * * 1 cd /path/to/TradingAgents && python -m cli.main reddit verify --days 7 >> logs/reddit_verify.log 2>&1

6.2 エラー通知

  • ログファイルにエラー記録
  • 重要なエラー(認証失敗等)はメール/Slack通知オプション

7. 移行計画

Phase 1: 基盤実装

  1. praw クライアントラッパー実装
  2. 基本的なデータ取得機能
  3. キャッシュ管理機能

Phase 2: CLI実装

  1. 対話形式の過去データ取得
  2. 日次更新コマンド
  3. ステータス確認機能

Phase 3: 自動化

  1. エラーハンドリング強化
  2. 自動実行対応
  3. 既存システムとの統合テスト

8. 性能要件

API制限に基づく現実的な性能目標

  • レート制限: 100 requests/minute認証済み
  • バッチサイズ: 100 items/request
  • 安全マージン: 80 requests/minute で運用

データ取得時間の見積もり

1日分のデータ:

  • Global News: 5 subreddits = 5リクエスト
  • Company News (50銘柄): 50リクエスト
  • 合計: 55リクエスト = 約1分で完了

1ヶ月分30日の過去データ:

  • 各日付ごとに処理が必要
  • Global News: 5 × 30 = 150リクエスト
  • Company News (50銘柄): 50 × 30 = 1,500リクエスト
  • 合計: 1,650リクエスト = 約21分で完了

1年分365日の過去データ:

  • Global News: 5 × 365 = 1,825リクエスト
  • Company News (50銘柄): 50 × 365 = 18,250リクエスト
  • 合計: 20,075リクエスト = 約4.2時間で完了

最適化のポイント

  • 並列処理は避ける(レート制限違反のリスク)
  • 2秒間隔でリクエストを送信30 requests/minuteで安定運用
  • エラー時の再試行は exponential backoff を使用

9. セキュリティ

  • Reddit認証情報は環境変数で管理
  • キャッシュデータへのアクセス制限
  • ログに認証情報を含めない