155 lines
4.8 KiB
Markdown
155 lines
4.8 KiB
Markdown
# 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. リクエスト間隔の設定
|
||
```python
|
||
# 安全な設定
|
||
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. 日次更新(推奨)
|
||
```python
|
||
# 毎日深夜に前日分のデータを取得
|
||
# メリット: API負荷分散、安定運用
|
||
# デメリット: リアルタイム性なし
|
||
schedule.every().day.at("02:00").do(fetch_yesterday_data)
|
||
```
|
||
|
||
#### B. 複数回更新
|
||
```python
|
||
# 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. 優先度ベース
|
||
```python
|
||
# 重要銘柄は頻繁に、その他は日次
|
||
HIGH_PRIORITY = ["AAPL", "MSFT", "NVDA", "TSLA"]
|
||
fetch_interval = {
|
||
"high": 4, # 4時間ごと
|
||
"medium": 12, # 12時間ごと
|
||
"low": 24 # 24時間ごと
|
||
}
|
||
```
|
||
|
||
### 3. エラーハンドリングとレート制限対策
|
||
|
||
```python
|
||
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銘柄以上)の場合は、優先度設定や時間分散などの工夫が必要。 |