# 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投稿を定期取得してフィルタリング ```python # 検索例 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 過去データ取得(対話形式) ```bash 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 日次更新 ```bash # 昨日のデータを取得 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 データ検証 ```bash # キャッシュ状況確認 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形式(既存互換) ```json { "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 モジュール構成 ```python 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 設定管理 ```python # 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設定例 ```bash # 毎日午前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認証情報は環境変数で管理 - キャッシュデータへのアクセス制限 - ログに認証情報を含めない