Skip to content

feat(research): I5e MMP quintile CSI300 independent generalization (EXPLORATORY)#53

Merged
StackOverFlow11 merged 1 commit into
mainfrom
feat/i5e-mmp-quintile-generalization
Jun 20, 2026
Merged

feat(research): I5e MMP quintile CSI300 independent generalization (EXPLORATORY)#53
StackOverFlow11 merged 1 commit into
mainfrom
feat/i5e-mmp-quintile-generalization

Conversation

@StackOverFlow11

Copy link
Copy Markdown
Owner

Summary

Freeze the accepted I5d MMP quintile grouped-backtest machinery and run an
independent-universe generalization check for the MMP intraday signal. I5d (PR
#39) found clean Q1→Q5 monotonicity on CSI500 over one 5-year window; that is
not enough evidence. This PR re-runs the SAME frozen machinery on CSI300
(000300.SH)
over the SAME window (2021-06-01 → 2026-05-31) so monotonicity can be
attributed to the factor rather than the original universe/regime.

Config-only change — the MMP math, equal-count bucket semantics (Q1 = lowest,
Q5 = highest), the I5a/I5b intraday tail event model (14:50 decision / 14:51
execution, exec-to-exec returns), raw stk_limit execution feasibility, and the
cache-only anchor-date minute loading are all unchanged. Report name/title are
already config-driven, so no code change is needed. EXPLORATORY, not a
performance claim; no tuning / no learned alpha / no new factors.

Changed files (1)

  • config/phase_i5e_mmp_quintile_csi300_generalization.yaml (new) — CSI300 cell,
    unique I5e project/output/report names + title; everything else identical to the
    accepted I5d config.

Preflight (independent cell choice)

  • CSI300 minute-cache coverage over the full window: 448 / 481 = 93.1% covered
    (≥ accepted CSI500 89.6%) → enough cross-section for 5 equal-count groups.
  • No fallback to CSI1000 needed; the 5-year window is NOT shortened.
  • CSI300 index_weight was only cached for ~1 recent year (ledger honest, no false
    coverage); the missing membership was fetched via the existing P4 daily
    read-through cache (21 index_weight calls) — exactly as I5d did. Minute bars
    stay cache-only.

Result — monotonicity FAILS to generalize

covered=448/481, stk_mins_live_calls=0, rebalances=59, fee_rate=0.001

group final NAV annual Sharpe maxDD
Q1 (low MMP) 0.8809 -2.55% -0.04 -34.3%
Q2 0.7377 -6.00% -0.26 -38.7%
Q3 0.9418 -1.21% +0.02 -34.2%
Q4 0.7573 -5.50% -0.20 -44.2%
Q5 (high MMP) 0.6665 -7.92% -0.30 -53.9%
  • monotonicity Spearman: −0.5000 (final NAV & annual) — vs +1.0000 on CSI500.
  • Q5−Q1 synthetic spread: mean −0.45%/period, cumulative −26.77% (vs +17.15% on CSI500).
  • Q5 (high MMP) is the WORST group, not the best. High-MMP groups do not
    outperform low-MMP groups on CSI300.

Verdict: FAILS — the I5d CSI500 monotonicity does NOT generalize to CSI300 (it
reverses), strongly suggesting the CSI500 result was universe/regime-specific. This
is exactly the negative evidence the independent check was designed to surface. The
CSI500 comparison is shown as context only, never as a performance claim.

Report / log / figures (gitignored artifacts):
artifacts/reports/phase_i5e_mmp_quintile_csi300_generalization.md (+ _figures/),
artifacts/logs/phase_i5e_mmp_quintile_csi300_generalization.log.

Gates (all green)

  • targeted I5a/I5b/I5c/I5d tests: pass (machinery frozen)
  • full pytest: 678 passed (677 baseline + 1 from the test_cache_config.py
    config-glob parametrization auto-covering the new config)
  • ruff: clean · validate-config: 18/18 OK · run-phase0: ic_mean=0.9600,
    annual_return=0.8408
    unchanged
  • git diff --check clean; no merge markers
  • secret scan: real token value 0 hits in config / report / log / figures;
    report/log contain no .config.json / tushare.token literals

Non-goals honored

No MMP/bucket/event-timing/execution-feasibility change; no learned alpha / IC
weights / new factors / tuning; no partial-fill/liquidity realism; no schema
registry / D6; no live data-update or minute backfill (stk_mins_live_calls=0);
no progress-doc edits (AGENTS.md / CLAUDE.md / contract doc untouched — separate
post-acceptance goal); PR #38 untouched.

⚠️ Do not merge until Codex acceptance.

…n config

Freeze the accepted I5d MMP quintile grouped-backtest machinery and add a new
config to re-run it on an independent universe (CSI300, 000300.SH) over the same
2021-06-01..2026-05-31 window, testing whether the CSI500 Q1->Q5 MMP monotonicity
(PR #39) attributes to the factor rather than the original universe/regime.

Config-only: the MMP math, equal-count bucket semantics, the I5a/I5b intraday
tail event model (14:50 decision / 14:51 execution, exec-to-exec returns), raw
stk_limit execution feasibility, and cache-only anchor-date minute loading are all
unchanged. Report name/title are config-driven, so no code change is needed. Only
the universe (000905.SH -> 000300.SH) and the report labels differ. EXPLORATORY,
not a performance claim; no tuning, no learned alpha, no new factors.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant