research: park Phase B fip breadth; race guard and compact evidence
Log the 21:14 orphan as a snapshot-build race, rewrite the context table to authoritative ICs only, and soften the vol-tilt warning. Add extender completion manifest + breadth refuse guard; strip intermediate/orphaned reports; park the thread (no book sim, no deploy).
This commit is contained in:
@@ -1,8 +1,9 @@
|
||||
"""Phase B: fip_id IC on liquid-breadth cross-section (local research only).
|
||||
|
||||
1. Fingerprint check on the unextended prod snapshot (must ≈ IC −0.045 / t −2.9).
|
||||
2. Run signal_eval on research.sqlite with BACKTEST_LIQUID_BREADTH=1500 PIT mask.
|
||||
3. Write a research report under docs/research/ and reports/.
|
||||
2. Assert research.sqlite has a matching **completion manifest** (race guard).
|
||||
3. Run signal_eval on research.sqlite with BACKTEST_LIQUID_BREADTH=1500 PIT mask.
|
||||
4. Write a research report under docs/research/ and reports/.
|
||||
|
||||
Does not modify production DB, gate, scanner, or schedule.
|
||||
|
||||
@@ -209,7 +210,9 @@ async def _main() -> None:
|
||||
stamp = datetime.now().strftime("%Y%m%d-%H%M%S")
|
||||
out_json = Path(args.out) if args.out else Path("reports") / f"fip-breadth-{stamp}.json"
|
||||
out_json.parent.mkdir(parents=True, exist_ok=True)
|
||||
out_md = Path("docs/research") / "fip-breadth-ic.md"
|
||||
# Never clobber the curated research log (docs/research/fip-breadth-ic.md).
|
||||
# Machine summary goes next to the JSON report only.
|
||||
out_md = out_json.with_suffix(".md")
|
||||
|
||||
payload: dict = {
|
||||
"generated_at": datetime.now().isoformat(),
|
||||
@@ -257,17 +260,30 @@ async def _main() -> None:
|
||||
|
||||
# --- 2) Breadth ---
|
||||
if not args.skip_research:
|
||||
if not research.exists():
|
||||
raise SystemExit(
|
||||
f"Research snapshot missing: {research}\n"
|
||||
"Build it with: python scripts/extend_snapshot_universe.py"
|
||||
)
|
||||
# Refuse half-built research.sqlite (2026-07-18 21:14 race).
|
||||
scripts_dir = Path(__file__).resolve().parent
|
||||
if str(scripts_dir) not in sys.path:
|
||||
sys.path.insert(0, str(scripts_dir))
|
||||
from research_snapshot_manifest import ( # type: ignore[import-not-found]
|
||||
assert_research_snapshot_complete,
|
||||
)
|
||||
|
||||
manifest = assert_research_snapshot_complete(research)
|
||||
payload["research_snapshot_manifest"] = {
|
||||
"finished_at": manifest.get("finished_at"),
|
||||
"ticker_count": manifest.get("ticker_count"),
|
||||
"ohlcv_row_count": manifest.get("ohlcv_row_count"),
|
||||
"rank_only_count": manifest.get("rank_only_count"),
|
||||
"complete": manifest.get("complete"),
|
||||
}
|
||||
os.environ["BACKTEST_LIQUID_BREADTH"] = str(int(args.liquid_breadth))
|
||||
os.environ["BACKTEST_LIQUID_MIN_PRICE"] = str(float(args.min_price))
|
||||
if not args.quiet:
|
||||
print(
|
||||
f"Breadth run on {research} "
|
||||
f"(top {args.liquid_breadth}, min_price={args.min_price})…"
|
||||
f"(top {args.liquid_breadth}, min_price={args.min_price}; "
|
||||
f"manifest ok tickers={manifest.get('ticker_count')} "
|
||||
f"finished_at={manifest.get('finished_at')})…"
|
||||
)
|
||||
br_report = await _run_signal_eval(
|
||||
research, workers=args.workers, quiet=args.quiet
|
||||
|
||||
Reference in New Issue
Block a user