2026-04-24 15:52:02,893 INFO src.usecases.calculate_edge — Calculating edge for Shanghai (2026-04-24) | pred=20.3°C
2026-04-24 15:52:02,911 ERROR database — DB Write Error (MarketScanORM): (pymysql.err.IntegrityError) (1062, "Duplicate entry '405206-2026-04-24' for key 'market_scans_v2.uq_market_scan_date'")
[SQL: INSERT INTO market_scans_v2 (created_at, created_at_date, city, target_date, market_id, question, hours_to_res, ecmwf_max, ecmwf_min, sigma_used, outcomes_json, best_outcome, best_price, best_prob, best_edge, decision, model_metadata) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)]
[parameters: (datetime.datetime(2026, 4, 24, 15, 52, 2, 897033), datetime.date(2026, 4, 24), 'Shanghai', datetime.date(2026, 4, 24), '405206', 'Highest temperature in Shanghai on April 24?', 8.133050917777778, 20.3, 11.4, 1.5, '[{"label": "15\\u00b0C or below", "market_price": 0.0, "model_prob": 0.0, "edge": 0.0, "temperature": 15.0}, {"label": "16\\u00b0C", "market_price":  ... (885 characters truncated) ...  0.0031, "temperature": 24.0}, {"label": "25\\u00b0C or higher", "market_price": 0.0005, "model_prob": 0.0002, "edge": -0.0003, "temperature": 25.0}]', '21°C', 0.0005, 0.2751609134576394, 0.2746609134576394, 'SKIP:low_price(0.00)', '{"weather_model": "ecmwf_ifs025", "ecmwf_max": 20.3, "ecmwf_min": 11.4, "sigma": 1.5, "skip_reason": "low_price(0.00)"}')]
(Background on this error at: https://sqlalche.me/e/20/gkpj)
2026-04-24 15:52:03,091 INFO src.infrastructure.weather_client — ECMWF forecast for Seoul on 2026-04-24: max=24.9°C min=9.6°C
2026-04-24 15:52:03,092 INFO src.usecases.calculate_edge — Calculating edge for Seoul (2026-04-24) | pred=24.9°C
2026-04-24 15:52:03,110 ERROR database — DB Write Error (MarketScanORM): (pymysql.err.IntegrityError) (1062, "Duplicate entry '405191-2026-04-24' for key 'market_scans_v2.uq_market_scan_date'")
[SQL: INSERT INTO market_scans_v2 (created_at, created_at_date, city, target_date, market_id, question, hours_to_res, ecmwf_max, ecmwf_min, sigma_used, outcomes_json, best_outcome, best_price, best_prob, best_edge, decision, model_metadata) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)]
[parameters: (datetime.datetime(2026, 4, 24, 15, 52, 3, 94712), datetime.date(2026, 4, 24), 'Seoul', datetime.date(2026, 4, 24), '405191', 'Highest temperature in Seoul on April 24?', 8.133050917777778, 24.9, 9.6, 1.5, '[{"label": "11\\u00b0C or below", "market_price": 0.0, "model_prob": 0.0, "edge": 0.0, "temperature": 11.0}, {"label": "12\\u00b0C", "market_price":  ... (823 characters truncated) ... e": 0.0001, "temperature": 20.0}, {"label": "21\\u00b0C or higher", "market_price": 1.0, "model_prob": 0.0022, "edge": -0.9978, "temperature": 21.0}]', '20°C', 0.0, 0.00011946871684042234, 0.00011946871684042234, 'SKIP:low_edge(0.000)', '{"weather_model": "ecmwf_ifs025", "ecmwf_max": 24.9, "ecmwf_min": 9.6, "sigma": 1.5, "skip_reason": "low_edge(0.000)"}')]
(Background on this error at: https://sqlalche.me/e/20/gkpj)
2026-04-24 15:52:03,277 INFO src.infrastructure.weather_client — ECMWF forecast for Singapore on 2026-04-24: max=30.7°C min=25.1°C
2026-04-24 15:52:03,277 INFO src.usecases.calculate_edge — Calculating edge for Singapore (2026-04-24) | pred=30.7°C
2026-04-24 15:52:03,293 ERROR database — DB Write Error (MarketScanORM): (pymysql.err.IntegrityError) (1062, "Duplicate entry '405207-2026-04-24' for key 'market_scans_v2.uq_market_scan_date'")
[SQL: INSERT INTO market_scans_v2 (created_at, created_at_date, city, target_date, market_id, question, hours_to_res, ecmwf_max, ecmwf_min, sigma_used, outcomes_json, best_outcome, best_price, best_prob, best_edge, decision, model_metadata) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)]
[parameters: (datetime.datetime(2026, 4, 24, 15, 52, 3, 280291), datetime.date(2026, 4, 24), 'Singapore', datetime.date(2026, 4, 24), '405207', 'Highest temperature in Singapore on April 24?', 8.133050917777778, 30.7, 25.1, 1.5, '[{"label": "25\\u00b0C or below", "market_price": 0.0, "model_prob": 0.0, "edge": 0.0, "temperature": 25.0}, {"label": "26\\u00b0C", "market_price":  ... (878 characters truncated) ... : 0.0085, "temperature": 34.0}, {"label": "35\\u00b0C or higher", "market_price": 0.0005, "model_prob": 0.0007, "edge": 0.0002, "temperature": 35.0}]', '31°C', 0.0, 0.31369129506398075, 0.31369129506398075, 'SKIP:low_price(0.00)', '{"weather_model": "ecmwf_ifs025", "ecmwf_max": 30.7, "ecmwf_min": 25.1, "sigma": 1.5, "skip_reason": "low_price(0.00)"}')]
(Background on this error at: https://sqlalche.me/e/20/gkpj)
2026-04-24 15:52:03,461 INFO src.infrastructure.weather_client — ECMWF forecast for Taipei on 2026-04-24: max=21.6°C min=17.9°C
2026-04-24 15:52:03,462 INFO src.usecases.calculate_edge — Calculating edge for Taipei (2026-04-24) | pred=21.6°C
2026-04-24 15:52:03,485 ERROR database — DB Write Error (MarketScanORM): (pymysql.err.IntegrityError) (1062, "Duplicate entry '405211-2026-04-24' for key 'market_scans_v2.uq_market_scan_date'")
[SQL: INSERT INTO market_scans_v2 (created_at, created_at_date, city, target_date, market_id, question, hours_to_res, ecmwf_max, ecmwf_min, sigma_used, outcomes_json, best_outcome, best_price, best_prob, best_edge, decision, model_metadata) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)]
[parameters: (datetime.datetime(2026, 4, 24, 15, 52, 3, 466036), datetime.date(2026, 4, 24), 'Taipei', datetime.date(2026, 4, 24), '405211', 'Highest temperature in Taipei on April 24?', 8.133050917777778, 21.6, 17.9, 1.5, '[{"label": "14\\u00b0C or below", "market_price": 0.0, "model_prob": 0.0, "edge": 0.0, "temperature": 14.0}, {"label": "15\\u00b0C", "market_price":  ... (869 characters truncated) ... : 0.1695, "temperature": 23.0}, {"label": "24\\u00b0C or higher", "market_price": 0.0005, "model_prob": 0.0488, "edge": 0.0483, "temperature": 24.0}]', '22°C', 0.0005, 0.3065793994757543, 0.3060793994757543, 'SKIP:low_price(0.00)', '{"weather_model": "ecmwf_ifs025", "ecmwf_max": 21.6, "ecmwf_min": 17.9, "sigma": 1.5, "skip_reason": "low_price(0.00)"}')]
(Background on this error at: https://sqlalche.me/e/20/gkpj)
2026-04-24 15:52:03,656 INFO src.infrastructure.weather_client — ECMWF forecast for London on 2026-04-24: max=19.4°C min=4.5°C
2026-04-24 15:52:03,656 INFO src.usecases.calculate_edge — Calculating edge for London (2026-04-24) | pred=19.4°C
2026-04-24 15:52:03,674 ERROR database — DB Write Error (MarketScanORM): (pymysql.err.IntegrityError) (1062, "Duplicate entry '405187-2026-04-24' for key 'market_scans_v2.uq_market_scan_date'")
[SQL: INSERT INTO market_scans_v2 (created_at, created_at_date, city, target_date, market_id, question, hours_to_res, ecmwf_max, ecmwf_min, sigma_used, outcomes_json, best_outcome, best_price, best_prob, best_edge, decision, model_metadata) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)]
[parameters: (datetime.datetime(2026, 4, 24, 15, 52, 3, 659066), datetime.date(2026, 4, 24), 'London', datetime.date(2026, 4, 24), '405187', 'Highest temperature in London on April 24?', 8.133050917777778, 19.4, 4.5, 1.5, '[{"label": "13\\u00b0C or below", "market_price": 0.0, "model_prob": 0.0, "edge": 0.0, "temperature": 13.0}, {"label": "14\\u00b0C", "market_price":  ... (882 characters truncated) ... : 0.0347, "temperature": 22.0}, {"label": "23\\u00b0C or higher", "market_price": 0.0005, "model_prob": 0.0046, "edge": 0.0041, "temperature": 23.0}]', '19°C', 0.0135, 0.3065793994757543, 0.2930793994757543, 'SKIP:low_price(0.01)', '{"weather_model": "ecmwf_ifs025", "ecmwf_max": 19.4, "ecmwf_min": 4.5, "sigma": 1.5, "skip_reason": "low_price(0.01)"}')]
(Background on this error at: https://sqlalche.me/e/20/gkpj)
2026-04-24 15:52:03,852 INFO src.infrastructure.weather_client — ECMWF forecast for Paris on 2026-04-24: max=23.1°C min=9.4°C
2026-04-24 15:52:03,852 INFO src.usecases.calculate_edge — Calculating edge for Paris (2026-04-24) | pred=23.1°C
2026-04-24 15:52:03,868 ERROR database — DB Write Error (MarketScanORM): (pymysql.err.IntegrityError) (1062, "Duplicate entry '405188-2026-04-24' for key 'market_scans_v2.uq_market_scan_date'")
[SQL: INSERT INTO market_scans_v2 (created_at, created_at_date, city, target_date, market_id, question, hours_to_res, ecmwf_max, ecmwf_min, sigma_used, outcomes_json, best_outcome, best_price, best_prob, best_edge, decision, model_metadata) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)]
[parameters: (datetime.datetime(2026, 4, 24, 15, 52, 3, 855056), datetime.date(2026, 4, 24), 'Paris', datetime.date(2026, 4, 24), '405188', 'Highest temperature in Paris on April 24?', 8.133050917777778, 23.1, 9.4, 1.5, '[{"label": "15\\u00b0C or below", "market_price": 0.0, "model_prob": 0.0, "edge": 0.0, "temperature": 15.0}, {"label": "16\\u00b0C", "market_price":  ... (871 characters truncated) ... ": 0.2338, "temperature": 24.0}, {"label": "25\\u00b0C or higher", "market_price": 0.008, "model_prob": 0.0989, "edge": 0.0909, "temperature": 25.0}]', '24°C', 0.014, 0.24776883560738272, 0.2337688356073827, 'SKIP:low_price(0.01)', '{"weather_model": "ecmwf_ifs025", "ecmwf_max": 23.1, "ecmwf_min": 9.4, "sigma": 1.5, "skip_reason": "low_price(0.01)"}')]
(Background on this error at: https://sqlalche.me/e/20/gkpj)
2026-04-24 15:52:04,048 INFO src.infrastructure.weather_client — ECMWF forecast for Madrid on 2026-04-24: max=23.0°C min=12.6°C
2026-04-24 15:52:04,049 INFO src.usecases.calculate_edge — Calculating edge for Madrid (2026-04-24) | pred=23.0°C
2026-04-24 15:52:04,070 ERROR database — DB Write Error (MarketScanORM): (pymysql.err.IntegrityError) (1062, "Duplicate entry '405209-2026-04-24' for key 'market_scans_v2.uq_market_scan_date'")
[SQL: INSERT INTO market_scans_v2 (created_at, created_at_date, city, target_date, market_id, question, hours_to_res, ecmwf_max, ecmwf_min, sigma_used, outcomes_json, best_outcome, best_price, best_prob, best_edge, decision, model_metadata) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)]
[parameters: (datetime.datetime(2026, 4, 24, 15, 52, 4, 53042), datetime.date(2026, 4, 24), 'Madrid', datetime.date(2026, 4, 24), '405209', 'Highest temperature in Madrid on April 24?', 8.133050917777778, 23.0, 12.6, 1.5, '[{"label": "18\\u00b0C or below", "market_price": 0.0, "model_prob": 0.0001, "edge": 0.0001, "temperature": 18.0}, {"label": "19\\u00b0C", "market_pr ... (899 characters truncated) ...  0.0012, "temperature": 27.0}, {"label": "28\\u00b0C or higher", "market_price": 0.0005, "model_prob": 0.0001, "edge": -0.0004, "temperature": 28.0}]', '24°C', 0.012, 0.23281134584383434, 0.22081134584383433, 'SKIP:low_price(0.01)', '{"weather_model": "ecmwf_ifs025", "ecmwf_max": 23.0, "ecmwf_min": 12.6, "sigma": 1.5, "skip_reason": "low_price(0.01)"}')]
(Background on this error at: https://sqlalche.me/e/20/gkpj)
2026-04-24 15:52:04,246 INFO src.infrastructure.weather_client — ECMWF forecast for Chicago on 2026-04-24: max=22.8°C min=16.8°C
2026-04-24 15:52:04,247 INFO src.usecases.calculate_edge — Calculating edge for Chicago (2026-04-24) | pred=22.8°C
2026-04-24 15:52:04,267 ERROR database — DB Write Error (MarketScanORM): (pymysql.err.IntegrityError) (1062, "Duplicate entry '405198-2026-04-24' for key 'market_scans_v2.uq_market_scan_date'")
[SQL: INSERT INTO market_scans_v2 (created_at, created_at_date, city, target_date, market_id, question, hours_to_res, ecmwf_max, ecmwf_min, sigma_used, outcomes_json, best_outcome, best_price, best_prob, best_edge, decision, model_metadata) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)]
[parameters: (datetime.datetime(2026, 4, 24, 15, 52, 4, 250905), datetime.date(2026, 4, 24), 'Chicago', datetime.date(2026, 4, 24), '405198', 'Highest temperature in Chicago on April 24?', 8.133050917777778, 22.8, 16.8, 1.5, '[{"label": "57\\u00b0F or below", "market_price": 0.0, "model_prob": 0.0, "edge": 0.0, "temperature": 13.88888888888889}, {"label": "58-59\\u00b0F",  ... (1023 characters truncated) ... 333333333333332}, {"label": "76\\u00b0F or higher", "market_price": 0.0295, "model_prob": 0.1332, "edge": 0.1037, "temperature": 24.444444444444443}]', '74-75°F', 0.095, 0.29433126985631497, 0.19933126985631497, 'SKIP:low_price(0.10)', '{"weather_model": "ecmwf_ifs025", "ecmwf_max": 22.8, "ecmwf_min": 16.8, "sigma": 1.5, "skip_reason": "low_price(0.10)"}')]
(Background on this error at: https://sqlalche.me/e/20/gkpj)
2026-04-24 15:52:04,433 INFO src.infrastructure.weather_client — ECMWF forecast for Miami on 2026-04-24: max=25.4°C min=21.5°C
2026-04-24 15:52:04,434 INFO src.usecases.calculate_edge — Calculating edge for Miami (2026-04-24) | pred=25.4°C
2026-04-24 15:52:04,455 ERROR database — DB Write Error (MarketScanORM): (pymysql.err.IntegrityError) (1062, "Duplicate entry '405197-2026-04-24' for key 'market_scans_v2.uq_market_scan_date'")
[SQL: INSERT INTO market_scans_v2 (created_at, created_at_date, city, target_date, market_id, question, hours_to_res, ecmwf_max, ecmwf_min, sigma_used, outcomes_json, best_outcome, best_price, best_prob, best_edge, decision, model_metadata) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)]
[parameters: (datetime.datetime(2026, 4, 24, 15, 52, 4, 437841), datetime.date(2026, 4, 24), 'Miami', datetime.date(2026, 4, 24), '405197', 'Highest temperature in Miami on April 24?', 8.133050917777778, 25.4, 21.5, 1.5, '[{"label": "71\\u00b0F or below", "market_price": 0.0, "model_prob": 0.0033, "edge": 0.0033, "temperature": 21.666666666666668}, {"label": "72-73\\u0 ... (1051 characters truncated) ... ": 31.11111111111111}, {"label": "90\\u00b0F or higher", "market_price": 0.002, "model_prob": 0.0, "edge": -0.002, "temperature": 32.22222222222222}]', '78-79°F', 0.0005, 0.32052687841215277, 0.32002687841215277, 'SKIP:low_price(0.00)', '{"weather_model": "ecmwf_ifs025", "ecmwf_max": 25.4, "ecmwf_min": 21.5, "sigma": 1.5, "skip_reason": "low_price(0.00)"}')]
(Background on this error at: https://sqlalche.me/e/20/gkpj)
2026-04-24 15:52:04,636 INFO src.infrastructure.weather_client — ECMWF forecast for Hong Kong on 2026-04-25: max=26.0°C min=20.7°C
2026-04-24 15:52:04,637 INFO src.usecases.calculate_edge — Calculating edge for Hong Kong (2026-04-25) | pred=26.0°C
2026-04-24 15:52:04,650 ERROR database — DB Write Error (MarketScanORM): (pymysql.err.IntegrityError) (1062, "Duplicate entry '408592-2026-04-24' for key 'market_scans_v2.uq_market_scan_date'")
[SQL: INSERT INTO market_scans_v2 (created_at, created_at_date, city, target_date, market_id, question, hours_to_res, ecmwf_max, ecmwf_min, sigma_used, outcomes_json, best_outcome, best_price, best_prob, best_edge, decision, model_metadata) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)]
[parameters: (datetime.datetime(2026, 4, 24, 15, 52, 4, 639401), datetime.date(2026, 4, 24), 'Hong Kong', datetime.date(2026, 4, 25), '408592', 'Highest temperature in Hong Kong on April 25?', 32.13305091777777, 26.0, 20.7, 1.5, '[{"label": "19\\u00b0C or below", "market_price": 0.0005, "model_prob": 0.0, "edge": -0.0005, "temperature": 19.0}, {"label": "20\\u00b0C", "market_p ... (902 characters truncated) ... : 0.0795, "temperature": 28.0}, {"label": "29\\u00b0C or higher", "market_price": 0.0035, "model_prob": 0.0168, "edge": 0.0133, "temperature": 29.0}]', '27°C', 0.052, 0.23281134584383434, 0.18081134584383435, 'SKIP:low_price(0.05)', '{"weather_model": "ecmwf_ifs025", "ecmwf_max": 26.0, "ecmwf_min": 20.7, "sigma": 1.5, "skip_reason": "low_price(0.05)"}')]
(Background on this error at: https://sqlalche.me/e/20/gkpj)
2026-04-24 15:52:04,818 INFO src.infrastructure.weather_client — ECMWF forecast for Tokyo on 2026-04-25: max=17.7°C min=9.0°C
2026-04-24 15:52:04,819 INFO src.usecases.calculate_edge — Calculating edge for Tokyo (2026-04-25) | pred=17.7°C
2026-04-24 15:52:04,840 ERROR database — DB Write Error (MarketScanORM): (pymysql.err.IntegrityError) (1062, "Duplicate entry '408591-2026-04-24' for key 'market_scans_v2.uq_market_scan_date'")
[SQL: INSERT INTO market_scans_v2 (created_at, created_at_date, city, target_date, market_id, question, hours_to_res, ecmwf_max, ecmwf_min, sigma_used, outcomes_json, best_outcome, best_price, best_prob, best_edge, decision, model_metadata) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)]
[parameters: (datetime.datetime(2026, 4, 24, 15, 52, 4, 823198), datetime.date(2026, 4, 24), 'Tokyo', datetime.date(2026, 4, 25), '408591', 'Highest temperature in Tokyo on April 25?', 32.13305091777777, 17.7, 9.0, 1.5, '[{"label": "12\\u00b0C or below", "market_price": 0.0005, "model_prob": 0.0, "edge": -0.0005, "temperature": 12.0}, {"label": "13\\u00b0C", "market_p ... (907 characters truncated) ... -0.0055, "temperature": 21.0}, {"label": "22\\u00b0C or higher", "market_price": 0.0055, "model_prob": 0.0007, "edge": -0.0048, "temperature": 22.0}]', '16°C', 0.0105, 0.1252787463466399, 0.11477874634663991, 'SKIP:low_price(0.01)', '{"weather_model": "ecmwf_ifs025", "ecmwf_max": 17.7, "ecmwf_min": 9.0, "sigma": 1.5, "skip_reason": "low_price(0.01)"}')]
(Background on this error at: https://sqlalche.me/e/20/gkpj)
2026-04-24 15:52:05,021 INFO src.infrastructure.weather_client — ECMWF forecast for Beijing on 2026-04-25: max=26.8°C min=16.1°C
2026-04-24 15:52:05,021 INFO src.usecases.calculate_edge — Calculating edge for Beijing (2026-04-25) | pred=26.8°C
2026-04-24 15:52:05,037 ERROR database — DB Write Error (MarketScanORM): (pymysql.err.IntegrityError) (1062, "Duplicate entry '408600-2026-04-24' for key 'market_scans_v2.uq_market_scan_date'")
[SQL: INSERT INTO market_scans_v2 (created_at, created_at_date, city, target_date, market_id, question, hours_to_res, ecmwf_max, ecmwf_min, sigma_used, outcomes_json, best_outcome, best_price, best_prob, best_edge, decision, model_metadata) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)]
[parameters: (datetime.datetime(2026, 4, 24, 15, 52, 5, 24807), datetime.date(2026, 4, 24), 'Beijing', datetime.date(2026, 4, 25), '408600', 'Highest temperature in Beijing on April 25?', 32.13305091777777, 26.8, 16.1, 1.5, '[{"label": "23\\u00b0C or below", "market_price": 0.0025, "model_prob": 0.0028, "edge": 0.0003, "temperature": 23.0}, {"label": "24\\u00b0C", "market ... (898 characters truncated) ... ge": -0.0035, "temperature": 32.0}, {"label": "33\\u00b0C or higher", "market_price": 0.002, "model_prob": 0.0, "edge": -0.002, "temperature": 33.0}]', '26°C', 0.11, 0.2619634268674541, 0.15196342686745412, 'SKIP:low_price(0.11)', '{"weather_model": "ecmwf_ifs025", "ecmwf_max": 26.8, "ecmwf_min": 16.1, "sigma": 1.5, "skip_reason": "low_price(0.11)"}')]
(Background on this error at: https://sqlalche.me/e/20/gkpj)
2026-04-24 15:52:05,205 INFO src.infrastructure.weather_client — ECMWF forecast for Shanghai on 2026-04-25: max=21.1°C min=10.9°C
2026-04-24 15:52:05,205 INFO src.usecases.calculate_edge — Calculating edge for Shanghai (2026-04-25) | pred=21.1°C
2026-04-24 15:52:05,228 ERROR database — DB Write Error (MarketScanORM): (pymysql.err.IntegrityError) (1062, "Duplicate entry '408593-2026-04-24' for key 'market_scans_v2.uq_market_scan_date'")
[SQL: INSERT INTO market_scans_v2 (created_at, created_at_date, city, target_date, market_id, question, hours_to_res, ecmwf_max, ecmwf_min, sigma_used, outcomes_json, best_outcome, best_price, best_prob, best_edge, decision, model_metadata) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)]
[parameters: (datetime.datetime(2026, 4, 24, 15, 52, 5, 209869), datetime.date(2026, 4, 24), 'Shanghai', datetime.date(2026, 4, 25), '408593', 'Highest temperature in Shanghai on April 25?', 32.13305091777777, 21.1, 10.9, 1.5, '[{"label": "14\\u00b0C or below", "market_price": 0.0005, "model_prob": 0.0, "edge": -0.0005, "temperature": 14.0}, {"label": "15\\u00b0C", "market_p ... (900 characters truncated) ... : 0.0389, "temperature": 23.0}, {"label": "24\\u00b0C or higher", "market_price": 0.0125, "model_prob": 0.0204, "edge": 0.0079, "temperature": 24.0}]', '22°C', 0.2085, 0.24776883560738272, 0.03926883560738273, 'SKIP:low_edge(0.039)', '{"weather_model": "ecmwf_ifs025", "ecmwf_max": 21.1, "ecmwf_min": 10.9, "sigma": 1.5, "skip_reason": "low_edge(0.039)"}')]
(Background on this error at: https://sqlalche.me/e/20/gkpj)
2026-04-24 15:52:05,406 INFO src.infrastructure.weather_client — ECMWF forecast for Seoul on 2026-04-25: max=26.5°C min=10.0°C
2026-04-24 15:52:05,407 INFO src.usecases.calculate_edge — Calculating edge for Seoul (2026-04-25) | pred=26.5°C
2026-04-24 15:52:05,434 ERROR database — DB Write Error (MarketScanORM): (pymysql.err.IntegrityError) (1062, "Duplicate entry '408578-2026-04-24' for key 'market_scans_v2.uq_market_scan_date'")
[SQL: INSERT INTO market_scans_v2 (created_at, created_at_date, city, target_date, market_id, question, hours_to_res, ecmwf_max, ecmwf_min, sigma_used, outcomes_json, best_outcome, best_price, best_prob, best_edge, decision, model_metadata) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)]
[parameters: (datetime.datetime(2026, 4, 24, 15, 52, 5, 411285), datetime.date(2026, 4, 24), 'Seoul', datetime.date(2026, 4, 25), '408578', 'Highest temperature in Seoul on April 25?', 32.13305091777777, 26.5, 10.0, 1.5, '[{"label": "11\\u00b0C or below", "market_price": 0.0005, "model_prob": 0.0, "edge": -0.0005, "temperature": 11.0}, {"label": "12\\u00b0C", "market_p ... (879 characters truncated) ... dge": -0.115, "temperature": 20.0}, {"label": "21\\u00b0C or higher", "market_price": 0.835, "model_prob": 0.0, "edge": -0.835, "temperature": 21.0}]', '16°C', 0.0005, 3.927434077120261e-17, -0.0004999999999999608, 'SKIP:low_edge(-0.000)', '{"weather_model": "ecmwf_ifs025", "ecmwf_max": 26.5, "ecmwf_min": 10.0, "sigma": 1.5, "skip_reason": "low_edge(-0.000)"}')]
(Background on this error at: https://sqlalche.me/e/20/gkpj)
2026-04-24 15:52:05,613 INFO src.infrastructure.weather_client — ECMWF forecast for Singapore on 2026-04-25: max=30.0°C min=24.8°C
2026-04-24 15:52:05,614 INFO src.usecases.calculate_edge — Calculating edge for Singapore (2026-04-25) | pred=30.0°C
2026-04-24 15:52:05,636 ERROR database — DB Write Error (MarketScanORM): (pymysql.err.IntegrityError) (1062, "Duplicate entry '408594-2026-04-24' for key 'market_scans_v2.uq_market_scan_date'")
[SQL: INSERT INTO market_scans_v2 (created_at, created_at_date, city, target_date, market_id, question, hours_to_res, ecmwf_max, ecmwf_min, sigma_used, outcomes_json, best_outcome, best_price, best_prob, best_edge, decision, model_metadata) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)]
[parameters: (datetime.datetime(2026, 4, 24, 15, 52, 5, 618964), datetime.date(2026, 4, 24), 'Singapore', datetime.date(2026, 4, 25), '408594', 'Highest temperature in Singapore on April 25?', 32.13305091777777, 30.0, 24.8, 1.5, '[{"label": "26\\u00b0C or below", "market_price": 0.0005, "model_prob": 0.0017, "edge": 0.0012, "temperature": 26.0}, {"label": "27\\u00b0C", "market ... (901 characters truncated) ... ": -0.0184, "temperature": 35.0}, {"label": "36\\u00b0C or higher", "market_price": 0.0065, "model_prob": 0.0, "edge": -0.0065, "temperature": 36.0}]', '30°C', 0.007, 0.3230777609786207, 0.31607776097862067, 'SKIP:low_price(0.01)', '{"weather_model": "ecmwf_ifs025", "ecmwf_max": 30.0, "ecmwf_min": 24.8, "sigma": 1.5, "skip_reason": "low_price(0.01)"}')]
(Background on this error at: https://sqlalche.me/e/20/gkpj)
2026-04-24 15:52:05,804 INFO src.infrastructure.weather_client — ECMWF forecast for Taipei on 2026-04-25: max=23.0°C min=17.9°C
2026-04-24 15:52:05,805 INFO src.usecases.calculate_edge — Calculating edge for Taipei (2026-04-25) | pred=23.0°C
2026-04-24 15:52:05,827 ERROR database — DB Write Error (MarketScanORM): (pymysql.err.IntegrityError) (1062, "Duplicate entry '408598-2026-04-24' for key 'market_scans_v2.uq_market_scan_date'")
[SQL: INSERT INTO market_scans_v2 (created_at, created_at_date, city, target_date, market_id, question, hours_to_res, ecmwf_max, ecmwf_min, sigma_used, outcomes_json, best_outcome, best_price, best_prob, best_edge, decision, model_metadata) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)]
[parameters: (datetime.datetime(2026, 4, 24, 15, 52, 5, 808097), datetime.date(2026, 4, 24), 'Taipei', datetime.date(2026, 4, 25), '408598', 'Highest temperature in Taipei on April 25?', 32.13305091777777, 23.0, 17.9, 1.5, '[{"label": "15\\u00b0C or below", "market_price": 0.0005, "model_prob": 0.0, "edge": -0.0005, "temperature": 15.0}, {"label": "16\\u00b0C", "market_p ... (896 characters truncated) ... ": 0.1228, "temperature": 24.0}, {"label": "25\\u00b0C or higher", "market_price": 0.0235, "model_prob": 0.087, "edge": 0.0635, "temperature": 25.0}]', '24°C', 0.11, 0.23281134584383434, 0.12281134584383434, 'SKIP:low_price(0.11)', '{"weather_model": "ecmwf_ifs025", "ecmwf_max": 23.0, "ecmwf_min": 17.9, "sigma": 1.5, "skip_reason": "low_price(0.11)"}')]
(Background on this error at: https://sqlalche.me/e/20/gkpj)
2026-04-24 15:52:05,993 INFO src.infrastructure.weather_client — ECMWF forecast for London on 2026-04-25: max=21.1°C min=5.4°C
2026-04-24 15:52:05,994 INFO src.usecases.calculate_edge — Calculating edge for London (2026-04-25) | pred=21.1°C
2026-04-24 15:52:06,017 ERROR database — DB Write Error (MarketScanORM): (pymysql.err.IntegrityError) (1062, "Duplicate entry '408574-2026-04-24' for key 'market_scans_v2.uq_market_scan_date'")
[SQL: INSERT INTO market_scans_v2 (created_at, created_at_date, city, target_date, market_id, question, hours_to_res, ecmwf_max, ecmwf_min, sigma_used, outcomes_json, best_outcome, best_price, best_prob, best_edge, decision, model_metadata) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)]
[parameters: (datetime.datetime(2026, 4, 24, 15, 52, 5, 998204), datetime.date(2026, 4, 24), 'London', datetime.date(2026, 4, 25), '408574', 'Highest temperature in London on April 25?', 32.13305091777777, 21.1, 5.4, 1.5, '[{"label": "15\\u00b0C or below", "market_price": 0.001, "model_prob": 0.0, "edge": -0.001, "temperature": 15.0}, {"label": "16\\u00b0C", "market_pri ... (904 characters truncated) ... : 0.0189, "temperature": 24.0}, {"label": "25\\u00b0C or higher", "market_price": 0.0015, "model_prob": 0.0022, "edge": 0.0007, "temperature": 25.0}]', '22°C', 0.0975, 0.24776883560738272, 0.15026883560738272, 'SKIP:low_price(0.10)', '{"weather_model": "ecmwf_ifs025", "ecmwf_max": 21.1, "ecmwf_min": 5.4, "sigma": 1.5, "skip_reason": "low_price(0.10)"}')]
(Background on this error at: https://sqlalche.me/e/20/gkpj)
2026-04-24 15:52:06,197 INFO src.infrastructure.weather_client — ECMWF forecast for Paris on 2026-04-25: max=23.9°C min=8.6°C
2026-04-24 15:52:06,197 INFO src.usecases.calculate_edge — Calculating edge for Paris (2026-04-25) | pred=23.9°C
2026-04-24 15:52:06,220 ERROR database — DB Write Error (MarketScanORM): (pymysql.err.IntegrityError) (1062, "Duplicate entry '408575-2026-04-24' for key 'market_scans_v2.uq_market_scan_date'")
[SQL: INSERT INTO market_scans_v2 (created_at, created_at_date, city, target_date, market_id, question, hours_to_res, ecmwf_max, ecmwf_min, sigma_used, outcomes_json, best_outcome, best_price, best_prob, best_edge, decision, model_metadata) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)]
[parameters: (datetime.datetime(2026, 4, 24, 15, 52, 6, 201533), datetime.date(2026, 4, 24), 'Paris', datetime.date(2026, 4, 25), '408575', 'Highest temperature in Paris on April 25?', 32.13305091777777, 23.9, 8.6, 1.5, '[{"label": "15\\u00b0C or below", "market_price": 0.0015, "model_prob": 0.0, "edge": -0.0015, "temperature": 15.0}, {"label": "16\\u00b0C", "market_p ... (899 characters truncated) ... ": 0.247, "temperature": 24.0}, {"label": "25\\u00b0C or higher", "market_price": 0.0145, "model_prob": 0.2173, "edge": 0.2028, "temperature": 25.0}]', '24°C', 0.075, 0.32202112109224945, 0.24702112109224944, 'SKIP:low_price(0.07)', '{"weather_model": "ecmwf_ifs025", "ecmwf_max": 23.9, "ecmwf_min": 8.6, "sigma": 1.5, "skip_reason": "low_price(0.07)"}')]
(Background on this error at: https://sqlalche.me/e/20/gkpj)
2026-04-24 15:52:06,399 INFO src.infrastructure.weather_client — ECMWF forecast for Madrid on 2026-04-25: max=22.9°C min=12.9°C
2026-04-24 15:52:06,400 INFO src.usecases.calculate_edge — Calculating edge for Madrid (2026-04-25) | pred=22.9°C
2026-04-24 15:52:06,426 ERROR database — DB Write Error (MarketScanORM): (pymysql.err.IntegrityError) (1062, "Duplicate entry '408596-2026-04-24' for key 'market_scans_v2.uq_market_scan_date'")
[SQL: INSERT INTO market_scans_v2 (created_at, created_at_date, city, target_date, market_id, question, hours_to_res, ecmwf_max, ecmwf_min, sigma_used, outcomes_json, best_outcome, best_price, best_prob, best_edge, decision, model_metadata) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)]
[parameters: (datetime.datetime(2026, 4, 24, 15, 52, 6, 403943), datetime.date(2026, 4, 24), 'Madrid', datetime.date(2026, 4, 25), '408596', 'Highest temperature in Madrid on April 25?', 32.13305091777777, 22.9, 12.9, 1.5, '[{"label": "18\\u00b0C or below", "market_price": 0.0025, "model_prob": 0.0001, "edge": -0.0024, "temperature": 18.0}, {"label": "19\\u00b0C", "marke ... (906 characters truncated) ... -0.0052, "temperature": 27.0}, {"label": "28\\u00b0C or higher", "market_price": 0.0025, "model_prob": 0.0001, "edge": -0.0024, "temperature": 28.0}]', '22°C', 0.085, 0.24776883560738272, 0.1627688356073827, 'SKIP:low_price(0.09)', '{"weather_model": "ecmwf_ifs025", "ecmwf_max": 22.9, "ecmwf_min": 12.9, "sigma": 1.5, "skip_reason": "low_price(0.09)"}')]
(Background on this error at: https://sqlalche.me/e/20/gkpj)
2026-04-24 15:52:06,606 INFO src.infrastructure.weather_client — ECMWF forecast for Chicago on 2026-04-25: max=19.3°C min=6.5°C
2026-04-24 15:52:06,607 INFO src.usecases.calculate_edge — Calculating edge for Chicago (2026-04-25) | pred=19.3°C
2026-04-24 15:52:06,630 ERROR database — DB Write Error (MarketScanORM): (pymysql.err.IntegrityError) (1062, "Duplicate entry '408585-2026-04-24' for key 'market_scans_v2.uq_market_scan_date'")
[SQL: INSERT INTO market_scans_v2 (created_at, created_at_date, city, target_date, market_id, question, hours_to_res, ecmwf_max, ecmwf_min, sigma_used, outcomes_json, best_outcome, best_price, best_prob, best_edge, decision, model_metadata) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)]
[parameters: (datetime.datetime(2026, 4, 24, 15, 52, 6, 611589), datetime.date(2026, 4, 24), 'Chicago', datetime.date(2026, 4, 25), '408585', 'Highest temperature in Chicago on April 25?', 32.13305091777777, 19.3, 6.5, 1.5, '[{"label": "43\\u00b0F or below", "market_price": 0.0005, "model_prob": 0.0, "edge": -0.0005, "temperature": 6.111111111111111}, {"label": "44-45\\u0 ... (1044 characters truncated) ... .555555555555555}, {"label": "62\\u00b0F or higher", "market_price": 0.26, "model_prob": 0.0332, "edge": -0.2268, "temperature": 16.666666666666668}]', '43°F or below', 0.0005, 1.965010846037044e-26, -0.0005, 'SKIP:low_edge(-0.001)', '{"weather_model": "ecmwf_ifs025", "ecmwf_max": 19.3, "ecmwf_min": 6.5, "sigma": 1.5, "skip_reason": "low_edge(-0.001)"}')]
(Background on this error at: https://sqlalche.me/e/20/gkpj)
2026-04-24 15:52:06,797 INFO src.infrastructure.weather_client — ECMWF forecast for Miami on 2026-04-25: max=27.8°C min=21.2°C
2026-04-24 15:52:06,797 INFO src.usecases.calculate_edge — Calculating edge for Miami (2026-04-25) | pred=27.8°C
2026-04-24 15:52:06,818 ERROR database — DB Write Error (MarketScanORM): (pymysql.err.IntegrityError) (1062, "Duplicate entry '408584-2026-04-24' for key 'market_scans_v2.uq_market_scan_date'")
[SQL: INSERT INTO market_scans_v2 (created_at, created_at_date, city, target_date, market_id, question, hours_to_res, ecmwf_max, ecmwf_min, sigma_used, outcomes_json, best_outcome, best_price, best_prob, best_edge, decision, model_metadata) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)]
[parameters: (datetime.datetime(2026, 4, 24, 15, 52, 6, 800971), datetime.date(2026, 4, 24), 'Miami', datetime.date(2026, 4, 25), '408584', 'Highest temperature in Miami on April 25?', 32.13305091777777, 27.8, 21.2, 1.5, '[{"label": "73\\u00b0F or below", "market_price": 0.0005, "model_prob": 0.0001, "edge": -0.0004, "temperature": 22.77777777777778}, {"label": "74-75\ ... (1061 characters truncated) ... : 32.22222222222222}, {"label": "92\\u00b0F or higher", "market_price": 0.002, "model_prob": 0.0, "edge": -0.002, "temperature": 33.333333333333336}]', '80-81°F', 0.105, 0.21208750189204323, 0.10708750189204323, 'SKIP:low_price(0.10)', '{"weather_model": "ecmwf_ifs025", "ecmwf_max": 27.8, "ecmwf_min": 21.2, "sigma": 1.5, "skip_reason": "low_price(0.10)"}')]
(Background on this error at: https://sqlalche.me/e/20/gkpj)
2026-04-24 15:52:06,985 INFO src.infrastructure.weather_client — ECMWF forecast for Hong Kong on 2026-04-26: max=26.3°C min=23.7°C
2026-04-24 15:52:06,985 INFO src.usecases.calculate_edge — Calculating edge for Hong Kong (2026-04-26) | pred=26.3°C
2026-04-24 15:52:06,997 INFO src.usecases.execute_trade — 💾 SIGNAL RECORDED: Hong Kong | Pred: 2026-04-26 | Outcome: 26°C @ 0.150 | ModelProb: 0.314 | Edge: 0.164
2026-04-24 15:52:07,011 ERROR database — DB Write Error (MarketScanORM): (pymysql.err.IntegrityError) (1062, "Duplicate entry '411990-2026-04-24' for key 'market_scans_v2.uq_market_scan_date'")
[SQL: INSERT INTO market_scans_v2 (created_at, created_at_date, city, target_date, market_id, question, hours_to_res, ecmwf_max, ecmwf_min, sigma_used, outcomes_json, best_outcome, best_price, best_prob, best_edge, decision, model_metadata) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)]
[parameters: (datetime.datetime(2026, 4, 24, 15, 52, 6, 988616), datetime.date(2026, 4, 24), 'Hong Kong', datetime.date(2026, 4, 26), '411990', 'Highest temperature in Hong Kong on April 26?', 56.13305091777777, 26.3, 23.7, 1.5, '[{"label": "20\\u00b0C or below", "market_price": 0.0015, "model_prob": 0.0, "edge": -0.0015, "temperature": 20.0}, {"label": "21\\u00b0C", "market_p ... (895 characters truncated) ...  -0.0905, "temperature": 29.0}, {"label": "30\\u00b0C or higher", "market_price": 0.055, "model_prob": 0.0036, "edge": -0.0514, "temperature": 30.0}]', '26°C', 0.15, 0.31369129506398075, 0.16369129506398075, 'SIGNAL', '{"weather_model": "ecmwf_ifs025", "ecmwf_max": 26.3, "ecmwf_min": 23.7, "sigma": 1.5, "skip_reason": null}')]
(Background on this error at: https://sqlalche.me/e/20/gkpj)
2026-04-24 15:52:07,184 INFO src.infrastructure.weather_client — ECMWF forecast for Tokyo on 2026-04-26: max=19.1°C min=12.1°C
2026-04-24 15:52:07,184 INFO src.usecases.calculate_edge — Calculating edge for Tokyo (2026-04-26) | pred=19.1°C
2026-04-24 15:52:07,203 ERROR database — DB Write Error (MarketScanORM): (pymysql.err.IntegrityError) (1062, "Duplicate entry '411989-2026-04-24' for key 'market_scans_v2.uq_market_scan_date'")
[SQL: INSERT INTO market_scans_v2 (created_at, created_at_date, city, target_date, market_id, question, hours_to_res, ecmwf_max, ecmwf_min, sigma_used, outcomes_json, best_outcome, best_price, best_prob, best_edge, decision, model_metadata) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)]
[parameters: (datetime.datetime(2026, 4, 24, 15, 52, 7, 188741), datetime.date(2026, 4, 24), 'Tokyo', datetime.date(2026, 4, 26), '411989', 'Highest temperature in Tokyo on April 26?', 56.13305091777777, 19.1, 12.1, 1.5, '[{"label": "13\\u00b0C or below", "market_price": 0.0035, "model_prob": 0.0, "edge": -0.0035, "temperature": 13.0}, {"label": "14\\u00b0C", "market_p ... (901 characters truncated) ...  -0.0546, "temperature": 22.0}, {"label": "23\\u00b0C or higher", "market_price": 0.013, "model_prob": 0.0022, "edge": -0.0108, "temperature": 23.0}]', '18°C', 0.075, 0.21732631900011884, 0.14232631900011883, 'SKIP:low_price(0.07)', '{"weather_model": "ecmwf_ifs025", "ecmwf_max": 19.1, "ecmwf_min": 12.1, "sigma": 1.5, "skip_reason": "low_price(0.07)"}')]
(Background on this error at: https://sqlalche.me/e/20/gkpj)
2026-04-24 15:52:07,370 INFO src.infrastructure.weather_client — ECMWF forecast for Beijing on 2026-04-26: max=23.5°C min=11.3°C
2026-04-24 15:52:07,370 INFO src.usecases.calculate_edge — Calculating edge for Beijing (2026-04-26) | pred=23.5°C
2026-04-24 15:52:07,390 ERROR database — DB Write Error (MarketScanORM): (pymysql.err.IntegrityError) (1062, "Duplicate entry '411998-2026-04-24' for key 'market_scans_v2.uq_market_scan_date'")
[SQL: INSERT INTO market_scans_v2 (created_at, created_at_date, city, target_date, market_id, question, hours_to_res, ecmwf_max, ecmwf_min, sigma_used, outcomes_json, best_outcome, best_price, best_prob, best_edge, decision, model_metadata) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)]
[parameters: (datetime.datetime(2026, 4, 24, 15, 52, 7, 374172), datetime.date(2026, 4, 24), 'Beijing', datetime.date(2026, 4, 26), '411998', 'Highest temperature in Beijing on April 26?', 56.13305091777777, 23.5, 11.3, 1.5, '[{"label": "20\\u00b0C or below", "market_price": 0.012, "model_prob": 0.0058, "edge": -0.0062, "temperature": 20.0}, {"label": "21\\u00b0C", "market ... (898 characters truncated) ... ge": -0.0125, "temperature": 29.0}, {"label": "30\\u00b0C or higher", "market_price": 0.011, "model_prob": 0.0, "edge": -0.011, "temperature": 30.0}]', '23°C', 0.18, 0.2976716190363569, 0.11767161903635692, 'SIGNAL', '{"weather_model": "ecmwf_ifs025", "ecmwf_max": 23.5, "ecmwf_min": 11.3, "sigma": 1.5, "skip_reason": null}')]
(Background on this error at: https://sqlalche.me/e/20/gkpj)
2026-04-24 15:52:07,562 INFO src.infrastructure.weather_client — ECMWF forecast for Shanghai on 2026-04-26: max=23.8°C min=14.6°C
2026-04-24 15:52:07,563 INFO src.usecases.calculate_edge — Calculating edge for Shanghai (2026-04-26) | pred=23.8°C
2026-04-24 15:52:07,589 ERROR database — DB Write Error (MarketScanORM): (pymysql.err.IntegrityError) (1062, "Duplicate entry '411991-2026-04-24' for key 'market_scans_v2.uq_market_scan_date'")
[SQL: INSERT INTO market_scans_v2 (created_at, created_at_date, city, target_date, market_id, question, hours_to_res, ecmwf_max, ecmwf_min, sigma_used, outcomes_json, best_outcome, best_price, best_prob, best_edge, decision, model_metadata) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)]
[parameters: (datetime.datetime(2026, 4, 24, 15, 52, 7, 566409), datetime.date(2026, 4, 24), 'Shanghai', datetime.date(2026, 4, 26), '411991', 'Highest temperature in Shanghai on April 26?', 56.13305091777777, 23.8, 14.6, 1.5, '[{"label": "18\\u00b0C or below", "market_price": 0.0085, "model_prob": 0.0, "edge": -0.0085, "temperature": 18.0}, {"label": "19\\u00b0C", "market_p ... (901 characters truncated) ... e": 0.0042, "temperature": 27.0}, {"label": "28\\u00b0C or higher", "market_price": 0.004, "model_prob": 0.001, "edge": -0.003, "temperature": 28.0}]', '24°C', 0.155, 0.31887186208321805, 0.16387186208321805, 'SIGNAL', '{"weather_model": "ecmwf_ifs025", "ecmwf_max": 23.8, "ecmwf_min": 14.6, "sigma": 1.5, "skip_reason": null}')]
(Background on this error at: https://sqlalche.me/e/20/gkpj)
2026-04-24 15:52:07,759 INFO src.infrastructure.weather_client — ECMWF forecast for Seoul on 2026-04-26: max=24.4°C min=10.5°C
2026-04-24 15:52:07,759 INFO src.usecases.calculate_edge — Calculating edge for Seoul (2026-04-26) | pred=24.4°C
2026-04-24 15:52:07,779 ERROR database — DB Write Error (MarketScanORM): (pymysql.err.IntegrityError) (1062, "Duplicate entry '411976-2026-04-24' for key 'market_scans_v2.uq_market_scan_date'")
[SQL: INSERT INTO market_scans_v2 (created_at, created_at_date, city, target_date, market_id, question, hours_to_res, ecmwf_max, ecmwf_min, sigma_used, outcomes_json, best_outcome, best_price, best_prob, best_edge, decision, model_metadata) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)]
[parameters: (datetime.datetime(2026, 4, 24, 15, 52, 7, 762883), datetime.date(2026, 4, 24), 'Seoul', datetime.date(2026, 4, 26), '411976', 'Highest temperature in Seoul on April 26?', 56.13305091777777, 24.4, 10.5, 1.5, '[{"label": "10\\u00b0C or below", "market_price": 0.0015, "model_prob": 0.0, "edge": -0.0015, "temperature": 10.0}, {"label": "11\\u00b0C", "market_p ... (883 characters truncated) ... : -0.135, "temperature": 19.0}, {"label": "20\\u00b0C or higher", "market_price": 0.765, "model_prob": 0.0006, "edge": -0.7644, "temperature": 20.0}]', '10°C or below', 0.0015, 2.5029376574528515e-31, -0.0015, 'SKIP:low_edge(-0.002)', '{"weather_model": "ecmwf_ifs025", "ecmwf_max": 24.4, "ecmwf_min": 10.5, "sigma": 1.5, "skip_reason": "low_edge(-0.002)"}')]
(Background on this error at: https://sqlalche.me/e/20/gkpj)
2026-04-24 15:52:07,949 INFO src.infrastructure.weather_client — ECMWF forecast for Singapore on 2026-04-26: max=29.5°C min=24.2°C
2026-04-24 15:52:07,949 INFO src.usecases.calculate_edge — Calculating edge for Singapore (2026-04-26) | pred=29.5°C
2026-04-24 15:52:07,964 ERROR database — DB Write Error (MarketScanORM): (pymysql.err.IntegrityError) (1062, "Duplicate entry '411992-2026-04-24' for key 'market_scans_v2.uq_market_scan_date'")
[SQL: INSERT INTO market_scans_v2 (created_at, created_at_date, city, target_date, market_id, question, hours_to_res, ecmwf_max, ecmwf_min, sigma_used, outcomes_json, best_outcome, best_price, best_prob, best_edge, decision, model_metadata) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)]
[parameters: (datetime.datetime(2026, 4, 24, 15, 52, 7, 952657), datetime.date(2026, 4, 24), 'Singapore', datetime.date(2026, 4, 26), '411992', 'Highest temperature in Singapore on April 26?', 56.13305091777777, 29.5, 24.2, 1.5, '[{"label": "26\\u00b0C or below", "market_price": 0.0025, "model_prob": 0.0058, "edge": 0.0033, "temperature": 26.0}, {"label": "27\\u00b0C", "market ... (897 characters truncated) ... dge": -0.013, "temperature": 35.0}, {"label": "36\\u00b0C or higher", "market_price": 0.011, "model_prob": 0.0, "edge": -0.011, "temperature": 36.0}]', '29°C', 0.016, 0.2976716190363569, 0.2816716190363569, 'SKIP:low_price(0.02)', '{"weather_model": "ecmwf_ifs025", "ecmwf_max": 29.5, "ecmwf_min": 24.2, "sigma": 1.5, "skip_reason": "low_price(0.02)"}')]
(Background on this error at: https://sqlalche.me/e/20/gkpj)
2026-04-24 15:52:08,134 INFO src.infrastructure.weather_client — ECMWF forecast for Taipei on 2026-04-26: max=27.6°C min=15.1°C
2026-04-24 15:52:08,135 INFO src.usecases.calculate_edge — Calculating edge for Taipei (2026-04-26) | pred=27.6°C
2026-04-24 15:52:08,165 ERROR database — DB Write Error (MarketScanORM): (pymysql.err.IntegrityError) (1062, "Duplicate entry '411996-2026-04-24' for key 'market_scans_v2.uq_market_scan_date'")
[SQL: INSERT INTO market_scans_v2 (created_at, created_at_date, city, target_date, market_id, question, hours_to_res, ecmwf_max, ecmwf_min, sigma_used, outcomes_json, best_outcome, best_price, best_prob, best_edge, decision, model_metadata) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)]
[parameters: (datetime.datetime(2026, 4, 24, 15, 52, 8, 138938), datetime.date(2026, 4, 24), 'Taipei', datetime.date(2026, 4, 26), '411996', 'Highest temperature in Taipei on April 26?', 56.13305091777777, 27.6, 15.1, 1.5, '[{"label": "23\\u00b0C or below", "market_price": 0.0055, "model_prob": 0.0003, "edge": -0.0052, "temperature": 23.0}, {"label": "24\\u00b0C", "marke ... (901 characters truncated) ... ": -0.0119, "temperature": 32.0}, {"label": "33\\u00b0C or higher", "market_price": 0.0085, "model_prob": 0.0, "edge": -0.0085, "temperature": 33.0}]', '27°C', 0.19, 0.28713457898259215, 0.09713457898259215, 'SIGNAL', '{"weather_model": "ecmwf_ifs025", "ecmwf_max": 27.6, "ecmwf_min": 15.1, "sigma": 1.5, "skip_reason": null}')]
(Background on this error at: https://sqlalche.me/e/20/gkpj)
2026-04-24 15:52:08,349 INFO src.infrastructure.weather_client — ECMWF forecast for London on 2026-04-26: max=19.4°C min=8.6°C
2026-04-24 15:52:08,349 INFO src.usecases.calculate_edge — Calculating edge for London (2026-04-26) | pred=19.4°C
2026-04-24 15:52:08,372 ERROR database — DB Write Error (MarketScanORM): (pymysql.err.IntegrityError) (1062, "Duplicate entry '411972-2026-04-24' for key 'market_scans_v2.uq_market_scan_date'")
[SQL: INSERT INTO market_scans_v2 (created_at, created_at_date, city, target_date, market_id, question, hours_to_res, ecmwf_max, ecmwf_min, sigma_used, outcomes_json, best_outcome, best_price, best_prob, best_edge, decision, model_metadata) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)]
[parameters: (datetime.datetime(2026, 4, 24, 15, 52, 8, 353251), datetime.date(2026, 4, 24), 'London', datetime.date(2026, 4, 26), '411972', 'Highest temperature in London on April 26?', 56.13305091777777, 19.4, 8.6, 1.5, '[{"label": "12\\u00b0C or below", "market_price": 0.0015, "model_prob": 0.0, "edge": -0.0015, "temperature": 12.0}, {"label": "13\\u00b0C", "market_p ... (897 characters truncated) ... : 0.1291, "temperature": 21.0}, {"label": "22\\u00b0C or higher", "market_price": 0.0075, "model_prob": 0.0352, "edge": 0.0277, "temperature": 22.0}]', '20°C', 0.095, 0.2871345789825922, 0.1921345789825922, 'SKIP:low_price(0.10)', '{"weather_model": "ecmwf_ifs025", "ecmwf_max": 19.4, "ecmwf_min": 8.6, "sigma": 1.5, "skip_reason": "low_price(0.10)"}')]
(Background on this error at: https://sqlalche.me/e/20/gkpj)
2026-04-24 15:52:08,540 INFO src.infrastructure.weather_client — ECMWF forecast for Paris on 2026-04-26: max=22.3°C min=9.6°C
2026-04-24 15:52:08,541 INFO src.usecases.calculate_edge — Calculating edge for Paris (2026-04-26) | pred=22.3°C
2026-04-24 15:52:08,559 ERROR database — DB Write Error (MarketScanORM): (pymysql.err.IntegrityError) (1062, "Duplicate entry '411973-2026-04-24' for key 'market_scans_v2.uq_market_scan_date'")
[SQL: INSERT INTO market_scans_v2 (created_at, created_at_date, city, target_date, market_id, question, hours_to_res, ecmwf_max, ecmwf_min, sigma_used, outcomes_json, best_outcome, best_price, best_prob, best_edge, decision, model_metadata) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)]
[parameters: (datetime.datetime(2026, 4, 24, 15, 52, 8, 543933), datetime.date(2026, 4, 24), 'Paris', datetime.date(2026, 4, 26), '411973', 'Highest temperature in Paris on April 26?', 56.13305091777777, 22.3, 9.6, 1.5, '[{"label": "15\\u00b0C or below", "market_price": 0.0025, "model_prob": 0.0, "edge": -0.0025, "temperature": 15.0}, {"label": "16\\u00b0C", "market_p ... (891 characters truncated) ... ": 0.0983, "temperature": 24.0}, {"label": "25\\u00b0C or higher", "market_price": 0.0125, "model_prob": 0.0295, "edge": 0.017, "temperature": 25.0}]', '24°C', 0.027, 0.12527874634663994, 0.09827874634663994, 'SKIP:low_price(0.03)', '{"weather_model": "ecmwf_ifs025", "ecmwf_max": 22.3, "ecmwf_min": 9.6, "sigma": 1.5, "skip_reason": "low_price(0.03)"}')]
(Background on this error at: https://sqlalche.me/e/20/gkpj)
2026-04-24 15:52:08,736 INFO src.infrastructure.weather_client — ECMWF forecast for Madrid on 2026-04-26: max=24.4°C min=10.9°C
2026-04-24 15:52:08,736 INFO src.usecases.calculate_edge — Calculating edge for Madrid (2026-04-26) | pred=24.4°C
2026-04-24 15:52:08,758 ERROR database — DB Write Error (MarketScanORM): (pymysql.err.IntegrityError) (1062, "Duplicate entry '411994-2026-04-24' for key 'market_scans_v2.uq_market_scan_date'")
[SQL: INSERT INTO market_scans_v2 (created_at, created_at_date, city, target_date, market_id, question, hours_to_res, ecmwf_max, ecmwf_min, sigma_used, outcomes_json, best_outcome, best_price, best_prob, best_edge, decision, model_metadata) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)]
[parameters: (datetime.datetime(2026, 4, 24, 15, 52, 8, 739974), datetime.date(2026, 4, 24), 'Madrid', datetime.date(2026, 4, 26), '411994', 'Highest temperature in Madrid on April 26?', 56.13305091777777, 24.4, 10.9, 1.5, '[{"label": "20\\u00b0C or below", "market_price": 0.004, "model_prob": 0.0006, "edge": -0.0034, "temperature": 20.0}, {"label": "21\\u00b0C", "market ... (902 characters truncated) ... ge": -0.0132, "temperature": 29.0}, {"label": "30\\u00b0C or higher", "market_price": 0.014, "model_prob": 0.0, "edge": -0.014, "temperature": 30.0}]', '24°C', 0.0355, 0.3065793994757543, 0.2710793994757543, 'SKIP:low_price(0.04)', '{"weather_model": "ecmwf_ifs025", "ecmwf_max": 24.4, "ecmwf_min": 10.9, "sigma": 1.5, "skip_reason": "low_price(0.04)"}')]
(Background on this error at: https://sqlalche.me/e/20/gkpj)
2026-04-24 15:52:08,927 INFO src.infrastructure.weather_client — ECMWF forecast for Chicago on 2026-04-26: max=13.5°C min=6.5°C
2026-04-24 15:52:08,928 INFO src.usecases.calculate_edge — Calculating edge for Chicago (2026-04-26) | pred=13.5°C
2026-04-24 15:52:08,945 ERROR database — DB Write Error (MarketScanORM): (pymysql.err.IntegrityError) (1062, "Duplicate entry '411983-2026-04-24' for key 'market_scans_v2.uq_market_scan_date'")
[SQL: INSERT INTO market_scans_v2 (created_at, created_at_date, city, target_date, market_id, question, hours_to_res, ecmwf_max, ecmwf_min, sigma_used, outcomes_json, best_outcome, best_price, best_prob, best_edge, decision, model_metadata) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)]
[parameters: (datetime.datetime(2026, 4, 24, 15, 52, 8, 931075), datetime.date(2026, 4, 24), 'Chicago', datetime.date(2026, 4, 26), '411983', 'Highest temperature in Chicago on April 26?', 56.13305091777777, 13.5, 6.5, 1.5, '[{"label": "65\\u00b0F or below", "market_price": 0.875, "model_prob": 0.0001, "edge": -0.8749, "temperature": 18.333333333333332}, {"label": "66-67\ ... (1045 characters truncated) ...  27.77777777777778}, {"label": "84\\u00b0F or higher", "market_price": 0.0045, "model_prob": 0.0, "edge": -0.0045, "temperature": 28.88888888888889}]', '76-77°F', 0.0045, 0.0, -0.0045, 'SKIP:low_edge(-0.004)', '{"weather_model": "ecmwf_ifs025", "ecmwf_max": 13.5, "ecmwf_min": 6.5, "sigma": 1.5, "skip_reason": "low_edge(-0.004)"}')]
(Background on this error at: https://sqlalche.me/e/20/gkpj)
2026-04-24 15:52:09,112 INFO src.infrastructure.weather_client — ECMWF forecast for Miami on 2026-04-26: max=28.3°C min=22.5°C
2026-04-24 15:52:09,113 INFO src.usecases.calculate_edge — Calculating edge for Miami (2026-04-26) | pred=28.3°C
2026-04-24 15:52:09,123 INFO run_cycle — Cycle finished in 8106ms. Found 5 signals.
2026-04-24 15:52:09,140 ERROR database — DB Write Error (MarketScanORM): (pymysql.err.IntegrityError) (1062, "Duplicate entry '411982-2026-04-24' for key 'market_scans_v2.uq_market_scan_date'")
[SQL: INSERT INTO market_scans_v2 (created_at, created_at_date, city, target_date, market_id, question, hours_to_res, ecmwf_max, ecmwf_min, sigma_used, outcomes_json, best_outcome, best_price, best_prob, best_edge, decision, model_metadata) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)]
[parameters: (datetime.datetime(2026, 4, 24, 15, 52, 9, 115934), datetime.date(2026, 4, 24), 'Miami', datetime.date(2026, 4, 26), '411982', 'Highest temperature in Miami on April 26?', 56.13305091777777, 28.3, 22.5, 1.5, '[{"label": "73\\u00b0F or below", "market_price": 0.003, "model_prob": 0.0, "edge": -0.003, "temperature": 22.77777777777778}, {"label": "74-75\\u00b ... (1066 characters truncated) ... .22222222222222}, {"label": "92\\u00b0F or higher", "market_price": 0.007, "model_prob": 0.0001, "edge": -0.0069, "temperature": 33.333333333333336}]', '82-83°F', 0.175, 0.29546444069429745, 0.12046444069429746, 'SIGNAL', '{"weather_model": "ecmwf_ifs025", "ecmwf_max": 28.3, "ecmwf_min": 22.5, "sigma": 1.5, "skip_reason": null}')]
(Background on this error at: https://sqlalche.me/e/20/gkpj)
2026-04-24 15:52:09,388 INFO apscheduler.executors.default — Job "main.<locals>.hourly_job (trigger: interval[1:00:00], next run at: 2026-04-24 16:52:01 UTC)" executed successfully