TradingAgents/docs/Reddit_API_Requirements.md

260 lines
8.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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認証情報は環境変数で管理
- キャッシュデータへのアクセス制限
- ログに認証情報を含めない