2026-04-24 17:19:42,796 INFO root — Logging initialized at INFO level. 2026-04-24 17:19:42,796 INFO main — 🌡️ Starting PolyWeatherBot with Dashboard... 2026-04-24 17:19:42,875 INFO database — ✅ Successfully connected to MySQL and schema is ready. 2026-04-24 17:19:42,877 INFO apscheduler.scheduler — Adding job tentatively -- it will be properly scheduled when the scheduler starts 2026-04-24 17:19:42,878 INFO apscheduler.scheduler — Adding job tentatively -- it will be properly scheduled when the scheduler starts 2026-04-24 17:19:42,878 INFO apscheduler.scheduler — Added job "main..hourly_job" to job store "default" 2026-04-24 17:19:42,879 INFO apscheduler.scheduler — Added job "main..resolution_job" to job store "default" 2026-04-24 17:19:42,879 INFO apscheduler.scheduler — Scheduler started 2026-04-24 17:19:42,884 INFO database — DB write worker started. 2026-04-24 17:19:42,885 INFO apscheduler.executors.default — Running job "main..hourly_job (trigger: interval[1:00:00], next run at: 2026-04-24 18:19:42 UTC)" (scheduled at 2026-04-24 17:19:42.877194+00:00) 2026-04-24 17:19:42,885 INFO main — ⏰ Starting scheduled hourly scan... 2026-04-24 17:19:42,894 INFO run_cycle — ═══════════════════════════════════════════ 2026-04-24 17:19:42,894 INFO run_cycle — 🚀 STARTING NEW SCAN CYCLE 2026-04-24 17:19:42,894 INFO run_cycle — ═══════════════════════════════════════════ 2026-04-24 17:19:42,948 INFO src.infrastructure.polymarket_client — ✅ Descubierto: highest-temperature-in-hong-kong-on-april-24-2026 2026-04-24 17:19:42,970 INFO src.infrastructure.polymarket_client — ✅ Descubierto: highest-temperature-in-tokyo-on-april-24-2026 2026-04-24 17:19:42,993 INFO src.infrastructure.polymarket_client — ✅ Descubierto: highest-temperature-in-beijing-on-april-24-2026 2026-04-24 17:19:43,016 INFO src.infrastructure.polymarket_client — ✅ Descubierto: highest-temperature-in-shanghai-on-april-24-2026 2026-04-24 17:19:43,037 INFO src.infrastructure.polymarket_client — ✅ Descubierto: highest-temperature-in-seoul-on-april-24-2026 2026-04-24 17:19:43,060 INFO src.infrastructure.polymarket_client — ✅ Descubierto: highest-temperature-in-singapore-on-april-24-2026 2026-04-24 17:19:43,087 INFO src.infrastructure.polymarket_client — ✅ Descubierto: highest-temperature-in-taipei-on-april-24-2026 2026-04-24 17:19:43,110 INFO src.infrastructure.polymarket_client — ✅ Descubierto: highest-temperature-in-london-on-april-24-2026 2026-04-24 17:19:43,132 INFO src.infrastructure.polymarket_client — ✅ Descubierto: highest-temperature-in-paris-on-april-24-2026 2026-04-24 17:19:43,215 INFO src.infrastructure.polymarket_client — ✅ Descubierto: highest-temperature-in-madrid-on-april-24-2026 2026-04-24 17:19:43,314 INFO src.infrastructure.polymarket_client — ✅ Descubierto: highest-temperature-in-chicago-on-april-24-2026 2026-04-24 17:19:43,336 INFO src.infrastructure.polymarket_client — ✅ Descubierto: highest-temperature-in-miami-on-april-24-2026 2026-04-24 17:19:43,360 INFO src.infrastructure.polymarket_client — ✅ Descubierto: highest-temperature-in-hong-kong-on-april-25-2026 2026-04-24 17:19:43,385 INFO src.infrastructure.polymarket_client — ✅ Descubierto: highest-temperature-in-tokyo-on-april-25-2026 2026-04-24 17:19:43,411 INFO src.infrastructure.polymarket_client — ✅ Descubierto: highest-temperature-in-beijing-on-april-25-2026 2026-04-24 17:19:43,437 INFO src.infrastructure.polymarket_client — ✅ Descubierto: highest-temperature-in-shanghai-on-april-25-2026 2026-04-24 17:19:43,463 INFO src.infrastructure.polymarket_client — ✅ Descubierto: highest-temperature-in-seoul-on-april-25-2026 2026-04-24 17:19:43,488 INFO src.infrastructure.polymarket_client — ✅ Descubierto: highest-temperature-in-singapore-on-april-25-2026 2026-04-24 17:19:43,515 INFO src.infrastructure.polymarket_client — ✅ Descubierto: highest-temperature-in-taipei-on-april-25-2026 2026-04-24 17:19:43,539 INFO src.infrastructure.polymarket_client — ✅ Descubierto: highest-temperature-in-london-on-april-25-2026 2026-04-24 17:19:43,564 INFO src.infrastructure.polymarket_client — ✅ Descubierto: highest-temperature-in-paris-on-april-25-2026 2026-04-24 17:19:43,608 INFO src.infrastructure.polymarket_client — ✅ Descubierto: highest-temperature-in-madrid-on-april-25-2026 2026-04-24 17:19:43,674 INFO src.infrastructure.polymarket_client — ✅ Descubierto: highest-temperature-in-chicago-on-april-25-2026 2026-04-24 17:19:43,700 INFO src.infrastructure.polymarket_client — ✅ Descubierto: highest-temperature-in-miami-on-april-25-2026 2026-04-24 17:19:43,725 INFO src.infrastructure.polymarket_client — ✅ Descubierto: highest-temperature-in-hong-kong-on-april-26-2026 2026-04-24 17:19:43,751 INFO src.infrastructure.polymarket_client — ✅ Descubierto: highest-temperature-in-tokyo-on-april-26-2026 2026-04-24 17:19:43,777 INFO src.infrastructure.polymarket_client — ✅ Descubierto: highest-temperature-in-beijing-on-april-26-2026 2026-04-24 17:19:43,801 INFO src.infrastructure.polymarket_client — ✅ Descubierto: highest-temperature-in-shanghai-on-april-26-2026 2026-04-24 17:19:43,824 INFO src.infrastructure.polymarket_client — ✅ Descubierto: highest-temperature-in-seoul-on-april-26-2026 2026-04-24 17:19:43,847 INFO src.infrastructure.polymarket_client — ✅ Descubierto: highest-temperature-in-singapore-on-april-26-2026 2026-04-24 17:19:43,902 INFO src.infrastructure.polymarket_client — ✅ Descubierto: highest-temperature-in-taipei-on-april-26-2026 2026-04-24 17:19:43,925 INFO src.infrastructure.polymarket_client — ✅ Descubierto: highest-temperature-in-london-on-april-26-2026 2026-04-24 17:19:43,948 INFO src.infrastructure.polymarket_client — ✅ Descubierto: highest-temperature-in-paris-on-april-26-2026 2026-04-24 17:19:44,022 INFO src.infrastructure.polymarket_client — ✅ Descubierto: highest-temperature-in-madrid-on-april-26-2026 2026-04-24 17:19:44,121 INFO src.infrastructure.polymarket_client — ✅ Descubierto: highest-temperature-in-chicago-on-april-26-2026 2026-04-24 17:19:44,145 INFO src.infrastructure.polymarket_client — ✅ Descubierto: highest-temperature-in-miami-on-april-26-2026 2026-04-24 17:19:44,145 INFO src.infrastructure.polymarket_client — Total temperature events discovered: 36 2026-04-24 17:19:44,332 INFO src.infrastructure.weather_client — ECMWF forecast for Hong Kong on 2026-04-24: max=20.3°C min=18.8°C 2026-04-24 17:19:44,332 INFO src.usecases.calculate_edge — Calculating edge for Hong Kong (2026-04-24) | pred=20.3°C 2026-04-24 17:19:44,352 ERROR database — DB Write Error (MarketScanORM): (pymysql.err.IntegrityError) (1062, "Duplicate entry '405205-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, 17, 19, 44, 335101), datetime.date(2026, 4, 24), 'Hong Kong', datetime.date(2026, 4, 24), '405205', 'Highest temperature in Hong Kong on April 24?', 6.671418098888889, 20.3, 18.8, 1.5, '[{"label": "18\\u00b0C or below", "market_price": 0.0005, "model_prob": 0.057, "edge": 0.0565, "temperature": 18.0}, {"label": "19\\u00b0C", "market_ ... (899 characters truncated) ... ": -0.0005, "temperature": 27.0}, {"label": "28\\u00b0C or higher", "market_price": 0.0005, "model_prob": 0.0, "edge": -0.0005, "temperature": 28.0}]', '20°C', 0.001, 0.31369129506398075, 0.31269129506398075, 'SKIP:low_price(0.00)', '{"weather_model": "ecmwf_ifs025", "ecmwf_max": 20.3, "ecmwf_min": 18.8, "sigma": 1.5, "skip_reason": "low_price(0.00)"}')] (Background on this error at: https://sqlalche.me/e/20/gkpj) 2026-04-24 17:19:44,522 INFO src.infrastructure.weather_client — ECMWF forecast for Tokyo on 2026-04-24: max=18.3°C min=10.1°C 2026-04-24 17:19:44,523 INFO src.usecases.calculate_edge — Calculating edge for Tokyo (2026-04-24) | pred=18.3°C 2026-04-24 17:19:44,538 ERROR database — DB Write Error (MarketScanORM): (pymysql.err.IntegrityError) (1062, "Duplicate entry '405204-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, 17, 19, 44, 527031), datetime.date(2026, 4, 24), 'Tokyo', datetime.date(2026, 4, 24), '405204', 'Highest temperature in Tokyo on April 24?', 6.671418098888889, 18.3, 10.1, 1.5, '[{"label": "14\\u00b0C or below", "market_price": 0.0, "model_prob": 0.0007, "edge": 0.0007, "temperature": 14.0}, {"label": "15\\u00b0C", "market_pr ... (892 characters truncated) ... ": -0.0003, "temperature": 23.0}, {"label": "24\\u00b0C or higher", "market_price": 0.0005, "model_prob": 0.0, "edge": -0.0005, "temperature": 24.0}]', '19°C', 0.0005, 0.2751609134576394, 0.2746609134576394, 'SKIP:low_price(0.00)', '{"weather_model": "ecmwf_ifs025", "ecmwf_max": 18.3, "ecmwf_min": 10.1, "sigma": 1.5, "skip_reason": "low_price(0.00)"}')] (Background on this error at: https://sqlalche.me/e/20/gkpj) 2026-04-24 17:19:44,718 INFO src.infrastructure.weather_client — ECMWF forecast for Beijing on 2026-04-24: max=24.6°C min=13.8°C 2026-04-24 17:19:44,719 INFO src.usecases.calculate_edge — Calculating edge for Beijing (2026-04-24) | pred=24.6°C 2026-04-24 17:19:44,737 ERROR database — DB Write Error (MarketScanORM): (pymysql.err.IntegrityError) (1062, "Duplicate entry '405213-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, 17, 19, 44, 722810), datetime.date(2026, 4, 24), 'Beijing', datetime.date(2026, 4, 24), '405213', 'Highest temperature in Beijing on April 24?', 6.671418098888889, 24.6, 13.8, 1.5, '[{"label": "22\\u00b0C or below", "market_price": 0.0, "model_prob": 0.0352, "edge": 0.0352, "temperature": 22.0}, {"label": "23\\u00b0C", "market_pr ... (896 characters truncated) ... ": -0.0005, "temperature": 31.0}, {"label": "32\\u00b0C or higher", "market_price": 0.0005, "model_prob": 0.0, "edge": -0.0005, "temperature": 32.0}]', '25°C', 0.0005, 0.3065793994757543, 0.3060793994757543, 'SKIP:low_price(0.00)', '{"weather_model": "ecmwf_ifs025", "ecmwf_max": 24.6, "ecmwf_min": 13.8, "sigma": 1.5, "skip_reason": "low_price(0.00)"}')] (Background on this error at: https://sqlalche.me/e/20/gkpj) 2026-04-24 17:19:44,917 INFO src.infrastructure.weather_client — ECMWF forecast for Shanghai on 2026-04-24: max=20.3°C min=11.4°C 2026-04-24 17:19:44,917 INFO src.usecases.calculate_edge — Calculating edge for Shanghai (2026-04-24) | pred=20.3°C 2026-04-24 17:19:44,936 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, 17, 19, 44, 920575), datetime.date(2026, 4, 24), 'Shanghai', datetime.date(2026, 4, 24), '405206', 'Highest temperature in Shanghai on April 24?', 6.671418098888889, 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 17:19:45,101 INFO src.infrastructure.weather_client — ECMWF forecast for Seoul on 2026-04-24: max=24.9°C min=9.6°C 2026-04-24 17:19:45,102 INFO src.usecases.calculate_edge — Calculating edge for Seoul (2026-04-24) | pred=24.9°C 2026-04-24 17:19:45,115 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, 17, 19, 45, 104650), datetime.date(2026, 4, 24), 'Seoul', datetime.date(2026, 4, 24), '405191', 'Highest temperature in Seoul on April 24?', 6.671418098888889, 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 17:19:45,292 INFO src.infrastructure.weather_client — ECMWF forecast for Singapore on 2026-04-24: max=30.7°C min=25.1°C 2026-04-24 17:19:45,292 INFO src.usecases.calculate_edge — Calculating edge for Singapore (2026-04-24) | pred=30.7°C 2026-04-24 17:19:45,305 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, 17, 19, 45, 294892), datetime.date(2026, 4, 24), 'Singapore', datetime.date(2026, 4, 24), '405207', 'Highest temperature in Singapore on April 24?', 6.671418098888889, 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 17:19:45,471 INFO src.infrastructure.weather_client — ECMWF forecast for Taipei on 2026-04-24: max=21.6°C min=17.9°C 2026-04-24 17:19:45,472 INFO src.usecases.calculate_edge — Calculating edge for Taipei (2026-04-24) | pred=21.6°C 2026-04-24 17:19:45,489 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, 17, 19, 45, 474443), datetime.date(2026, 4, 24), 'Taipei', datetime.date(2026, 4, 24), '405211', 'Highest temperature in Taipei on April 24?', 6.671418098888889, 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 17:19:45,658 INFO src.infrastructure.weather_client — ECMWF forecast for London on 2026-04-24: max=19.4°C min=4.5°C 2026-04-24 17:19:45,659 INFO src.usecases.calculate_edge — Calculating edge for London (2026-04-24) | pred=19.4°C 2026-04-24 17:19:45,672 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, 17, 19, 45, 661642), datetime.date(2026, 4, 24), 'London', datetime.date(2026, 4, 24), '405187', 'Highest temperature in London on April 24?', 6.671418098888889, 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": ... (878 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.004, 0.3065793994757543, 0.3025793994757543, 'SKIP:low_price(0.00)', '{"weather_model": "ecmwf_ifs025", "ecmwf_max": 19.4, "ecmwf_min": 4.5, "sigma": 1.5, "skip_reason": "low_price(0.00)"}')] (Background on this error at: https://sqlalche.me/e/20/gkpj) 2026-04-24 17:19:45,853 INFO src.infrastructure.weather_client — ECMWF forecast for Paris on 2026-04-24: max=23.1°C min=9.4°C 2026-04-24 17:19:45,854 INFO src.usecases.calculate_edge — Calculating edge for Paris (2026-04-24) | pred=23.1°C 2026-04-24 17:19:45,876 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, 17, 19, 45, 858331), datetime.date(2026, 4, 24), 'Paris', datetime.date(2026, 4, 24), '405188', 'Highest temperature in Paris on April 24?', 6.671418098888889, 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": ... (868 characters truncated) ... : 0.2463, "temperature": 24.0}, {"label": "25\\u00b0C or higher", "market_price": 0.0025, "model_prob": 0.0989, "edge": 0.0964, "temperature": 25.0}]', '24°C', 0.0015, 0.24776883560738272, 0.24626883560738272, 'SKIP:low_price(0.00)', '{"weather_model": "ecmwf_ifs025", "ecmwf_max": 23.1, "ecmwf_min": 9.4, "sigma": 1.5, "skip_reason": "low_price(0.00)"}')] (Background on this error at: https://sqlalche.me/e/20/gkpj) 2026-04-24 17:19:46,061 INFO src.infrastructure.weather_client — ECMWF forecast for Madrid on 2026-04-24: max=23.0°C min=12.6°C 2026-04-24 17:19:46,062 INFO src.usecases.calculate_edge — Calculating edge for Madrid (2026-04-24) | pred=23.0°C 2026-04-24 17:19:46,084 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, 17, 19, 46, 65993), datetime.date(2026, 4, 24), 'Madrid', datetime.date(2026, 4, 24), '405209', 'Highest temperature in Madrid on April 24?', 6.671418098888889, 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}]', '23°C', 0.0255, 0.3230777609786207, 0.29757776097862065, 'SKIP:low_price(0.03)', '{"weather_model": "ecmwf_ifs025", "ecmwf_max": 23.0, "ecmwf_min": 12.6, "sigma": 1.5, "skip_reason": "low_price(0.03)"}')] (Background on this error at: https://sqlalche.me/e/20/gkpj) 2026-04-24 17:19:46,262 INFO src.infrastructure.weather_client — ECMWF forecast for Chicago on 2026-04-24: max=22.8°C min=16.8°C 2026-04-24 17:19:46,262 INFO src.usecases.calculate_edge — Calculating edge for Chicago (2026-04-24) | pred=22.8°C 2026-04-24 17:19:46,276 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, 17, 19, 46, 265039), datetime.date(2026, 4, 24), 'Chicago', datetime.date(2026, 4, 24), '405198', 'Highest temperature in Chicago on April 24?', 6.671418098888889, 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.023, "model_prob": 0.1332, "edge": 0.1102, "temperature": 24.444444444444443}]', '74-75°F', 0.065, 0.29433126985631497, 0.22933126985631497, 'SKIP:low_price(0.07)', '{"weather_model": "ecmwf_ifs025", "ecmwf_max": 22.8, "ecmwf_min": 16.8, "sigma": 1.5, "skip_reason": "low_price(0.07)"}')] (Background on this error at: https://sqlalche.me/e/20/gkpj) 2026-04-24 17:19:46,443 INFO src.infrastructure.weather_client — ECMWF forecast for Miami on 2026-04-24: max=25.4°C min=21.5°C 2026-04-24 17:19:46,443 INFO src.usecases.calculate_edge — Calculating edge for Miami (2026-04-24) | pred=25.4°C 2026-04-24 17:19:46,460 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, 17, 19, 46, 446331), datetime.date(2026, 4, 24), 'Miami', datetime.date(2026, 4, 24), '405197', 'Highest temperature in Miami on April 24?', 6.671418098888889, 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.0005, "model_prob": 0.0, "edge": -0.0005, "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 17:19:46,629 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 17:19:46,629 INFO src.usecases.calculate_edge — Calculating edge for Hong Kong (2026-04-25) | pred=26.0°C 2026-04-24 17:19:46,641 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, 17, 19, 46, 631979), datetime.date(2026, 4, 24), 'Hong Kong', datetime.date(2026, 4, 25), '408592', 'Highest temperature in Hong Kong on April 25?', 30.67141809888889, 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 ... (900 characters truncated) ... e": 0.072, "temperature": 28.0}, {"label": "29\\u00b0C or higher", "market_price": 0.003, "model_prob": 0.0168, "edge": 0.0138, "temperature": 29.0}]', '27°C', 0.0485, 0.23281134584383434, 0.18431134584383435, '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 17:19:46,811 INFO src.infrastructure.weather_client — ECMWF forecast for Tokyo on 2026-04-25: max=17.7°C min=9.0°C 2026-04-24 17:19:46,811 INFO src.usecases.calculate_edge — Calculating edge for Tokyo (2026-04-25) | pred=17.7°C 2026-04-24 17:19:46,828 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, 17, 19, 46, 814372), datetime.date(2026, 4, 24), 'Tokyo', datetime.date(2026, 4, 25), '408591', 'Highest temperature in Tokyo on April 25?', 30.67141809888889, 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 ... (906 characters truncated) ... -0.0045, "temperature": 21.0}, {"label": "22\\u00b0C or higher", "market_price": 0.0045, "model_prob": 0.0007, "edge": -0.0038, "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 17:19:46,996 INFO src.infrastructure.weather_client — ECMWF forecast for Beijing on 2026-04-25: max=26.8°C min=16.1°C 2026-04-24 17:19:46,997 INFO src.usecases.calculate_edge — Calculating edge for Beijing (2026-04-25) | pred=26.8°C 2026-04-24 17:19:47,015 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, 17, 19, 46, 999806), datetime.date(2026, 4, 24), 'Beijing', datetime.date(2026, 4, 25), '408600', 'Highest temperature in Beijing on April 25?', 30.67141809888889, 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 ... (899 characters truncated) ... ": -0.0035, "temperature": 32.0}, {"label": "33\\u00b0C or higher", "market_price": 0.0015, "model_prob": 0.0, "edge": -0.0015, "temperature": 33.0}]', '26°C', 0.095, 0.2619634268674541, 0.1669634268674541, 'SKIP:low_price(0.10)', '{"weather_model": "ecmwf_ifs025", "ecmwf_max": 26.8, "ecmwf_min": 16.1, "sigma": 1.5, "skip_reason": "low_price(0.10)"}')] (Background on this error at: https://sqlalche.me/e/20/gkpj) 2026-04-24 17:19:47,192 INFO src.infrastructure.weather_client — ECMWF forecast for Shanghai on 2026-04-25: max=21.1°C min=10.9°C 2026-04-24 17:19:47,193 INFO src.usecases.calculate_edge — Calculating edge for Shanghai (2026-04-25) | pred=21.1°C 2026-04-24 17:19:47,206 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, 17, 19, 47, 195535), datetime.date(2026, 4, 24), 'Shanghai', datetime.date(2026, 4, 25), '408593', 'Highest temperature in Shanghai on April 25?', 30.67141809888889, 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 ... (899 characters truncated) ... : 0.0479, "temperature": 23.0}, {"label": "24\\u00b0C or higher", "market_price": 0.0105, "model_prob": 0.0204, "edge": 0.0099, "temperature": 24.0}]', '23°C', 0.051, 0.09892237262620207, 0.047922372626202074, 'SKIP:low_edge(0.048)', '{"weather_model": "ecmwf_ifs025", "ecmwf_max": 21.1, "ecmwf_min": 10.9, "sigma": 1.5, "skip_reason": "low_edge(0.048)"}')] (Background on this error at: https://sqlalche.me/e/20/gkpj) 2026-04-24 17:19:47,376 INFO src.infrastructure.weather_client — ECMWF forecast for Seoul on 2026-04-25: max=26.5°C min=10.0°C 2026-04-24 17:19:47,376 INFO src.usecases.calculate_edge — Calculating edge for Seoul (2026-04-25) | pred=26.5°C 2026-04-24 17:19:47,397 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, 17, 19, 47, 380250), datetime.date(2026, 4, 24), 'Seoul', datetime.date(2026, 4, 25), '408578', 'Highest temperature in Seoul on April 25?', 30.67141809888889, 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) ... edge": -0.12, "temperature": 20.0}, {"label": "21\\u00b0C or higher", "market_price": 0.845, "model_prob": 0.0, "edge": -0.845, "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 17:19:47,567 INFO src.infrastructure.weather_client — ECMWF forecast for Singapore on 2026-04-25: max=30.0°C min=24.8°C 2026-04-24 17:19:47,567 INFO src.usecases.calculate_edge — Calculating edge for Singapore (2026-04-25) | pred=30.0°C 2026-04-24 17:19:47,584 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, 17, 19, 47, 569857), datetime.date(2026, 4, 24), 'Singapore', datetime.date(2026, 4, 25), '408594', 'Highest temperature in Singapore on April 25?', 30.67141809888889, 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 ... (903 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.023, 0.3230777609786207, 0.30007776097862066, 'SKIP:low_price(0.02)', '{"weather_model": "ecmwf_ifs025", "ecmwf_max": 30.0, "ecmwf_min": 24.8, "sigma": 1.5, "skip_reason": "low_price(0.02)"}')] (Background on this error at: https://sqlalche.me/e/20/gkpj) 2026-04-24 17:19:47,761 INFO src.infrastructure.weather_client — ECMWF forecast for Taipei on 2026-04-25: max=23.0°C min=17.9°C 2026-04-24 17:19:47,761 INFO src.usecases.calculate_edge — Calculating edge for Taipei (2026-04-25) | pred=23.0°C 2026-04-24 17:19:47,774 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, 17, 19, 47, 763938), datetime.date(2026, 4, 24), 'Taipei', datetime.date(2026, 4, 25), '408598', 'Highest temperature in Taipei on April 25?', 30.67141809888889, 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) ... dge": 0.1378, "temperature": 24.0}, {"label": "25\\u00b0C or higher", "market_price": 0.047, "model_prob": 0.087, "edge": 0.04, "temperature": 25.0}]', '24°C', 0.095, 0.23281134584383434, 0.13781134584383434, 'SKIP:low_price(0.10)', '{"weather_model": "ecmwf_ifs025", "ecmwf_max": 23.0, "ecmwf_min": 17.9, "sigma": 1.5, "skip_reason": "low_price(0.10)"}')] (Background on this error at: https://sqlalche.me/e/20/gkpj) 2026-04-24 17:19:47,951 INFO src.infrastructure.weather_client — ECMWF forecast for London on 2026-04-25: max=21.1°C min=5.4°C 2026-04-24 17:19:47,951 INFO src.usecases.calculate_edge — Calculating edge for London (2026-04-25) | pred=21.1°C 2026-04-24 17:19:47,974 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, 17, 19, 47, 955197), datetime.date(2026, 4, 24), 'London', datetime.date(2026, 4, 25), '408574', 'Highest temperature in London on April 25?', 30.67141809888889, 21.1, 5.4, 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 ... (906 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.0725, 0.24776883560738272, 0.1752688356073827, 'SKIP:low_price(0.07)', '{"weather_model": "ecmwf_ifs025", "ecmwf_max": 21.1, "ecmwf_min": 5.4, "sigma": 1.5, "skip_reason": "low_price(0.07)"}')] (Background on this error at: https://sqlalche.me/e/20/gkpj) 2026-04-24 17:19:48,140 INFO src.infrastructure.weather_client — ECMWF forecast for Paris on 2026-04-25: max=23.9°C min=8.6°C 2026-04-24 17:19:48,141 INFO src.usecases.calculate_edge — Calculating edge for Paris (2026-04-25) | pred=23.9°C 2026-04-24 17:19:48,161 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, 17, 19, 48, 144984), datetime.date(2026, 4, 24), 'Paris', datetime.date(2026, 4, 25), '408575', 'Highest temperature in Paris on April 25?', 30.67141809888889, 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 ... (898 characters truncated) ... e": 0.277, "temperature": 24.0}, {"label": "25\\u00b0C or higher", "market_price": 0.011, "model_prob": 0.2173, "edge": 0.2063, "temperature": 25.0}]', '24°C', 0.045, 0.32202112109224945, 0.27702112109224947, 'SKIP:low_price(0.04)', '{"weather_model": "ecmwf_ifs025", "ecmwf_max": 23.9, "ecmwf_min": 8.6, "sigma": 1.5, "skip_reason": "low_price(0.04)"}')] (Background on this error at: https://sqlalche.me/e/20/gkpj) 2026-04-24 17:19:48,331 INFO src.infrastructure.weather_client — ECMWF forecast for Madrid on 2026-04-25: max=22.9°C min=12.9°C 2026-04-24 17:19:48,331 INFO src.usecases.calculate_edge — Calculating edge for Madrid (2026-04-25) | pred=22.9°C 2026-04-24 17:19:48,344 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, 17, 19, 48, 333639), datetime.date(2026, 4, 24), 'Madrid', datetime.date(2026, 4, 25), '408596', 'Highest temperature in Madrid on April 25?', 30.67141809888889, 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 ... (908 characters truncated) ... -0.0047, "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.095, 0.24776883560738272, 0.15276883560738272, 'SKIP:low_price(0.10)', '{"weather_model": "ecmwf_ifs025", "ecmwf_max": 22.9, "ecmwf_min": 12.9, "sigma": 1.5, "skip_reason": "low_price(0.10)"}')] (Background on this error at: https://sqlalche.me/e/20/gkpj) 2026-04-24 17:19:48,521 INFO src.infrastructure.weather_client — ECMWF forecast for Chicago on 2026-04-25: max=19.3°C min=6.5°C 2026-04-24 17:19:48,521 INFO src.usecases.calculate_edge — Calculating edge for Chicago (2026-04-25) | pred=19.3°C 2026-04-24 17:19:48,541 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, 17, 19, 48, 523968), datetime.date(2026, 4, 24), 'Chicago', datetime.date(2026, 4, 25), '408585', 'Highest temperature in Chicago on April 25?', 30.67141809888889, 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 ... (1047 characters truncated) ... 555555555555555}, {"label": "62\\u00b0F or higher", "market_price": 0.215, "model_prob": 0.0332, "edge": -0.1818, "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 17:19:48,718 INFO src.infrastructure.weather_client — ECMWF forecast for Miami on 2026-04-25: max=27.8°C min=21.2°C 2026-04-24 17:19:48,719 INFO src.usecases.calculate_edge — Calculating edge for Miami (2026-04-25) | pred=27.8°C 2026-04-24 17:19:48,736 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, 17, 19, 48, 722700), datetime.date(2026, 4, 24), 'Miami', datetime.date(2026, 4, 25), '408584', 'Highest temperature in Miami on April 25?', 30.67141809888889, 27.8, 21.2, 1.5, '[{"label": "73\\u00b0F or below", "market_price": 0.0035, "model_prob": 0.0001, "edge": -0.0034, "temperature": 22.77777777777778}, {"label": "74-75\ ... (1063 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.115, 0.21208750189204323, 0.09708750189204322, 'SKIP:low_price(0.12)', '{"weather_model": "ecmwf_ifs025", "ecmwf_max": 27.8, "ecmwf_min": 21.2, "sigma": 1.5, "skip_reason": "low_price(0.12)"}')] (Background on this error at: https://sqlalche.me/e/20/gkpj) 2026-04-24 17:19:48,904 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 17:19:48,905 INFO src.usecases.calculate_edge — Calculating edge for Hong Kong (2026-04-26) | pred=26.3°C 2026-04-24 17:19:48,999 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, 17, 19, 48, 907654), datetime.date(2026, 4, 24), 'Hong Kong', datetime.date(2026, 4, 26), '411990', 'Highest temperature in Hong Kong on April 26?', 54.67141809888889, 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 ... (898 characters truncated) ... : -0.0955, "temperature": 29.0}, {"label": "30\\u00b0C or higher", "market_price": 0.06, "model_prob": 0.0036, "edge": -0.0564, "temperature": 30.0}]', '26°C', 0.165, 0.31369129506398075, 0.14869129506398074, '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 17:19:49,440 INFO src.infrastructure.weather_client — ECMWF forecast for Tokyo on 2026-04-26: max=19.1°C min=12.1°C 2026-04-24 17:19:49,441 INFO src.usecases.calculate_edge — Calculating edge for Tokyo (2026-04-26) | pred=19.1°C 2026-04-24 17:19:49,455 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, 17, 19, 49, 443519), datetime.date(2026, 4, 24), 'Tokyo', datetime.date(2026, 4, 26), '411989', 'Highest temperature in Tokyo on April 26?', 54.67141809888889, 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 ... (898 characters truncated) ... -0.0546, "temperature": 22.0}, {"label": "23\\u00b0C or higher", "market_price": 0.0155, "model_prob": 0.0022, "edge": -0.0133, "temperature": 23.0}]', '18°C', 0.07, 0.21732631900011884, 0.14732631900011883, '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 17:19:49,622 INFO src.infrastructure.weather_client — ECMWF forecast for Beijing on 2026-04-26: max=23.5°C min=11.3°C 2026-04-24 17:19:49,622 INFO src.usecases.calculate_edge — Calculating edge for Beijing (2026-04-26) | pred=23.5°C 2026-04-24 17:19:49,649 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, 17, 19, 49, 625192), datetime.date(2026, 4, 24), 'Beijing', datetime.date(2026, 4, 26), '411998', 'Highest temperature in Beijing on April 26?', 54.67141809888889, 23.5, 11.3, 1.5, '[{"label": "20\\u00b0C or below", "market_price": 0.009, "model_prob": 0.0058, "edge": -0.0032, "temperature": 20.0}, {"label": "21\\u00b0C", "market ... (897 characters truncated) ... ge": -0.0085, "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 17:19:50,085 INFO src.infrastructure.weather_client — ECMWF forecast for Shanghai on 2026-04-26: max=23.8°C min=14.6°C 2026-04-24 17:19:50,086 INFO src.usecases.calculate_edge — Calculating edge for Shanghai (2026-04-26) | pred=23.8°C 2026-04-24 17:19:50,111 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, 17, 19, 50, 89967), datetime.date(2026, 4, 24), 'Shanghai', datetime.date(2026, 4, 26), '411991', 'Highest temperature in Shanghai on April 26?', 54.67141809888889, 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 ... (899 characters truncated) ... e": 0.0042, "temperature": 27.0}, {"label": "28\\u00b0C or higher", "market_price": 0.006, "model_prob": 0.001, "edge": -0.005, "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 17:19:50,593 INFO src.infrastructure.weather_client — ECMWF forecast for Seoul on 2026-04-26: max=24.4°C min=10.5°C 2026-04-24 17:19:50,594 INFO src.usecases.calculate_edge — Calculating edge for Seoul (2026-04-26) | pred=24.4°C 2026-04-24 17:19:50,622 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, 17, 19, 50, 597743), datetime.date(2026, 4, 24), 'Seoul', datetime.date(2026, 4, 26), '411976', 'Highest temperature in Seoul on April 26?', 54.67141809888889, 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 ... (881 characters truncated) ... ": -0.13, "temperature": 19.0}, {"label": "20\\u00b0C or higher", "market_price": 0.785, "model_prob": 0.0006, "edge": -0.7844, "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 17:19:50,797 INFO src.infrastructure.weather_client — ECMWF forecast for Singapore on 2026-04-26: max=29.5°C min=24.2°C 2026-04-24 17:19:50,798 INFO src.usecases.calculate_edge — Calculating edge for Singapore (2026-04-26) | pred=29.5°C 2026-04-24 17:19:50,819 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, 17, 19, 50, 801840), datetime.date(2026, 4, 24), 'Singapore', datetime.date(2026, 4, 26), '411992', 'Highest temperature in Singapore on April 26?', 54.67141809888889, 29.5, 24.2, 1.5, '[{"label": "26\\u00b0C or below", "market_price": 0.002, "model_prob": 0.0058, "edge": 0.0038, "temperature": 26.0}, {"label": "27\\u00b0C", "market_ ... (899 characters truncated) ... e": -0.016, "temperature": 35.0}, {"label": "36\\u00b0C or higher", "market_price": 0.0075, "model_prob": 0.0, "edge": -0.0075, "temperature": 36.0}]', '29°C', 0.0155, 0.2976716190363569, 0.2821716190363569, '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 17:19:51,000 INFO src.infrastructure.weather_client — ECMWF forecast for Taipei on 2026-04-26: max=27.6°C min=15.1°C 2026-04-24 17:19:51,001 INFO src.usecases.calculate_edge — Calculating edge for Taipei (2026-04-26) | pred=27.6°C 2026-04-24 17:19:51,022 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, 17, 19, 51, 3764), datetime.date(2026, 4, 24), 'Taipei', datetime.date(2026, 4, 26), '411996', 'Highest temperature in Taipei on April 26?', 54.67141809888889, 27.6, 15.1, 1.5, '[{"label": "23\\u00b0C or below", "market_price": 0.0035, "model_prob": 0.0003, "edge": -0.0032, "temperature": 23.0}, {"label": "24\\u00b0C", "marke ... (900 characters truncated) ... ": -0.0109, "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.18, 0.28713457898259215, 0.10713457898259215, '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 17:19:51,480 INFO src.infrastructure.weather_client — ECMWF forecast for London on 2026-04-26: max=19.4°C min=8.6°C 2026-04-24 17:19:51,481 INFO src.usecases.calculate_edge — Calculating edge for London (2026-04-26) | pred=19.4°C 2026-04-24 17:19:51,501 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, 17, 19, 51, 484731), datetime.date(2026, 4, 24), 'London', datetime.date(2026, 4, 26), '411972', 'Highest temperature in London on April 26?', 54.67141809888889, 19.4, 8.6, 1.5, '[{"label": "12\\u00b0C or below", "market_price": 0.001, "model_prob": 0.0, "edge": -0.001, "temperature": 12.0}, {"label": "13\\u00b0C", "market_pri ... (893 characters truncated) ... ": 0.1331, "temperature": 21.0}, {"label": "22\\u00b0C or higher", "market_price": 0.007, "model_prob": 0.0352, "edge": 0.0282, "temperature": 22.0}]', '20°C', 0.085, 0.2871345789825922, 0.20213457898259218, 'SKIP:low_price(0.09)', '{"weather_model": "ecmwf_ifs025", "ecmwf_max": 19.4, "ecmwf_min": 8.6, "sigma": 1.5, "skip_reason": "low_price(0.09)"}')] (Background on this error at: https://sqlalche.me/e/20/gkpj) 2026-04-24 17:19:51,669 INFO src.infrastructure.weather_client — ECMWF forecast for Paris on 2026-04-26: max=22.3°C min=9.6°C 2026-04-24 17:19:51,670 INFO src.usecases.calculate_edge — Calculating edge for Paris (2026-04-26) | pred=22.3°C 2026-04-24 17:19:51,691 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, 17, 19, 51, 674308), datetime.date(2026, 4, 24), 'Paris', datetime.date(2026, 4, 26), '411973', 'Highest temperature in Paris on April 26?', 54.67141809888889, 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 ... (896 characters truncated) ... ": 0.0898, "temperature": 24.0}, {"label": "25\\u00b0C or higher", "market_price": 0.015, "model_prob": 0.0295, "edge": 0.0145, "temperature": 25.0}]', '24°C', 0.0355, 0.12527874634663994, 0.08977874634663993, 'SKIP:low_price(0.04)', '{"weather_model": "ecmwf_ifs025", "ecmwf_max": 22.3, "ecmwf_min": 9.6, "sigma": 1.5, "skip_reason": "low_price(0.04)"}')] (Background on this error at: https://sqlalche.me/e/20/gkpj) 2026-04-24 17:19:51,861 INFO src.infrastructure.weather_client — ECMWF forecast for Madrid on 2026-04-26: max=24.4°C min=10.9°C 2026-04-24 17:19:51,862 INFO src.usecases.calculate_edge — Calculating edge for Madrid (2026-04-26) | pred=24.4°C 2026-04-24 17:19:51,888 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, 17, 19, 51, 866150), datetime.date(2026, 4, 24), 'Madrid', datetime.date(2026, 4, 26), '411994', 'Highest temperature in Madrid on April 26?', 54.67141809888889, 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 ... (900 characters truncated) ... ": -0.0132, "temperature": 29.0}, {"label": "30\\u00b0C or higher", "market_price": 0.0105, "model_prob": 0.0, "edge": -0.0105, "temperature": 30.0}]', '24°C', 0.036, 0.3065793994757543, 0.2705793994757543, '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 17:19:52,057 INFO src.infrastructure.weather_client — ECMWF forecast for Chicago on 2026-04-26: max=13.5°C min=6.5°C 2026-04-24 17:19:52,057 INFO src.usecases.calculate_edge — Calculating edge for Chicago (2026-04-26) | pred=13.5°C 2026-04-24 17:19:52,071 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, 17, 19, 52, 60311), datetime.date(2026, 4, 24), 'Chicago', datetime.date(2026, 4, 26), '411983', 'Highest temperature in Chicago on April 26?', 54.67141809888889, 13.5, 6.5, 1.5, '[{"label": "65\\u00b0F or below", "market_price": 0.88, "model_prob": 0.0001, "edge": -0.8799, "temperature": 18.333333333333332}, {"label": "66-67\\ ... (1038 characters truncated) ... ": 27.77777777777778}, {"label": "84\\u00b0F or higher", "market_price": 0.005, "model_prob": 0.0, "edge": -0.005, "temperature": 28.88888888888889}]', '78-79°F', 0.004, 0.0, -0.004, '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 17:19:52,300 INFO src.infrastructure.weather_client — ECMWF forecast for Miami on 2026-04-26: max=28.3°C min=22.5°C 2026-04-24 17:19:52,300 INFO src.usecases.calculate_edge — Calculating edge for Miami (2026-04-26) | pred=28.3°C 2026-04-24 17:19:52,322 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, 17, 19, 52, 303308), datetime.date(2026, 4, 24), 'Miami', datetime.date(2026, 4, 26), '411982', 'Highest temperature in Miami on April 26?', 54.67141809888889, 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 ... (1062 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.155, 0.29546444069429745, 0.14046444069429745, '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 17:19:52,604 INFO run_cycle — Cycle finished in 9709ms. Found 5 signals. 2026-04-24 17:19:52,862 INFO apscheduler.executors.default — Job "main..hourly_job (trigger: interval[1:00:00], next run at: 2026-04-24 18:19:42 UTC)" executed successfully