Skip to content

Commit 9197774

Browse files
committed
minor fixes
1 parent 05be12b commit 9197774

8 files changed

Lines changed: 391 additions & 102 deletions

File tree

README.md

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -152,16 +152,18 @@ The tab returns:
152152
- human-readable segment benchmark tables with plain-language guidance (`lower error is better`, `higher sample size is better`).
153153
- location/connectivity premium context (planning area, region tier, MRT proxy, and CBD access heuristic).
154154
- optional scenario overlay controls for school-zone, shopping-hub, and fast-CBD-access premium assumptions.
155-
- new **Housing economics details** tab for end-to-end ownership estimation:
155+
- new **HDB calculator** tab for end-to-end ownership estimation:
156156
- MOP timeline and estimated sale timing checks
157-
- grants checklist, estimated return-to-government, and levy
157+
- tiered EHG + Family/Singles/PHG grant assumptions
158+
- estimated return-to-government, levy, and policy-tier subsidy recovery
158159
- HDB/bank loan cashflow schedule with CPF vs cash split
159-
- COV/premium, renovation, taxes/fees, and itemized cost ledger
160+
- BSD/ABSD auto defaults, fixed-fee assumptions, and itemized cost ledger
160161
- profit waterfall and breakdown tables
161162
- bank package modelling for common `2-year fixed -> SORA + spread` path
162163
- repricing/refinancing simulation with admin/legal/valuation/clawback and lock-in penalty impacts
164+
- integrated debt-free vs rental-subsidy progress chart
163165

164-
### Housing economics details (estimator)
166+
### HDB calculator (estimator)
165167

166168
The app now includes an estimator-focused page for BTO/resale/EC/private planning using policy defaults in:
167169

configs/housing_finance_v1.yaml

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
metadata:
2-
effective_date: "2026-01-01"
2+
effective_date: "2026-04-28"
33
updated_on: "2026-04-28"
44
disclaimer: "Estimator only. Verify policy and legal details with official sources."
55

@@ -15,19 +15,37 @@ grant_defaults:
1515
grant_return_rate_pct: 100.0
1616
sg_sg:
1717
- name: "EHG"
18-
amount: 80000
18+
amount: 120000
1919
selected: false
2020
- name: "Family Grant"
21-
amount: 50000
21+
amount: 80000
22+
selected: false
23+
- name: "Proximity Housing Grant"
24+
amount: 20000
2225
selected: false
2326
sg_pr:
27+
- name: "EHG"
28+
amount: 120000
29+
selected: false
2430
- name: "Family Grant (Citizen-PR)"
25-
amount: 40000
31+
amount: 70000
32+
selected: false
33+
- name: "Proximity Housing Grant"
34+
amount: 20000
35+
selected: false
36+
pr_pr:
37+
- name: "EHG"
38+
amount: 120000
2639
selected: false
27-
pr_pr: []
2840
single_citizen:
41+
- name: "EHG (Singles)"
42+
amount: 60000
43+
selected: false
2944
- name: "Singles Grant"
30-
amount: 25000
45+
amount: 40000
46+
selected: false
47+
- name: "Proximity Housing Grant (Singles)"
48+
amount: 10000
3149
selected: false
3250
other: []
3351

@@ -40,7 +58,7 @@ resale_levy_defaults:
4058
fee_defaults:
4159
legal_fees_default: 2500
4260
valuation_fees_default: 500
43-
buyer_stamp_duty_default_rate_pct: 2.5
61+
buyer_stamp_duty_default_rate_pct: 3.0
4462
additional_buyer_stamp_duty_default_rate_pct: 0
4563
agent_sale_fee_default_rate_pct: 0.02
4664
maintenance_monthly_default: 120

docs/housing_details_v1_runbook.md

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
## Purpose
44

5-
`Housing economics details` is an estimator-first Streamlit tab for BTO, resale, EC, and private scenarios.
5+
`HDB calculator` is an estimator-first Streamlit tab for BTO, resale, EC, and private scenarios.
66
It computes affordability and exit economics using transparent assumptions and formula outputs.
77

88
## What It Covers
@@ -11,9 +11,10 @@ It computes affordability and exit economics using transparent assumptions and f
1111
- MOP countdown
1212
- earliest legal sale timing from purchase
1313
- Grants and return-to-government:
14-
- grant checkbox selection
14+
- EHG income-tier estimation
15+
- Family / Singles / Proximity / Citizen Top-Up toggles
1516
- estimated grant return and levy
16-
- additional manual government return fields
17+
- subsidy recovery assumptions for Standard/Plus/Prime policy tiers
1718
- Loan and instalments:
1819
- HDB fixed track or bank tracks
1920
- monthly schedule with interest, principal, CPF used, cash used
@@ -47,7 +48,7 @@ This file stores:
4748
- bank default path for common market structure: `24-month fixed -> SORA + spread`
4849
- grant defaults by household profile
4950
- levy defaults by housing type
50-
- fee defaults (BSD/ABSD baseline rates, legal/valuation, maintenance)
51+
- fee defaults (legal/valuation, maintenance; BSD and ABSD are auto-computed in app)
5152

