コンテンツにスキップ

ライブデータアーカイブシステム

📦 Live Data Archive

リアルタイムデータの永続化と将来のバックテスト活用


🎯 目的

ライブデータアーカイブシステムは、以下の目的で設計されています:

  1. 将来のバックテスト精度向上 - 実際のライブデータを使用することで、より正確なバックテストが可能
  2. データ欠損の防止 - Mac再起動やAPI障害時のデータ欠損を最小化
  3. トレード分析の高度化 - 過去のトレードとその時点の市場状況を完全に再現

📊 アーカイブ対象データ

5
データタイプ
56
対象銘柄
15分
アーカイブ間隔
Parquet
保存形式
データタイプ 説明 取得頻度 保存形式
UW Flow Unusual Whalesオプションフロー リアルタイム Parquet (zstd)
Options オプションチェーン(価格・Greeks) 15分 Parquet (zstd)
GEX Gamma Exposureプロファイル 15分 Parquet (zstd)
Stocks 1分足OHLCV + VWAP EOD一括 Parquet (zstd)
IV Rank Barchart IV Rank 1日2回 Parquet (zstd)

🏗️ システムアーキテクチャ

graph TB
    subgraph "データソース"
        UW[Unusual Whales API]
        TD[ThetaData API]
        PG[Polygon API]
        BC[Barchart Scraper]
    end

    subgraph "アーカイブコア"
        AM[ArchiveManager]
        AS[ArchiveState]
        LDA[LiveDataArchive]
    end

    subgraph "スケジューラ"
        LA1[archive_uw_flow.py<br/>継続実行]
        LA2[archive_market_data.py<br/>15分間隔]
        LA3[archive_eod_fill.py<br/>EOD実行]
    end

    subgraph "ストレージ"
        PQ[(Parquet Files)]
        ST[(_state.json)]
    end

    UW --> LA1
    TD --> LA2
    PG --> LA2
    PG --> LA3
    BC --> LA3

    LA1 --> LDA
    LA2 --> LDA
    LA3 --> LDA

    LDA --> PQ
    AS --> ST

📁 ディレクトリ構造

data/archive/
├── _state.json                    # アーカイブ状態管理
├── uw_flow/
│   └── date=2025-11-28/          # ET日付でパーティション
│       └── uw_flow_20251128.parquet
├── options/
│   └── date=2025-11-28/
│       └── options_20251128.parquet
├── gex/
│   └── date=2025-11-28/
│       └── gex_20251128.parquet
├── stocks/
│   └── date=2025-11-28/
│       └── stocks_1m_20251128.parquet
├── iv_rank/
│   └── date=2025-11-28/
│       └── iv_rank_20251128.parquet
└── trades/
    └── date=2025-11-28/
        └── trades_20251128.parquet

タイムゾーン

すべてのファイルはET(Eastern Time)日付でパーティションされます。 タイムスタンプはUTCで保存され、ET_offsetフィールドでオフセットを記録します。


🔧 コアモジュール

core/archive.py

アーカイブの中心モジュール。PyArrowスキーマ定義とParquet書き込みを担当。

from core.archive import LiveDataArchive, ArchiveType

# アーカイブインスタンス作成
archive = LiveDataArchive()

# UWフローを記録
archive.write_uw_flow({
    "timestamp": datetime.now(timezone.utc),
    "symbol": "NVDA",
    "strike": 140.0,
    "expiration": date(2025, 12, 20),
    "option_type": "CALL",
    "sentiment": "BULLISH",
    "premium": 125000.0,
    "volume": 500,
    # ...
})

core/archive_state.py

アーカイブ状態の追跡とギャップ検出を担当。

from core.archive_state import ArchiveState

state = ArchiveState()

# 最終アーカイブ時刻を更新
state.update_last_archive(ArchiveType.UW_FLOW)

# ギャップを検出
gaps = state.detect_gaps(ArchiveType.STOCKS)
for gap in gaps:
    print(f"Gap: {gap['start']} - {gap['end']}")

core/market_time.py

市場時間とタイムゾーン処理のユーティリティ。

from core.market_time import (
    get_market_date,
    get_market_status,
    is_market_open,
    format_et_timestamp
)

# 現在のET日付を取得
today = get_market_date()  # date(2025, 11, 28)

# 市場ステータスを取得
status = get_market_status()  # "open" | "pre_market" | "after_hours" | "closed"

⏰ 運用スケジュール

継続実行
UW Flow Archive
archive_uw_flow.py --continuous
60秒間隔でフローデータを取得・保存
15分間隔
Market Data Archive
run_paper_trading.py内で自動実行
オプション・GEX・株価スナップショット
JST 07:00
EOD Gap Fill
archive_eod_fill.py
1分足データ一括取得・ギャップ補填
JST 09:00/21:00
IV Rank Archive
Barchart scraperが取得したCSVをParquet化

📈 データスキーマ

詳細なスキーマ定義は データ形式 を参照してください。

UW Flow Schema

フィールド 説明
timestamp timestamp[us, tz=UTC] 取得時刻
symbol string ティッカー
strike float64 ストライク価格
expiration date32 満期日
option_type string CALL/PUT
sentiment string BULLISH/BEARISH/NEUTRAL
premium float64 プレミアム総額
volume int64 出来高
size int64 取引サイズ
iv float64 インプライドボラティリティ
delta float64 デルタ
is_unusual bool 異常フラグ

🔄 ギャップ補填

Mac再起動やAPI障害によるデータ欠損を検出・補填する仕組み。

sequenceDiagram
    participant S as archive_eod_fill.py
    participant AS as ArchiveState
    participant API as Polygon API
    participant PQ as Parquet Files

    S->>AS: detect_gaps(STOCKS)
    AS-->>S: gaps: [{start, end}, ...]

    loop 各ギャップ
        S->>API: 1分足データ取得
        API-->>S: OHLCV data
        S->>PQ: 追記保存
    end

    S->>AS: update_last_archive(STOCKS)

詳細は ギャップ補填 を参照してください。


📊 ストレージ見積もり

データタイプ 1日あたり 1ヶ月あたり 1年あたり
UW Flow ~5 MB ~100 MB ~1.2 GB
Options ~50 MB ~1 GB ~12 GB
GEX ~2 MB ~40 MB ~500 MB
Stocks (1m) ~100 MB ~2 GB ~24 GB
IV Rank ~1 MB ~20 MB ~250 MB
合計 ~160 MB ~3.2 GB ~38 GB

圧縮効率

Parquet + zstd圧縮により、生データ比で約70-80%のサイズ削減を実現。


🚀 次のステップ