HKJC Horse Racing — Prediction Dashboard

2017 validation set (818 races, 9,997 horse-rows). Generated by build_html_report.py.

Data & Model Inventory

AssetSizeDescription
SQLite hkjc.db72.5 MBraces 32,696 / performances 273,993 / sectionals 113,559
features_2008_2018.parquet4.1 MB101,315 rows × 104 cols (modeling table)
real_morning_odds.parquet48 KB14,874 rows / 1,510 races (2016-2018, real morning line)
morning_odds.parquet85 KB18,558 rows = real + synth (full 2008-2018 coverage)
late_odds.parquet40 KB18,485 rows / 1,509 races (last pre-race capture)
jra_features.parquet19 MBJapan Racing Association — alternative dataset
LightGBM with-odds362 KBval AUC 0.78, Top-1 hit 28%
LightGBM no-odds308 KBval AUC 0.68, Top-1 hit 23%
XGBoost with-odds2.2 MBval AUC pending, see reports/feature_importance_xgb.csv
XGBoost no-odds294 KBval AUC pending
LightGBM morning synth187 KBRMSE 42.3 on log(odds), 12k val samples
JRA LightGBM no-odds1.6 MBJRA-trained model

Benter Blend — Win & Quinella (2017 val, 818 races)

blend_score = fund_prob^w × public_prob^(1-w). Pure-fundamental (w=1.0) dominates quinella ROI; weight ~0.4 helps Win top-1 because public odds filter out longshots.

Best Win top-1

modelpublic_sourcemodel_weightwin_betswin_winswin_strikewin_returnwin_roi_pctquinella_betsquinella_winsquinella_strikequinella_returnquinella_roi_pct
xgb_no_oddsfinal0.40008172480.3035693.20-15.15308171000.1224655.80-19.7307
lgb_no_oddsfinal0.70008172210.2705689.80-15.5692817850.1040725.40-11.2118
lgb_no_oddsfinal0.50008172340.2864684.80-16.1812817850.1040610.00-25.3366
lgb_no_oddsfinal0.30008172430.2974682.80-16.4259817930.1138589.60-27.8335
lgb_no_oddsfinal0.60008172280.2791678.10-17.0012817910.1114702.00-14.0759
lgb_no_oddsfinal0.20008172430.2974676.20-17.2338817990.1212633.95-22.4051
xgb_no_oddsfinal0.70008172320.2840675.30-17.3439817910.1114670.40-17.9437
xgb_no_oddsfinal0.50008172410.2950674.30-17.46638171010.1236677.55-17.0685

Best Quinella top-2 box

modelpublic_sourcemodel_weightwin_betswin_winswin_strikewin_returnwin_roi_pctquinella_betsquinella_winsquinella_strikequinella_returnquinella_roi_pct
lgb_no_oddsreal_morning1.00008171860.2277664.10-18.7148817690.0845881.557.9009
lgb_no_oddsfinal1.00008171860.2277664.10-18.7148817690.0845881.557.9009
lgb_no_oddsreal_morning0.10008171560.1909561.30-31.2974809650.0803789.80-2.3733
ensemble_no_oddsreal_morning0.00008171460.1787541.50-33.7209809620.0766785.75-2.8739
xgb_no_oddsreal_morning0.00008171460.1787541.50-33.7209809620.0766785.75-2.8739
lgb_no_oddsreal_morning0.00008171460.1787541.50-33.7209809620.0766785.75-2.8739
xgb_no_oddsreal_morning0.10008171520.1860553.10-32.3011809640.0791781.90-3.3498
ensemble_no_oddsreal_morning0.10008171530.1873557.00-31.8237809640.0791781.90-3.3498

Exotic Bet Strategies (2017 val, 818 races)

Per-strategy, per-model ROI on Place / Quinella / QPL / Tierce / Quartet pools using final dividends. Quinella top-2 box (lgb_no_odds) is the only strategy with positive ROI across the board.

