Add concrete IPO stage dates to reports
Request: - Include the concrete T0, T1, T2, and D1 dates in every analyst report. Changes: - Add a Stage Calendar section to the single-IPO report generator. - Require analyst reports to include ticker-specific T0 subscription window, T1 allotment-result date, T2 grey-market date/window, and D1 listing date. - Update the 06106 T0 report with its concrete stage dates. - Document the requirement in the analyst skill, README, and rule change log. Verification: - Ran py_compile for scripts/generate_ipo_report.py. - Generated a 06106 dry-run report and checked the stage calendar. - Ran git diff --check. Next useful context: - For 06106, T0 is 2026-06-15 to 2026-06-18, T1/T2 is 2026-06-23, and D1 is 2026-06-24.
This commit is contained in:
@@ -88,6 +88,7 @@ Generated prediction reports must remain stage-safe:
|
|||||||
- T0 reports use only prospectus-stage fields and T0 calibration.
|
- T0 reports use only prospectus-stage fields and T0 calibration.
|
||||||
- T1 reports may add allotment demand fields and T1 calibration.
|
- T1 reports may add allotment demand fields and T1 calibration.
|
||||||
- T2/D1 is the intended sell window; D5/D20/D60 returns are never shown as prediction inputs and are reserved for later review cards.
|
- T2/D1 is the intended sell window; D5/D20/D60 returns are never shown as prediction inputs and are reserved for later review cards.
|
||||||
|
- Every report must include a concrete stage calendar for the ticker: T0 subscription window, T1 allotment-result date, T2 grey-market date/window, and D1 listing date.
|
||||||
|
|
||||||
## Output Standards
|
## Output Standards
|
||||||
|
|
||||||
@@ -96,6 +97,7 @@ Every prediction card should include:
|
|||||||
- `ticker`
|
- `ticker`
|
||||||
- `stage`
|
- `stage`
|
||||||
- `data_as_of`
|
- `data_as_of`
|
||||||
|
- concrete T0/T1/T2/D1 dates for the ticker
|
||||||
- `rule_version`
|
- `rule_version`
|
||||||
- `decision`
|
- `decision`
|
||||||
- `total_score`
|
- `total_score`
|
||||||
|
|||||||
@@ -170,7 +170,7 @@ Use the analyst report generator after the archive and model dataset are current
|
|||||||
|
|
||||||
The generator writes `reports/{date}_{ticker}_{stage}_analysis.md` by default. It auto-selects `T1_allotment` when structured allotment-demand facts exist; otherwise it generates a `T0_prospectus` report. Use `--stdout` for a dry run or `--output` to choose a specific Markdown path.
|
The generator writes `reports/{date}_{ticker}_{stage}_analysis.md` by default. It auto-selects `T1_allotment` when structured allotment-demand facts exist; otherwise it generates a `T0_prospectus` report. Use `--stdout` for a dry run or `--output` to choose a specific Markdown path.
|
||||||
|
|
||||||
Prediction reports are stage-safe: T0 reports use only prospectus-stage facts and T0 calibration, while T1 reports add allotment demand and T1 calibration. Reports should frame the trade as a T2/D1 exit. Post-listing D5/D20/D60 performance stays out of prediction reports and is reserved for review cards.
|
Prediction reports are stage-safe: T0 reports use only prospectus-stage facts and T0 calibration, while T1 reports add allotment demand and T1 calibration. Each report includes a concrete stage calendar for that ticker: T0 subscription window, T1 allotment-result date, T2 grey-market date/window, and D1 listing date. Reports should frame the trade as a T2/D1 exit. Post-listing D5/D20/D60 performance stays out of prediction reports and is reserved for review cards.
|
||||||
|
|
||||||
## Incremental Archive Sync
|
## Incremental Archive Sync
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,15 @@
|
|||||||
- Score bucket: `t0_gte_8`
|
- Score bucket: `t0_gte_8`
|
||||||
- Calibrated D1 positive probability: 76.4% from 72 historical D1 labels
|
- Calibrated D1 positive probability: 76.4% from 72 historical D1 labels
|
||||||
|
|
||||||
|
## Stage Calendar
|
||||||
|
|
||||||
|
| Stage | Concrete Date For This IPO | Meaning |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| `T0_prospectus` | 2026-06-15 to 2026-06-18 | Subscription window; use prospectus and offer terms only. |
|
||||||
|
| `T1_allotment` | 2026-06-23 | Allotment results day; use public demand, placing demand, and allocation facts. |
|
||||||
|
| `T2_grey_market` | 2026-06-23 after allotment results | Pre-listing grey-market sell window if a reliable executable source exists. |
|
||||||
|
| `D1` | 2026-06-24 | First official trading day; default sell window when T2 data is unavailable or unreliable. |
|
||||||
|
|
||||||
## Facts
|
## Facts
|
||||||
|
|
||||||
| Field | Value |
|
| Field | Value |
|
||||||
|
|||||||
@@ -1,5 +1,27 @@
|
|||||||
# Rule Change Log
|
# Rule Change Log
|
||||||
|
|
||||||
|
## 2026-06-15 - Add concrete stage dates to reports
|
||||||
|
|
||||||
|
Request:
|
||||||
|
|
||||||
|
- Every analyst report should note the specific dates behind T0, T1, T2, and D1 for the covered IPO.
|
||||||
|
|
||||||
|
Change:
|
||||||
|
|
||||||
|
- Added a `Stage Calendar` section to the single-ticker report generator.
|
||||||
|
- Required analyst reports to show the ticker-specific T0 subscription window, T1 allotment-result date, T2 grey-market date/window, and D1 listing date.
|
||||||
|
- Updated the 06106 T0 report to include its concrete stage dates.
|
||||||
|
|
||||||
|
Rationale:
|
||||||
|
|
||||||
|
- The T0/T1/T2/D1 labels are project analysis stages, so reports should always bind them to actual calendar dates for the IPO under review.
|
||||||
|
|
||||||
|
Verification:
|
||||||
|
|
||||||
|
- Generated a 06106 dry-run report and checked the stage calendar.
|
||||||
|
- Ran py_compile for the report generator.
|
||||||
|
- Ran git diff --check.
|
||||||
|
|
||||||
## 2026-06-15 - Clarify short-exit IPO strategy horizon
|
## 2026-06-15 - Clarify short-exit IPO strategy horizon
|
||||||
|
|
||||||
Request:
|
Request:
|
||||||
|
|||||||
@@ -287,6 +287,46 @@ def facts_table(record: dict[str, str], stage: str) -> str:
|
|||||||
return "\n".join(lines)
|
return "\n".join(lines)
|
||||||
|
|
||||||
|
|
||||||
|
def stage_calendar_table(record: dict[str, str]) -> str:
|
||||||
|
application_start = fmt_value(record["application_start_date"])
|
||||||
|
application_end = fmt_value(record["application_end_date"])
|
||||||
|
allotment_date = fmt_value(record["allotment_results_expected_date"])
|
||||||
|
listing_date = fmt_value(record["listing_date"])
|
||||||
|
if allotment_date != "n/a":
|
||||||
|
t2_date = f"{allotment_date} after allotment results"
|
||||||
|
elif listing_date != "n/a":
|
||||||
|
t2_date = "trading day before D1; exact date not archived"
|
||||||
|
else:
|
||||||
|
t2_date = "n/a"
|
||||||
|
|
||||||
|
rows = [
|
||||||
|
(
|
||||||
|
"T0_prospectus",
|
||||||
|
f"{application_start} to {application_end}",
|
||||||
|
"Subscription window; use prospectus and offer terms only.",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"T1_allotment",
|
||||||
|
allotment_date,
|
||||||
|
"Allotment results day; use public demand, placing demand, and allocation facts.",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"T2_grey_market",
|
||||||
|
t2_date,
|
||||||
|
"Pre-listing grey-market sell window if a reliable executable source exists.",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"D1",
|
||||||
|
listing_date,
|
||||||
|
"First official trading day; default sell window when T2 data is unavailable or unreliable.",
|
||||||
|
),
|
||||||
|
]
|
||||||
|
lines = ["| Stage | Concrete Date For This IPO | Meaning |", "| --- | --- | --- |"]
|
||||||
|
for stage, date_text, meaning in rows:
|
||||||
|
lines.append(f"| `{stage}` | {date_text} | {meaning} |")
|
||||||
|
return "\n".join(lines)
|
||||||
|
|
||||||
|
|
||||||
def source_paths(record: dict[str, str], stage: str) -> list[str]:
|
def source_paths(record: dict[str, str], stage: str) -> list[str]:
|
||||||
paths = []
|
paths = []
|
||||||
if record["prospectus_source_path"]:
|
if record["prospectus_source_path"]:
|
||||||
@@ -367,6 +407,10 @@ def build_report(record: dict[str, str], rows: list[dict[str, str]], stage: str,
|
|||||||
f"- Score bucket: `{bucket}`",
|
f"- Score bucket: `{bucket}`",
|
||||||
f"- Calibrated D1 positive probability: {fmt_pct_rate(metric.d1_positive_rate)} from {metric.sample_size} historical D1 labels",
|
f"- Calibrated D1 positive probability: {fmt_pct_rate(metric.d1_positive_rate)} from {metric.sample_size} historical D1 labels",
|
||||||
"",
|
"",
|
||||||
|
"## Stage Calendar",
|
||||||
|
"",
|
||||||
|
stage_calendar_table(record),
|
||||||
|
"",
|
||||||
"## Facts",
|
"## Facts",
|
||||||
"",
|
"",
|
||||||
facts_table(record, stage),
|
facts_table(record, stage),
|
||||||
|
|||||||
Reference in New Issue
Block a user