TradingAgents/docs/013_Reddit_Automated_Update...

7.4 KiB
Raw Blame History

チケット #013: Reddit自動更新機能実装

概要

Redditデータの定期的な自動更新機能とスケジューラー設定の実装

目的

  • 日次での自動データ更新
  • エラー時の通知とリトライ
  • 実行ログの管理
  • cron/スケジューラーとの統合

実装要件

1. 段階的実装アプローチ

# USE_PRAW_APIフラグによる実装切り替え
from tradingagents.config import USE_PRAW_API

if USE_PRAW_API:
    # 新しいpraw実装での自動更新
    from .reddit_praw_updater import RedditDailyUpdater
else:
    # 既存のファイルベース更新(何もしない)
    class RedditDailyUpdater:
        def run_daily_update(self, date):
            print("Offline mode - no updates needed")

2. 自動更新スクリプト

# scripts/reddit_daily_update.py

class RedditDailyUpdater:
    def __init__(self, config_path: str = None):
        """
        Args:
            config_path: 設定ファイルパス
        """
        self.config = self.load_config(config_path)
        self.logger = self.setup_logging()
        
    def run_daily_update(self, date: str = None):
        """
        日次更新のメイン処理
        
        Args:
            date: 対象日付(デフォルト: 昨日)
        """
        if not date:
            date = (datetime.now() - timedelta(days=1)).strftime('%Y-%m-%d')
        
        self.logger.info(f"Starting daily update for {date}")
        
        try:
            # データ取得
            results = self.fetch_all_data(date)
            
            # 結果の検証
            self.validate_results(results)
            
            # 成功通知
            self.notify_success(date, results)
            
        except Exception as e:
            self.handle_error(date, e)

3. 設定ファイル

# config/reddit_auto_update.yaml

daily_update:
  # 取得対象
  categories:
    - global_news
    - company_news
  
  # 対象ティッカー
  tickers:
    preset: "sp500"  # または具体的なリスト
    # custom: ["AAPL", "MSFT", "NVDA"]
  
  # 実行時間設定
  schedule:
    time: "02:00"  # 午前2時実行
    timezone: "America/New_York"
  
  # リトライ設定
  retry:
    max_attempts: 3
    delay_seconds: 300  # 5分間隔
  
  # 通知設定
  notifications:
    on_error: true
    on_success: false
    methods:
      - log_file
      # - email
      # - slack

# ログ設定
logging:
  level: INFO
  file: logs/reddit_update.log
  max_size: 10MB
  backup_count: 7

4. エラーハンドリングとリトライ

def fetch_with_retry(self, fetch_func, *args, **kwargs):
    """
    リトライ機能付きデータ取得
    """
    max_attempts = self.config['retry']['max_attempts']
    delay = self.config['retry']['delay_seconds']
    
    for attempt in range(max_attempts):
        try:
            return fetch_func(*args, **kwargs)
        except RedditAPIError as e:
            if attempt < max_attempts - 1:
                self.logger.warning(
                    f"Attempt {attempt + 1} failed: {e}. "
                    f"Retrying in {delay} seconds..."
                )
                time.sleep(delay)
            else:
                raise

5. 実行ログ管理

class UpdateLogger:
    """
    更新実行のログ管理
    """
    def log_execution(self,
                     date: str,
                     status: str,
                     details: dict):
        """
        実行結果をログに記録
        
        ログ形式:
        {
            "timestamp": "2024-03-15T02:05:30Z",
            "date": "2024-03-14",
            "status": "success",
            "categories": {
                "global_news": {
                    "posts_fetched": 250,
                    "new_posts": 230
                },
                "company_news": {
                    "tickers_processed": 50,
                    "total_posts": 1250
                }
            },
            "duration_seconds": 180,
            "errors": []
        }
        """
        pass

6. Cron設定

# crontab設定例

# 毎日午前2時に実行米国東部時間
0 2 * * * cd /path/to/TradingAgents && /usr/bin/python3 -m scripts.reddit_daily_update >> logs/cron.log 2>&1

# 週次でデータ検証毎週月曜日午前9時
0 9 * * 1 cd /path/to/TradingAgents && /usr/bin/python3 -m cli.main reddit verify --days 7 >> logs/verify.log 2>&1

# 月次でストレージクリーンアップ毎月1日午前3時
0 3 1 * * cd /path/to/TradingAgents && /usr/bin/python3 -m scripts.reddit_cleanup --days 90 >> logs/cleanup.log 2>&1

7. systemdサービスAlternative

# /etc/systemd/system/reddit-updater.service

[Unit]
Description=Reddit Data Daily Updater
After=network.target

[Service]
Type=oneshot
User=tradingagents
WorkingDirectory=/path/to/TradingAgents
Environment="PATH=/usr/bin:/usr/local/bin"
ExecStart=/usr/bin/python3 -m scripts.reddit_daily_update

[Install]
WantedBy=multi-user.target

8. 監視とアラート

class UpdateMonitor:
    """
    更新の監視とアラート
    """
    def check_last_update(self):
        """
        最後の更新をチェック
        24時間以上更新がない場合はアラート
        """
        pass
    
    def send_alert(self, message: str, level: str = "error"):
        """
        設定に基づいてアラートを送信
        """
        if self.config['notifications']['methods']:
            for method in self.config['notifications']['methods']:
                if method == "log_file":
                    self.logger.error(message)
                # elif method == "email":
                #     self.send_email_alert(message)
                # elif method == "slack":
                #     self.send_slack_alert(message)

9. データ整合性チェック

def validate_daily_data(self, date: str) -> dict:
    """
    日次データの整合性チェック
    
    Returns:
        {
            "valid": bool,
            "issues": [...],
            "statistics": {...}
        }
    """
    validator = RedditDataValidator()
    
    # チェック項目
    checks = {
        "minimum_posts": self.check_minimum_posts(date),
        "duplicate_ratio": self.check_duplicate_ratio(date),
        "data_freshness": self.check_data_freshness(date),
        "file_integrity": self.check_file_integrity(date)
    }
    
    return validator.run_checks(checks)

受け入れ条件

  • 日次自動更新の安定動作
  • エラー時の適切なリトライ
  • 実行ログの記録と管理
  • Cron/systemdでの実行対応
  • データ整合性の自動チェック
  • 設定ファイルでの柔軟な制御
  • USE_PRAW_APIフラグでの切り替え
  • 単体テストの実装(モック使用)

依存関係

  • RedditDataFetcherチケット#009
  • RedditCacheManagerチケット#010
  • CLI実装チケット#011
  • システムのcron/systemd

タスク

  • 単体テストの作成TDD
  • USE_PRAW_APIフラグの統合
  • RedditDailyUpdaterクラスの実装
  • 設定ファイル形式の定義
  • リトライ機能の実装
  • ログ管理機能
  • Cron設定スクリプト
  • systemdサービス定義
  • 監視・アラート機能
  • データ整合性チェック
  • エラー通知機能
  • 運用ドキュメント作成