modelstrategybetswinsstrike_ratetotal_staketotal_returnnet_profitroi_pct
xgb_with_oddsplace_top18174850.5936817.00692.62-124.38-15.2240
ensemble_with_oddsplace_top18174750.5814817.00669.12-147.88-18.1004
ensemble_no_oddsplace_top18174080.4994817.00664.32-152.68-18.6879
lgb_with_oddsplace_top18174700.5753817.00663.42-153.58-18.7980
xgb_no_oddsplace_top18174030.4933817.00660.92-156.08-19.1040
lgb_no_oddsplace_top18174010.4908817.00660.17-156.83-19.1958
ensemble_no_oddsplace_top2_each16347600.46511634.001448.84-185.16-11.3317
xgb_no_oddsplace_top2_each16347590.46451634.001435.10-198.90-12.1726
lgb_with_oddsplace_top2_each16348960.54831634.001415.97-218.03-13.3433
lgb_no_oddsplace_top2_each16347340.44921634.001406.48-227.52-13.9241
xgb_with_oddsplace_top2_each16348640.52881634.001371.07-262.93-16.0912
ensemble_with_oddsplace_top2_each16348730.53431634.001371.07-262.93-16.0912
xgb_no_oddsplace_top3_each245110330.42152451.002119.42-331.58-13.5284
lgb_with_oddsplace_top3_each245112130.49492451.002118.88-332.12-13.5504
ensemble_no_oddsplace_top3_each245110250.41822451.002101.31-349.69-14.2672
lgb_no_oddsplace_top3_each24519940.40552451.002047.95-403.05-16.4443
xgb_with_oddsplace_top3_each245111540.47082451.002035.58-415.42-16.9490
ensemble_with_oddsplace_top3_each245111660.47572451.002026.48-424.52-17.3203
xgb_no_oddsqpl_top28171620.1983817.00792.00-25.0000-3.0600
ensemble_no_oddsqpl_top28171580.1934817.00769.00-48.0000-5.8752
lgb_no_oddsqpl_top28171440.1763817.00718.50-98.5000-12.0563
lgb_with_oddsqpl_top28172090.2558817.00690.20-126.80-15.5202
xgb_with_oddsqpl_top28171990.2436817.00672.55-144.45-17.6805
ensemble_with_oddsqpl_top28172000.2448817.00652.90-164.10-20.0857
lgb_with_oddsqpl_top3_box24514830.19712451.002138.75-312.25-12.7397
lgb_no_oddsqpl_top3_box24513460.14122451.002117.75-333.25-13.5965
xgb_no_oddsqpl_top3_box24513610.14732451.002102.30-348.70-14.2268
ensemble_no_oddsqpl_top3_box24513620.14772451.002064.50-386.50-15.7691
xgb_with_oddsqpl_top3_box24514400.17952451.001945.70-505.30-20.6161
ensemble_with_oddsqpl_top3_box24514450.18162451.001903.20-547.80-22.3501
xgb_with_oddsquartet_top4_exact81710.0012817.00309.90-507.10-62.0685
ensemble_with_oddsquartet_top4_exact81710.0012817.00309.90-507.10-62.0685
ensemble_no_oddsquartet_top4_exact81710.0012817.00275.70-541.30-66.2546
lgb_with_oddsquartet_top4_exact81710.0012817.0025.8000-791.20-96.8421
lgb_no_oddsquartet_top4_exact81700.0000817.000.0000-817.00-100.00
xgb_no_oddsquartet_top4_exact81700.0000817.000.0000-817.00-100.00
lgb_no_oddsquinella_top2_box817690.0845817.00881.5564.55007.9009
xgb_no_oddsquinella_top2_box817660.0808817.00763.65-53.3500-6.5300
ensemble_no_oddsquinella_top2_box817660.0808817.00757.20-59.8000-7.3195
lgb_with_oddsquinella_top2_box8171030.1261817.00735.45-81.5500-9.9816
ensemble_with_oddsquinella_top2_box8171000.1224817.00717.60-99.4000-12.1665
xgb_with_oddsquinella_top2_box817970.1187817.00709.00-108.00-13.2191
xgb_no_oddstierce_top3_exact81740.0049817.00789.60-27.4000-3.3537
lgb_no_oddstierce_top3_exact81790.0110817.00699.70-117.30-14.3574
xgb_with_oddstierce_top3_exact81780.0098817.00572.10-244.90-29.9755
lgb_with_oddstierce_top3_exact81780.0098817.00385.30-431.70-52.8397
ensemble_no_oddstierce_top3_exact81730.0037817.00241.80-575.20-70.4039
ensemble_with_oddstierce_top3_exact81750.0061817.00207.60-609.40-74.5900

