ライブデータアーカイブシステム¶
📦 Live Data Archive
リアルタイムデータの永続化と将来のバックテスト活用
🎯 目的¶
ライブデータアーカイブシステムは、以下の目的で設計されています:
- 将来のバックテスト精度向上 - 実際のライブデータを使用することで、より正確なバックテストが可能
- データ欠損の防止 - Mac再起動やAPI障害時のデータ欠損を最小化
- トレード分析の高度化 - 過去のトレードとその時点の市場状況を完全に再現
📊 アーカイブ対象データ¶
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秒間隔でフローデータを取得・保存
archive_uw_flow.py --continuous
60秒間隔でフローデータを取得・保存
15分間隔
Market Data Archive
run_paper_trading.py内で自動実行
オプション・GEX・株価スナップショット
run_paper_trading.py内で自動実行
オプション・GEX・株価スナップショット
JST 07:00
EOD Gap Fill
archive_eod_fill.py
1分足データ一括取得・ギャップ補填
archive_eod_fill.py
1分足データ一括取得・ギャップ補填
JST 09:00/21:00
IV Rank Archive
Barchart scraperが取得したCSVをParquet化
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%のサイズ削減を実現。