feat(research): collettore full-chain opzioni con book_depth e colonna source
Aggiunge un secondo collettore opzioni indipendente dal live, pensato per
trasformare il dataset da "skew/premi medi" a backtest opzioni vero
(per-trade e standing put).
- option_chain_research_cycle.py: cattura tutte le scadenze <= expiry_max_days
(1g..3mesi) ed entrambe le ali (OI>=100, filtro moneyness opzionale),
popolando book_depth_top3 via orderbook_depth_top3 (concorrenza limitata)
cosi' lo slippage reale e' modellabile. Best-effort come il collettore live.
- migrazione 0007: colonna `source` su option_chain_snapshots ('live' default
per le righe storiche, 'research' per il nuovo collettore) + indice
(asset, source, timestamp). user_version 6 -> 7.
- ResearchCollectorConfig (schema): blocco `research_collector`, enabled=false
di default (costo API non trascurabile); cron orario, expiry_max_days=95.
- orchestrator: job `option_chain_research` schedulato solo se data-analysis
attiva E research_collector.enabled.
- repository: insert+mapper estesi con `source`; list_option_chain_snapshots
accetta un filtro `source` per le query di backtest.
Verificato in isolamento (immagine + interprete reali): import, migrazione,
round-trip repo. Suite: 527 passed, zero regressioni vs baseline pristina.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -37,6 +37,9 @@ from cerbero_bite.runtime.market_snapshot_cycle import (
|
||||
from cerbero_bite.runtime.option_chain_snapshot_cycle import (
|
||||
collect_option_chain_snapshot,
|
||||
)
|
||||
from cerbero_bite.runtime.option_chain_research_cycle import (
|
||||
collect_option_chain_research,
|
||||
)
|
||||
from cerbero_bite.runtime.monitor_cycle import MonitorCycleResult, run_monitor_cycle
|
||||
from cerbero_bite.runtime.recovery import recover_state
|
||||
from cerbero_bite.runtime.scheduler import JobSpec, build_scheduler
|
||||
@@ -320,6 +323,13 @@ class Orchestrator:
|
||||
|
||||
await _safe("option_chain_snapshot", _do)
|
||||
|
||||
async def _option_chain_research() -> None:
|
||||
async def _do() -> None:
|
||||
for asset in self._ctx.cfg.research_collector.assets:
|
||||
await collect_option_chain_research(self._ctx, asset=asset)
|
||||
|
||||
await _safe("option_chain_research", _do)
|
||||
|
||||
jobs: list[JobSpec] = [
|
||||
JobSpec(name="health", cron=health_cron, coro_factory=_health),
|
||||
JobSpec(name="backup", cron=backup_cron, coro_factory=_backup),
|
||||
@@ -354,6 +364,21 @@ class Orchestrator:
|
||||
coro_factory=_option_chain_snapshot,
|
||||
)
|
||||
)
|
||||
rc = self._ctx.cfg.research_collector
|
||||
if rc.enabled:
|
||||
jobs.append(
|
||||
JobSpec(
|
||||
name="option_chain_research",
|
||||
cron=rc.cron,
|
||||
coro_factory=_option_chain_research,
|
||||
)
|
||||
)
|
||||
_log.info(
|
||||
"research collector ENABLED (cron=%s, window<=%dd, depth=%s)",
|
||||
rc.cron,
|
||||
rc.expiry_max_days,
|
||||
rc.fetch_book_depth,
|
||||
)
|
||||
else:
|
||||
_log.warning(
|
||||
"data analysis disabled (CERBERO_BITE_ENABLE_DATA_ANALYSIS="
|
||||
|
||||
Reference in New Issue
Block a user