Quinella Filter Grid (2017 val)

Filter on max-of-top-2 odds/morning_odds/rank. Cold fields (high odds, low rank) carry the model's edge; hot fields dilute it. The single best live filter is max_odds >= 12.

filterbetswinsstrike_ratetotal_returnnet_profitroi_pctavg_return_win
actual_payout_50_1000000111.000060.550059.55005955.0060.5500
actual_payout_20_5012121.0000355.95343.952866.2529.6625
actual_payout_10_2015151.0000216.40201.401342.6714.4267
actual_payout_5_1026261.0000188.50162.50625.007.2500
max_odds_12_99240150.0625390.30150.3062.625026.0200
max_morning_odds_12_99302230.0762415.85113.8537.698718.0804
max_rank_4_99467290.0621623.30156.3033.469021.4931
max_rank_6_99244110.0451323.8579.850032.725429.4409
max_odds_8_99433260.0600557.15124.1528.672121.4288
max_morning_odds_8_99429350.0816515.3086.300020.116614.7229
pred_sum_top_75%613630.1028721.60108.6017.716211.4540
pred_sum_top_50%409460.1125448.9039.90009.75559.7587
all817690.0845881.5564.55007.900912.7761
max_odds_0_5152290.1908161.609.60006.31585.5724
pred_sum_top_25%205250.1220212.407.40003.60988.4960

Quinella Out-of-Sample (2018 H1)

Same lgb_no_odds model retrained 2014-2017, evaluated on 2018 H1. Used to confirm the 2017 in-sample signal isn't pure overfit.

filterbetswinsstrike_ratetotal_returnnet_profitroi_pct
all452400.0885463.6011.60002.5664
max_morning_odds_gte_8265180.0679260.80-4.2000-1.5849
max_morning_odds_gte_1216890.0536151.10-16.9000-10.0595
max_final_odds_gte_8218100.0459227.209.20004.2202
max_final_odds_gte_1211940.0336117.55-1.4500-1.2185

Kelly Betting Simulation (2017 val)

Each (model × odds-source × strategy) combination tested. real_morning_odds uses earliest non-999 capture from live_odds.csv.gz. Strike rate 27% in real_morning scenario (vs 22% with final_odds) is the strongest signal that the model has real pre-race edge.

scenariostrategyn_betsn_winsstrike_rateroi_on_stake_pctending_bankrollruined
with_odds_model_final_odds_payoutflat_1pct_top1228500.2193-26.77005772.79False
with_odds_model_final_odds_payoutflat_2pct_top1228500.2193-30.68003164.63False
with_odds_model_final_odds_payoutkelly_quarter_top1228500.2193-20.46006417.37False
with_odds_model_final_odds_payoutkelly_quarter_top1_5pp66140.2121-20.91007605.07False
with_odds_model_final_odds_payoutkelly_quarter_top1_10pp1630.1875-26.14009223.22False
with_odds_model_late_odds_cleanflat_1pct_top11430.2143-33.27009538.60False
with_odds_model_late_odds_cleanflat_2pct_top11430.2143-33.65009076.19False
with_odds_model_late_odds_cleankelly_quarter_top11430.2143-39.55009213.08False
with_odds_model_late_odds_cleankelly_quarter_top1_5pp620.33334.620010054.91False
with_odds_model_late_odds_cleankelly_quarter_top1_10pp210.500070.730010290.00False
with_odds_model_late_odds_size_pay_at_finalflat_1pct_top11430.2143-33.27009538.60False
with_odds_model_late_odds_size_pay_at_finalflat_2pct_top11430.2143-33.65009076.19False
with_odds_model_late_odds_size_pay_at_finalkelly_quarter_top11430.2143-39.55009213.08False
with_odds_model_late_odds_size_pay_at_finalkelly_quarter_top1_5pp620.33334.620010054.91False
with_odds_model_late_odds_size_pay_at_finalkelly_quarter_top1_10pp210.500070.730010290.00False
with_odds_model_real_morning_cleanflat_1pct_top14561250.2741119.2720845968.15False
with_odds_model_real_morning_cleanflat_2pct_top14561250.274195.37003794708666.02False
with_odds_model_real_morning_cleankelly_quarter_top14561250.2741103.563196863247.28False
with_odds_model_real_morning_cleankelly_quarter_top1_5pp3811070.2808113.374059427594.78False
with_odds_model_real_morning_cleankelly_quarter_top1_10pp297830.2795140.202416662928.25False

