コンテンツにスキップ

IV Rank データ戦略

概要

AEGISでは、IV Rank(Implied Volatility Rank)データの取得に用途別のデータソース戦略を採用しています。

データソース

データソース 特徴 データ範囲
Barchart ヒストリカルデータ 2018-10-03 ~ 現在(7年分)
Unusual Whales リアルタイムデータ 直近7営業日(現在のプランでは)

用途別戦略

🔬 バックテスト(2019-2025年)

データソース: Barchart キャッシュ

理由: - 6年間のバックテストには過去のIV Rankが必須 - Barchartは2018年10月から7年分のデータを保有 - 全ての対象銘柄(198銘柄)で完全なデータセット

実装:

from core.data_interfaces import BarchartIVHistoryProvider

# Barchart IV Rankプロバイダー初期化
barchart_iv_dir = "/path/to/barchart-scraper/data/raw/history"
iv_provider = BarchartIVHistoryProvider(data_dir=barchart_iv_dir)

# HybridDataProviderに設定
data_provider = HybridDataProvider(
    polygon_api_key=Config.POLYGON_API_KEY,
    iv_provider=iv_provider,  # Barchart使用
    skip_theta_check=True,
)

📈 ペーパートレード / ライブ取引

データソース: Unusual Whales 優先 → Barchart フォールバック

理由: - UnusualWhalesのデータはBarchartより9日新しい(2025-12-03 vs 2025-11-24) - リアルタイム取引では最新のIV Rankが必要 - 7営業日より古いデータが必要な場合は自動的にBarchartにフォールバック

実装:

from core.uw_iv_provider import UnusualWhalesIVProvider

# UW IV Rankプロバイダー初期化(Barchartフォールバック自動)
uw_iv_provider = UnusualWhalesIVProvider(
    use_barchart_fallback=True  # 7営業日以前はBarchartに自動フォールバック
)

# HybridDataProviderに設定
data_provider = HybridDataProvider(
    polygon_api_key=Config.POLYGON_API_KEY,
    iv_provider=uw_iv_provider,
)

⏰ プレオープン時の事前取得(PT専用)

ペーパートレード開始時および日付変更時に、全銘柄のIV Rankを事前取得します。

タイミング: 1. PTボット起動時(初回スキャン前) 2. 日付が変わった時(最初のスキャンサイクル)

実装: run_paper_trading_v2.py

async def _refresh_iv_rank_if_needed(self, current_date: date) -> None:
    """
    IV Rankを日付変更時に事前取得

    プレオープン時(または日付が変わった時)に全銘柄のIV Rankを
    UnusualWhales APIから取得してキャッシュする。
    """
    # 既に今日取得済みならスキップ
    if self._iv_rank_last_refresh_date == current_date:
        return

    logger.info(f"📊 IV Rank事前取得開始: {current_date}")

    # 全銘柄を事前ロード
    self.data_provider.iv_provider.preload_all(self.symbols)
    self._iv_rank_last_refresh_date = current_date

呼び出しタイミング:

async def scan_and_trade(self):
    """銘柄をスキャンして取引判断"""
    current_date = date.today()

    # === IV Rank事前取得(プレオープン時または日付変更時)===
    await self._refresh_iv_rank_if_needed(current_date)

    # ... スキャン処理 ...

UnusualWhalesIVProvider の仕組み

自動フォールバック

UnusualWhalesIVProviderは取得失敗時に自動的にBarchartにフォールバックします:

def get_iv_rank(self, symbol: str, target_date: date) -> Optional[float]:
    """IV Rankを取得"""
    try:
        # UW APIから取得
        url = f"{UW_API_BASE}/api/stock/{symbol}/iv-rank"
        response = requests.get(url, headers=headers, timeout=10)

        if response.status_code == 200:
            # 成功時はUWデータを返す
            return iv_rank / 100.0

    except Exception as e:
        logger.debug(f"[{symbol}] UW IV Rank取得エラー: {e}")

    # Barchartフォールバック(12/17まで有効)
    if self.use_barchart_fallback and self._barchart_provider:
        logger.debug(f"[{symbol}] Barchartフォールバックを試行...")
        return self._barchart_provider.get_iv_rank(symbol, target_date)

    return None

キャッシュ機構

  • UWから取得したデータは内部キャッシュに保存
  • 同じ銘柄への2回目以降のアクセスはキャッシュから返却(高速)
  • 日付が変わったら自動的に再取得

データ品質の検証

UW vs Barchart 比較(2025-12-04テスト結果)

銘柄 UW IV Rank UWデータ日付 Barchart IV Rank Barchartデータ日付 差分
AAPL 8.91% 2025-12-03 12.93% 2025-11-24 -4.02%
TSLA 6.70% 2025-12-03 15.85% 2025-11-24 -9.15%
NVDA 19.87% 2025-12-03 26.31% 2025-11-24 -6.44%
AMD 27.71% 2025-12-03 38.22% 2025-11-24 -10.51%

観察: - UWのデータは9日新しい - IV Rankの値に4-10%の差異(計算方法の違いと思われる) - リアルタイム取引ではUWの使用が推奨される

Barchart 契約状況

結論: ❌ 解約不可

理由: 1. UWの現在のプランは過去7営業日分のみ提供 2. UWでフルヒストリカルデータを取得するにはプランアップグレードが必要 3. 6年間バックテストにはBarchartの7年分データが不可欠

今後の選択肢: - 現状維持(Barchart継続、PT用にUW併用) - UWプランアップグレード(dan@unusualwhales.comに問い合わせ)

まとめ

用途 データソース 更新頻度 実装
バックテスト Barchart キャッシュ N/A(静的) BarchartIVHistoryProvider
PT/ライブ UW → Barchartフォールバック 日次(プレオープン) UnusualWhalesIVProvider

この戦略により、バックテストの再現性ライブ取引の最新性の両立を実現しています。