Refresh IPO analysis model calibration

Request:
- Re-analyze the IPO model using the updated historical archive after T1 demand backfill.

Changes:
- Regenerate the v0 analysis dataset from the current SQLite archive.
- Refresh the v0 calibration report with expanded T1 coverage and new empirical bucket rates.
- Update the report template to show pending T1 rows and field-level blanks.
- Clarify v0 limitations and record why the score formula stays unchanged for this refresh.

Verification:
- Ran scripts/build_analysis_dataset.py against data/hk_ipo.sqlite.
- Ran py_compile for scripts/build_analysis_dataset.py.
- Checked dataset row count, T1 demand coverage, source-only T1 gaps, and repo-relative paths.
- Ran git diff --check.

Next useful context:
- T1 structured coverage is now 291 rows, with 06106 and 06675 still pending_not_due.
- The high-conviction T1 bucket remains differentiated, but middle and low buckets are still not monotonic enough for a v1 rule change.
This commit is contained in:
2026-06-15 14:05:34 +00:00
parent 6d05056609
commit 58ad869f84
5 changed files with 347 additions and 312 deletions
+15 -13
View File
@@ -1,7 +1,7 @@
# HK IPO Analysis Model v0
- Model version: `ipo_score_v0`
- Analysis as of: `2026-06-15T13:00:00Z`
- Analysis as of: `2026-06-15T14:04:34Z`
- Rule file: `rules/ipo_score_v0.yaml`
- Dataset: `data/snapshots/analysis_model_v0_dataset.csv`
@@ -15,12 +15,14 @@ The model does not use grey-market data in v0 because T2 currently has no approv
- IPO rows scored: 293
- Rows with D1 labels: 273
- Rows with structured T1 demand fields: 154
- Rows with structured T1 demand fields: 291
- Rows with prospectus source path: 293
- Rows with allotment source path: 291
- Rows with offer size: 293
- Rows with public oversubscription: 144
- Rows with international oversubscription: 153
- Rows with public oversubscription: 281
- Rows with international oversubscription: 277
- Rows pending T1 structure: 2 (06106, 06675)
- T1 field-level blanks: public oversubscription 10, international oversubscription 14, valid applications 6, successful applications 18
## T0 Calibration
@@ -39,17 +41,17 @@ T1 adds allotment-stage demand: public subscription, international placing deman
| Bucket | N | D1 positive | D1 >= 10% | Avg D1 return | Median D1 return |
| --- | ---: | ---: | ---: | ---: | ---: |
| total_0_to_9 | 35 | 60.0% | 34.3% | 3.5 | 0.2 |
| total_10_to_17 | 17 | 47.1% | 23.5% | 1.6 | -0.1 |
| total_18_to_25 | 33 | 72.7% | 54.5% | 28.0 | 14.8 |
| total_gte_26 | 43 | 97.7% | 95.3% | 101.2 | 88.8 |
| total_lt_0 | 15 | 73.3% | 20.0% | 0.3 | 3.4 |
| total_0_to_9 | 68 | 58.8% | 30.9% | 3.3 | 0.2 |
| total_10_to_17 | 29 | 55.2% | 34.5% | 13.9 | 1.5 |
| total_18_to_25 | 49 | 75.5% | 51.0% | 31.3 | 13.4 |
| total_gte_26 | 59 | 94.9% | 88.1% | 86.7 | 80.0 |
| total_lt_0 | 68 | 61.8% | 23.5% | 0.4 | 1.0 |
## Initial Read
## Current Read
The strongest v0 T1 bucket is `total_gte_26` with 43 historical D1 observations and a 97.7% D1 positive rate. The model is most useful after allotment results are available; T0 is a watchlist filter rather than a final subscription call.
After the T1 demand text backfill, the strongest v0 T1 bucket is `total_gte_26` with 59 historical D1 observations and a 94.9% D1 positive rate. The model is most useful after allotment results are available; T0 is a watchlist filter rather than a final subscription call.
The middle score buckets are not monotonic yet. That is a feature, not a bug report: v0 is exposing where the current rules are too coarse and where missing T1 demand facts weaken calibration. Future rule changes should come from reviewed prediction cards, not from overfitting this initial sample.
The high-conviction bucket remains clearly differentiated, but the middle and low score buckets are still not monotonic. This refresh keeps the v0 score formula unchanged and updates empirical calibration only; future rule changes should come from reviewed prediction cards rather than overfitting this historical sample.
## Usage
@@ -60,7 +62,7 @@ The middle score buckets are not monotonic yet. That is a feature, not a bug rep
## Known Gaps
- T1 demand parsing is incomplete for older HTML-only allotment announcements.
- T1 is structurally complete for listed rows; residual field-level NULLs remain when the archived source does not explicitly state a demand field.
- Industry and issuer fundamentals are not sufficiently structured for model input.
- T2 grey-market signal is blocked pending an approved source.
- Extreme D1 returns should be audited before they drive rule changes.