58ad869f84
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.
151 lines
4.4 KiB
YAML
151 lines
4.4 KiB
YAML
version: ipo_score_v0
|
|
effective_date: 2026-06-15
|
|
status: initial_baseline
|
|
owner_skill: analyst
|
|
|
|
purpose: >
|
|
Build the first transparent Hong Kong IPO subscription scoring model from
|
|
archived project data. The model is a rules-plus-calibration baseline, not a
|
|
black-box predictor. It separates T0 prospectus information from T1 allotment
|
|
information so later facts do not leak into earlier decisions.
|
|
|
|
targets:
|
|
primary: D1 return versus IPO offer price
|
|
secondary:
|
|
- D5 return versus IPO offer price
|
|
- D20 return versus IPO offer price
|
|
- D60 return versus IPO offer price
|
|
|
|
stage_policy:
|
|
T0_prospectus:
|
|
allowed_inputs:
|
|
- offer_price_hkd
|
|
- gross_proceeds_hkd_m
|
|
- funds_raised_hkd_m
|
|
- min_subscription_amount_hkd
|
|
- public_offer_pct_initial
|
|
- over_allotment_offer_shares
|
|
forbidden_inputs:
|
|
- allotment_results
|
|
- public_oversubscription_times
|
|
- international_oversubscription_times
|
|
- post_listing_price_performance
|
|
T1_allotment:
|
|
allowed_inputs:
|
|
- all_T0_inputs
|
|
- public_oversubscription_times
|
|
- international_oversubscription_times
|
|
- valid_applications
|
|
- successful_applications
|
|
- final_hk_offer_shares
|
|
- hk_offer_shares_initial
|
|
forbidden_inputs:
|
|
- grey_market_result
|
|
- post_listing_price_performance
|
|
T2_grey_market:
|
|
status: disabled_until_reliable_source_exists
|
|
note: >
|
|
T2 is excluded from v0 because no reproducible, redistribution-safe
|
|
grey-market data source has been approved.
|
|
|
|
score_components:
|
|
T0_prospectus:
|
|
offer_size_hkd_m:
|
|
source: gross_proceeds_hkd_m, falling back to funds_raised_hkd_m
|
|
points:
|
|
missing: 0
|
|
lt_300: -2
|
|
gte_300_lt_800: 1
|
|
gte_800_lt_2000: 4
|
|
gte_2000_lt_5000: 3
|
|
gte_5000: 2
|
|
public_offer_pct_initial:
|
|
points:
|
|
missing: 0
|
|
lte_0_05: 3
|
|
gt_0_05_lte_0_10: 1
|
|
gt_0_10: -1
|
|
min_subscription_amount_hkd:
|
|
points:
|
|
missing: -1
|
|
lt_3500: -1
|
|
gte_3500_lt_10000: 2
|
|
gte_10000: 1
|
|
offer_price_hkd:
|
|
points:
|
|
missing: 0
|
|
lt_1: -2
|
|
gte_1_lt_5: 0
|
|
gte_5_lt_30: 1
|
|
gte_30_lt_100: 2
|
|
gte_100: 1
|
|
over_allotment:
|
|
points:
|
|
present: 1
|
|
missing_or_zero: 0
|
|
|
|
T1_allotment:
|
|
public_oversubscription_times:
|
|
points:
|
|
missing: 0
|
|
lt_10: -4
|
|
gte_10_lt_100: -2
|
|
gte_100_lt_1000: 6
|
|
gte_1000_lt_5000: 13
|
|
gte_5000: 15
|
|
international_oversubscription_times:
|
|
points:
|
|
missing: 0
|
|
lt_1: -2
|
|
gte_1_lt_3: -1
|
|
gte_3_lt_10: 1
|
|
gte_10_lt_30: 6
|
|
gte_30: 8
|
|
valid_applications:
|
|
points:
|
|
missing: 0
|
|
lt_10000: -2
|
|
gte_50000_lt_100000: 1
|
|
gte_100000_lt_200000: 3
|
|
gte_200000: 5
|
|
application_success_rate:
|
|
definition: successful_applications / valid_applications
|
|
points:
|
|
missing: 0
|
|
lte_0_10: 4
|
|
gt_0_10_lte_0_30: 2
|
|
gt_0_80: -2
|
|
hk_offer_reallocation_multiple:
|
|
definition: final_hk_offer_shares / hk_offer_shares_initial
|
|
points:
|
|
missing: 0
|
|
gte_2_lt_3: 2
|
|
gte_3: 4
|
|
|
|
decision_bands:
|
|
T0_prospectus:
|
|
t0_score_lt_1: weak_or_avoid
|
|
t0_score_1_to_4: neutral
|
|
t0_score_5_to_7: positive_watch
|
|
t0_score_gte_8: strong_watch
|
|
T1_allotment:
|
|
total_score_lt_0: avoid
|
|
total_score_0_to_9: avoid_or_wait
|
|
total_score_10_to_17: watch_or_small
|
|
total_score_18_to_25: selective_subscribe
|
|
total_score_gte_26: high_conviction_subscribe
|
|
|
|
calibration_policy:
|
|
method: empirical_bucket_rate
|
|
primary_label: D1_return_pct > 0
|
|
strong_label: D1_return_pct >= 10
|
|
report_path: reports/2026-06-15_analysis_model_v0.md
|
|
dataset_path: data/snapshots/analysis_model_v0_dataset.csv
|
|
|
|
known_limitations:
|
|
- T0 has weaker discrimination than T1 because subscription demand is not available at prospectus stage.
|
|
- T1 is structurally complete for listed rows, but some individual demand fields remain null when the archived source does not explicitly state them.
|
|
- Industry labels and issuer fundamentals are not yet sufficiently structured for v0.
|
|
- T2 grey-market signal is intentionally disabled until a reliable source exists.
|
|
- Current D1 outcomes are from archived market data and should be reviewed for extreme corporate-action or data-vendor anomalies.
|