5253
## Formula Reference
5354

@@ -99,7 +100,7 @@ streamlit run streamlit_app.py
99100
```
100101

101102
3. In app:
102-
- open `Housing economics details`
103+
- open `HDB calculator`
103104
- run at least three scenarios:
104105
- SG+SG BTO
105106
- SG+PR resale
@@ -114,6 +115,7 @@ streamlit run streamlit_app.py
114115

115116
- Estimator only, not legal/financial advice.
116117
- Defaults may drift when policy changes; verify with official Singapore sources.
118+
- Plus/Prime subsidy recovery rates can vary by launch/project; adjust defaults to your case.
117119
- Grant return and levy are modeled assumptions unless exact case rules are provided.
118120
- Profit output is scenario-dependent and sensitive to sale-price assumption.
119121
- Bank packages vary by institution and repricing date; treat 2-year fixed then SORA as a practical default, not a guarantee.

reports/forecaster_v1/near_term_eval.json

Lines changed: 41 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,191 +1,191 @@
11
{
2-
"created_at_utc": "2026-04-28T03:01:41.502719+00:00",
2+
"created_at_utc": "2026-04-28T08:28:43.574563+00:00",
33
"rolling_origin": {
44
"windows": [
55
{
66
"window": 1,
77
"train_end": "2026-01-01",
88
"test_end": "2026-04-01",
99
"rows": 5212,
10-
"rmse": 208574.04050389552,
11-
"mae": 176651.0337962874,
12-
"interval_coverage_p10_p90": 0.1379508825786646,
13-
"mean_interval_width": 97319.55
10+
"rmse": 206598.59169305864,
11+
"mae": 165988.39654659905,
12+
"interval_coverage_p10_p90": 0.2173829623944743,
13+
"mean_interval_width": 96066.74415592414
1414
}
1515
],
16-
"mean_rmse": 208574.04050389552,
17-
"mean_mae": 176651.0337962874,
18-
"overall_interval_coverage_p10_p90": 0.1379508825786646,
19-
"mean_interval_width": 97319.55,
16+
"mean_rmse": 206598.59169305864,
17+
"mean_mae": 165988.39654659905,
18+
"overall_interval_coverage_p10_p90": 0.2173829623944743,
19+
"mean_interval_width": 96066.74415592414,
2020
"segment_coverage_by_town": [
2121
{
2222
"window": 1,
2323
"town": "ANG MO KIO",
2424
"rows": 206,
25-
"coverage": 0.18446601941747573
25+
"coverage": 0.32038834951456313
2626
},
2727
{
2828
"window": 1,
2929
"town": "BEDOK",
3030
"rows": 261,
31-
"coverage": 0.07662835249042145
31+
"coverage": 0.24904214559386972
3232
},
3333
{
3434
"window": 1,
3535
"town": "BISHAN",
3636
"rows": 84,
37-
"coverage": 0.5833333333333334
37+
"coverage": 0.5714285714285714
3838
},
3939
{
4040
"window": 1,
4141
"town": "BUKIT BATOK",
4242
"rows": 316,
43-
"coverage": 0.0949367088607595
43+
"coverage": 0.21518987341772153
4444
},
4545
{
4646
"window": 1,
4747
"town": "BUKIT MERAH",
4848
"rows": 213,
49-
"coverage": 0.3051643192488263
49+
"coverage": 0.39906103286384975
5050
},
5151
{
5252
"window": 1,
5353
"town": "BUKIT PANJANG",
5454
"rows": 179,
55-
"coverage": 0.01675977653631285
55+
"coverage": 0.00558659217877095
5656
},
5757
{
5858
"window": 1,
5959
"town": "BUKIT TIMAH",
6060
"rows": 12,
61-
"coverage": 0.16666666666666666
61+
"coverage": 0.5833333333333334
6262
},
6363
{
6464
"window": 1,
6565
"town": "CENTRAL AREA",
6666
"rows": 36,
67-
"coverage": 0.4722222222222222
67+
"coverage": 0.5277777777777778
6868
},
6969
{
7070
"window": 1,
7171
"town": "CHOA CHU KANG",
7272
"rows": 219,
73-
"coverage": 0.0136986301369863
73+
"coverage": 0.0045662100456621
7474
},
7575
{
7676
"window": 1,
7777
"town": "CLEMENTI",
7878
"rows": 100,
79-
"coverage": 0.37
79+
"coverage": 0.5
8080
},
8181
{
8282
"window": 1,
8383
"town": "GEYLANG",
8484
"rows": 141,
85-
"coverage": 0.5106382978723404
85+
"coverage": 0.6382978723404256
8686
},
8787
{
8888
"window": 1,
8989
"town": "HOUGANG",
9090
"rows": 249,
91-
"coverage": 0.08835341365461848
91+
"coverage": 0.10843373493975904
9292
},
9393
{
9494
"window": 1,
9595
"town": "JURONG EAST",
9696
"rows": 105,
97-
"coverage": 0.09523809523809523
97+
"coverage": 0.17142857142857143
9898
},
9999
{
100100
"window": 1,
101101
"town": "JURONG WEST",
102102
"rows": 331,
103-
"coverage": 0.03927492447129909
103+
"coverage": 0.06948640483383686
104104
},
105105
{
106106
"window": 1,
107107
"town": "KALLANG/WHAMPOA",
108108
"rows": 136,
109-
"coverage": 0.4485294117647059
109+
"coverage": 0.47058823529411764
110110
},
111111
{
112112
"window": 1,
113113
"town": "MARINE PARADE",
114114
"rows": 22,
115-
"coverage": 0.6818181818181818
115+
"coverage": 0.5454545454545454
116116
},
117117
{
118118
"window": 1,
119119
"town": "PASIR RIS",
120120
"rows": 151,
121-
"coverage": 0.019867549668874173
121+
"coverage": 0.026490066225165563
122122
},
123123
{
124124
"window": 1,
125125
"town": "PUNGGOL",
126126
"rows": 336,
127-
"coverage": 0.08333333333333333
127+
"coverage": 0.06845238095238096
128128
},
129129
{
130130
"window": 1,
131131
"town": "QUEENSTOWN",
132132
"rows": 159,
133-
"coverage": 0.2893081761006289
133+
"coverage": 0.37735849056603776
134134
},
135135
{
136136
"window": 1,
137137
"town": "SEMBAWANG",
138138
"rows": 189,
139-
"coverage": 0.10052910052910052
139+
"coverage": 0.13756613756613756
140140
},
141141
{
142142
"window": 1,
143143
"town": "SENGKANG",
144144
"rows": 340,
145-
"coverage": 0.029411764705882353
145+
"coverage": 0.12058823529411765
146146
},
147147
{
148148
"window": 1,
149149
"town": "SERANGOON",
150150
"rows": 69,
151-
"coverage": 0.2753623188405797
151+
"coverage": 0.2463768115942029
152152
},
153153
{
154154
"window": 1,
155155
"town": "TAMPINES",
156156
"rows": 411,
157-
"coverage": 0.12165450121654502
157+
"coverage": 0.24087591240875914
158158
},
159159
{
160160
"window": 1,
161161
"town": "TOA PAYOH",
162162
"rows": 204,
163-
"coverage": 0.29901960784313725
163+
"coverage": 0.5049019607843137
164164
},
165165
{
166166
"window": 1,
167167
"town": "WOODLANDS",
168168
"rows": 399,
169-
"coverage": 0.020050125313283207
169+
"coverage": 0.07769423558897243
170170
},
171171
{
172172
"window": 1,
173173
"town": "YISHUN",
174174
"rows": 344,
175-
"coverage": 0.05232558139534884
175+
"coverage": 0.24709302325581395
176176
}
177177
]
178178
},
179179
"ablation": {
180180
"without_location_features": {
181-
"mae": 34413.76424405219,
182-
"rmse": 49404.02970110539,
183-
"mape": 0.052272042778631476
181+
"mae": 59113.8311329624,
182+
"rmse": 94168.70804401723,
183+
"mape": 0.09269712100031163
184184
},
185185
"with_location_features": {
186-
"mae": 33941.34214121259,
187-
"rmse": 48376.61395864323,
188-
"mape": 0.051618449373182065
186+
"mae": 46956.01105441111,
187+
"rmse": 66123.27500016958,
188+
"mape": 0.07326679631068268
189189
}
190190
},
191191
"promotion_gate": {

reports/forecaster_v1/near_term_eval.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
# Near-term Evaluation Report
22

3-
- Generated: `2026-04-28T03:01:41.502719+00:00`
3+
- Generated: `2026-04-28T08:28:43.574563+00:00`
44
- Rolling windows evaluated: `1`
5-
- Mean rolling RMSE: `208574.04`
6-
- Mean rolling MAE: `176651.03`
7-
- Interval coverage (p10-p90): `0.138`
8-
- Mean interval width: `97319.55`
5+
- Mean rolling RMSE: `206598.59`
6+
- Mean rolling MAE: `165988.40`
7+
- Interval coverage (p10-p90): `0.217`
8+
- Mean interval width: `96066.74`
99

1010
## Exogenous/Location Ablation (test split)
11-
- Without location features RMSE: `49404.03`
12-
- With location features RMSE: `48376.61`
11+
- Without location features RMSE: `94168.71`
12+
- With location features RMSE: `66123.28`
1313

1414
Artifacts:
1515
- JSON: `reports/forecaster_v1/near_term_eval.json`

0 commit comments

Comments
 (0)