TradingAgents/docs/009_Reddit_Data_Fetcher_Imp...

198 lines
5.5 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.

# チケット #009: Redditデータ取得ロジック実装
## 概要
RedditPrawClientを使用して、実際のデータ取得とフィルタリングを行うビジネスロジックの段階的実装
## 目的
- Global NewsとCompany Newsの効率的な取得
- 企業関連投稿の検索とフィルタリング
- 重複排除とデータ整形
- 日付指定での取得機能
- 既存システムとの互換性維持
## 実装要件
### 1. 段階的実装アプローチ
```python
# 既存システムとの並行動作をサポート
from tradingagents.config import USE_PRAW_API
if USE_PRAW_API:
# 新しいpraw実装を使用
fetcher = RedditDataFetcher(client, config)
else:
# 既存のファイルベースの実装を使用
return fetch_from_local_files()
```
### 2. クラス設計
```python
class RedditDataFetcher:
def __init__(self, client: RedditPrawClient, config: dict):
"""
Args:
client: RedditPrawClientインスタンス
config: 取得設定subredditリスト、取得件数等
"""
self.client = client
self.config = config
self.seen_post_ids = set() # 重複排除用
def fetch_global_news(self,
date: str,
limit_per_subreddit: int = 100) -> List[dict]:
"""
指定日のグローバルニュースを取得
Args:
date: 対象日付 (YYYY-MM-DD)
limit_per_subreddit: 各subredditからの取得件数
Returns:
ニュース投稿のリスト
"""
pass
def fetch_company_news(self,
ticker: str,
company_name: str,
date: str,
limit: int = 50) -> List[dict]:
"""
特定企業のニュースを取得
Args:
ticker: ティッカーシンボル
company_name: 企業名
date: 対象日付
limit: 取得件数
Returns:
企業関連投稿のリスト
"""
pass
```
### 2. 企業投稿の検索戦略
```python
def build_search_queries(ticker: str, company_name: str) -> List[str]:
"""
効果的な検索クエリを生成
Returns:
検索クエリのリスト
例: ["AAPL", "Apple", "$AAPL", "Apple Inc"]
"""
queries = [
f'"{ticker}"',
f'"{company_name}"',
f'${ticker}', # Cashtag
]
# 企業名のバリエーション対応
if " OR " in company_name:
for variant in company_name.split(" OR "):
queries.append(f'"{variant.strip()}"')
return queries
```
### 3. データフィルタリング
```python
def filter_posts_by_date(posts: List[dict], target_date: str) -> List[dict]:
"""
指定日付の投稿のみをフィルタリング
Args:
posts: 投稿リスト
target_date: 対象日付 (YYYY-MM-DD)
Returns:
フィルタリング後の投稿リスト
"""
pass
def filter_company_relevant_posts(posts: List[dict],
ticker: str,
company_name: str) -> List[dict]:
"""
企業に関連する投稿のみをフィルタリング
タイトルまたは本文に企業名/ティッカーが含まれるもの
"""
pass
```
### 4. データ整形
```python
def format_post_data(post: praw.models.Submission) -> dict:
"""
prawの投稿オブジェクトを統一形式に変換
Returns:
{
"id": str,
"title": str,
"selftext": str,
"url": str,
"ups": int,
"created_utc": int,
"subreddit": str,
"author": str,
"num_comments": int,
"ticker": str # 企業投稿の場合
}
"""
pass
```
### 5. バッチ処理
```python
def fetch_historical_data(self,
start_date: str,
end_date: str,
tickers: List[str] = None,
categories: List[str] = ["global_news", "company_news"]):
"""
過去データの一括取得
Args:
start_date: 開始日
end_date: 終了日
tickers: 対象ティッカーリスト
categories: 取得カテゴリ
Yields:
(date, category, data) のタプル
"""
pass
```
## 受け入れ条件
- [ ] 指定日付のデータのみを正確に取得
- [ ] 企業関連投稿の適切なフィルタリング
- [ ] 重複投稿の排除Reddit post ID使用
- [ ] データ形式が既存システムと互換
- [ ] エラー時の適切な処理
- [ ] 効率的なAPI使用最小限のリクエスト
- [ ] 単体テストの実装(モック使用)
- [ ] USE_PRAW_APIフラグでの切り替え動作
## 依存関係
- RedditPrawClientチケット#008
- 既存のreddit_utils.py
- デフォルトTickerリスト設定
## タスク
- [ ] 単体テストの作成TDD
- [ ] RedditDataFetcherクラスの基本実装
- [ ] Global News取得機能
- [ ] Company News取得機能
- [ ] 検索クエリ生成ロジック
- [ ] 日付フィルタリング機能
- [ ] 企業関連性フィルタリング
- [ ] データ整形機能
- [ ] 重複排除機能
- [ ] バッチ処理機能
- [ ] 段階的実装フラグのテスト
- [ ] 統合テスト作成