feat(research): I5e MMP quintile CSI300 independent generalization (EXPLORATORY)#53
Merged
Merged
Conversation
…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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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_limitexecution feasibility, and thecache-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)
(≥ accepted CSI500 89.6%) → enough cross-section for 5 equal-count groups.
index_weightwas only cached for ~1 recent year (ledger honest, no falsecoverage); 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.001outperform 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)
pytest: 678 passed (677 baseline + 1 from thetest_cache_config.pyconfig-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 --checkclean; no merge markersreport/log contain no
.config.json/tushare.tokenliteralsNon-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-updateor 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.