Sample Top-3 Picks per Race (first 30 races of 2017 val)

pred = lgb_no_odds model probability. won=1 means the pick won.

race_uidhorse_idhorse_namewin_oddswonpred
2017-01-01_ST_1S408FRANCE VALOUR8.600000.1579
2017-01-01_ST_1P272ROCK THE TREE9.700010.0714
2017-01-01_ST_1P405TELEPHATIA7.900000.0645
2017-01-01_ST_10V410SEASONS BLOOM2.000010.2709
2017-01-01_ST_10A050REGENCY BO BO10.000000.2581
2017-01-01_ST_10V397BEAT THE CLOCK2.800000.2330
2017-01-01_ST_11V153MR STUNNING2.000000.3085
2017-01-01_ST_11S269LINE SEEKER9.800000.1438
2017-01-01_ST_11T116FLYING MOOCHI21.000000.1083
2017-01-01_ST_2V306BUMBLE BABY5.500000.2239
2017-01-01_ST_2A007BOND ELEGANCE2.200000.1364
2017-01-01_ST_2T422AMAZING MOMENT17.000000.1181
2017-01-01_ST_3T202WINGOLD2.200010.1568
2017-01-01_ST_3T393SPICY DOUBLE6.200000.1237
2017-01-01_ST_3S320FANTASTICLIFE15.000000.0720
2017-01-01_ST_4V316GO BEAUTY GO2.100010.2197
2017-01-01_ST_4T224TRIUMPHANT LIGHT4.800000.1178
2017-01-01_ST_4V258WONDERFUL CHASER76.000000.1103
2017-01-01_ST_5A030INFINITY ENDEAVOUR3.400000.1829
2017-01-01_ST_5V386YOU KNOW WHO99.000000.1097
2017-01-01_ST_5V399STAR OF PATCH4.200010.1056
2017-01-01_ST_6V016SUPER LEADER3.000000.1267
2017-01-01_ST_6A040JADE THEATRE6.300000.1051
2017-01-01_ST_6V338ENDEARING4.100000.0871
2017-01-01_ST_7V089TEAM SWEET3.200000.1955
2017-01-01_ST_7V321SMILING CHARM6.500000.1650
2017-01-01_ST_7V081HIGH VOLATILITY11.000000.1222
2017-01-01_ST_8S398BLIZZARD2.600010.2526
2017-01-01_ST_8V110JOYFUL TRINITY3.200000.1904
2017-01-01_ST_8V128RACING SUPERNOVA5.800000.1123
2017-01-01_ST_9V333UNICRON JEWELLERY2.200000.2757
2017-01-01_ST_9V140FRIENDS OF NANJING9.400000.1067
2017-01-01_ST_9V020JADE FORTUNE14.000000.0987
2017-01-04_HV_1V027TREASURE AND GOLD3.700000.1959
2017-01-04_HV_1V144TELECOM BOOM7.800000.1354
2017-01-04_HV_1S150OPTIMISM7.500000.1100
2017-01-04_HV_2V146GAME OF FUN4.500000.2667
2017-01-04_HV_2V200GRACYDAD2.200000.1325
2017-01-04_HV_2T054HAYMAKER14.000000.1072
2017-01-04_HV_3V387ISAAC1.900010.2520
2017-01-04_HV_3S399GRACE HEART10.000000.1100
2017-01-04_HV_3N443RAY OF GOLD19.000000.1082
2017-01-04_HV_4T160CASA MASTER10.000010.1596
2017-01-04_HV_4T282MUTUAL JOY12.000000.1438
2017-01-04_HV_4T368WISKY2.200000.1394
2017-01-04_HV_5T409EASY HEDGE2.900010.3010
2017-01-04_HV_5T109ANDOYAS6.800000.0944
2017-01-04_HV_5V254SUNNY WIN4.300000.0904
2017-01-04_HV_6S422WONDERFUL FIGHTER4.400000.1264
2017-01-04_HV_6T372HARRIER JET6.400000.1088
2017-01-04_HV_6T405I'M A WITNESS3.800000.1087
2017-01-04_HV_7V133BASIC TRILOGY4.400000.1943
2017-01-04_HV_7S145HARBOUR MASTER11.000010.1347
2017-01-04_HV_7T118HORSE OF FORTUNE4.400000.1274
2017-01-04_HV_8S138VARA PEARL3.300000.1171
2017-01-04_HV_8S447TEN FLAMES13.000000.1106
2017-01-04_HV_8V019CHEERFUL BOY7.600000.0907
2017-01-08_ST_1V326GORGEOUS AGAIN4.400000.2358
2017-01-08_ST_1S234DANEWIN EXPRESS6.500000.0816
2017-01-08_ST_1S320FANTASTICLIFE12.000000.0788
2017-01-08_ST_10A090WESTERN EXPRESS4.100000.3664
2017-01-08_ST_10P435TOP ACT99.000000.1270
2017-01-08_ST_10V380BEAUTY GENERATION3.100010.1176
2017-01-08_ST_2V025BEAUTY LOVE3.900000.1494
2017-01-08_ST_2V215ACTUARIAT49.000000.1082
2017-01-08_ST_2V270MR POTENTIAL5.200010.0934
2017-01-08_ST_3V066ADVENTURER24.000000.2600
2017-01-08_ST_3T179AMAZING KIDS5.800010.2199
2017-01-08_ST_3V251BAD BOY2.000000.2183
2017-01-08_ST_4V376FLYING GODSPELL2.100000.1542
2017-01-08_ST_4T285HURRICANE KID8.200000.1493
2017-01-08_ST_4T359RESPECT5.100000.1464
2017-01-08_ST_5T105KING BOUNTIFUL10.000000.1961
2017-01-08_ST_5T431PEARL FURU14.000000.0949
2017-01-08_ST_5T232SUPER FORM8.100000.0847
2017-01-08_ST_6V186BIG BANG BONG6.500010.2186
2017-01-08_ST_6V357TOP SCORE6.300000.1139
2017-01-08_ST_6V250HINYUEN SWIFTNESS88.000000.0836
2017-01-08_ST_7A008MONEY BOY3.400000.3813
2017-01-08_ST_7V323SPICY KAKA11.000000.0886
2017-01-08_ST_7V394GENEROUS HEART3.100000.0834
2017-01-08_ST_8T352ROUNDABOUT3.800010.2520
2017-01-08_ST_8T189BEAUTY KINGDOM3.400000.1105
2017-01-08_ST_8T348WINSTON'S LAD6.300000.1079
2017-01-08_ST_9V264ARIZONA BLIZZARD3.800000.3018
2017-01-08_ST_9T389STAR OF YAN OI2.700000.1251
2017-01-08_ST_9T010E-SUPER23.000000.1211
2017-01-11_HV_1T336GLORY STAR2.400010.3278
2017-01-11_HV_1V036PRECISIONCRAFTSMAN20.000000.1172
2017-01-11_HV_1V164MY BLESSING10.000000.0981