HK Weather Prediction Market Pipeline: WeatherNext + HKO + Polymarket

- Open-Meteo WeatherNext API client for HK forecasts
- HKO public data client (current conditions, 9-day forecast, typhoon warnings)
- HK-specific weather extraction and calibration
- Polymarket market scanning, price discovery, and market creation proposals
- Trading strategy engine: edge detection, Kelly criterion sizing, probability calibration
- End-to-end pipeline with dry-run mode and scheduled runner
- Interactive dashboard with live HK weather + forecasts + trading signals

Dependencies: Python 3.10+, openmeteo-requests, pandas
No API keys needed for dry-run mode.
Polymarket trading requires private key in .env.
This commit is contained in:
ramseshk
2026-08-10 12:48:05 +08:00
commit c93af97059
21 changed files with 2497 additions and 0 deletions
+109
View File
@@ -0,0 +1,109 @@
# HK Weather Prediction Market
# Configuration and constants
import os
from pathlib import Path
from dotenv import load_dotenv
load_dotenv()
PROJECT_ROOT = Path(__file__).parent
DATA_DIR = PROJECT_ROOT / "data"
WEIGHTS_DIR = DATA_DIR / "weights"
FORECAST_DIR = DATA_DIR / "forecasts"
for d in [DATA_DIR, WEIGHTS_DIR, FORECAST_DIR]:
d.mkdir(parents=True, exist_ok=True)
# === HK Region Bounding Box ===
HK_BBOX = {
"lat_min": 22.0,
"lat_max": 22.6,
"lon_min": 113.8,
"lon_max": 114.5,
}
HK_COORDS = {
"hko_headquarters": (22.302, 114.174), # Tsim Sha Tsui
"chek_lap_kok": (22.308, 113.918), # Airport
"sheung_shui": (22.505, 114.128), # New Territories
"stanley": (22.218, 114.218), # South side
"cheung_chau": (22.201, 114.028), # Outlying island
}
# === API Keys ===
OPENMETEO_API_KEY = os.getenv("OPENMETEO_API_KEY", "")
POLYMARKET_PRIVATE_KEY = os.getenv("POLYMARKET_PRIVATE_KEY", "")
POLYMARKET_FUNDER = os.getenv("POLYMARKET_FUNDER", "")
HKO_OPEN_DATA_KEY = os.getenv("HKO_OPEN_DATA_KEY", "")
CDSAPI_KEY = os.getenv("CDSAPI_KEY", "")
CDSAPI_URL = os.getenv("CDSAPI_URL", "https://cds.climate.copernicus.eu/api")
# === Polymarket ===
POLYMARKET_GAMMA_API = "https://gamma-api.polymarket.com"
POLYMARKET_CLOB_API = "https://clob.polymarket.com"
POLYMARKET_SOCKET = "wss://ws-subscriptions-clob.polymarket.com/ws"
# === WeatherNext Model ===
MODEL_CONFIGS = {
"mini": {
"name": "WeatherNextCyclones_Mini_<2024",
"weights_file": "WeatherNextCyclones_Mini_<2024.npz",
"resolution": "1°",
"gcs_path": "gs://dm_graphcast/WeatherNextCyclones_Mini_<2024.npz",
"vram_required_gb": 8,
},
"operational": {
"name": "WeatherNext2_<2025",
"resolution": "0.25°",
"gcs_path": "gs://dm_graphcast/WeatherNext2_<2025_model*.npz",
"vram_required_gb": 40,
},
}
MODEL_CONFIG = MODEL_CONFIGS["mini"]
# === Forecast Parameters ===
FORECAST_LEAD_TIMES = [0, 6, 12, 18, 24, 36, 48, 72, 96, 120] # hours
# === Weather Variables of Interest ===
WEATHER_VARIABLES = [
"temperature_2m",
"relative_humidity_2m",
"wind_speed_10m",
"wind_gusts_10m",
"precipitation",
"total_cloud_cover",
"surface_pressure",
]
# === Polymarket Market Conditions ===
# Weather conditions we can create markets for
MARKET_CONDITIONS = {
"rain_tomorrow": {
"description": "Will it rain in Hong Kong tomorrow?",
"threshold": lambda forecast: forecast.get("precipitation_probability", 0) > 50,
"market_type": "binary",
},
"temp_above_30": {
"description": "Will the temperature in Hong Kong exceed 30°C tomorrow?",
"threshold": lambda forecast: forecast.get("temperature_2m_max", 0) > 30.0,
"market_type": "binary",
},
"t8_signal": {
"description": "Will the T8 typhoon signal be hoisted in the next 7 days?",
"threshold": None,
"market_type": "binary",
},
"rainfall_amount": {
"description": "Total rainfall (mm) in Hong Kong tomorrow",
"threshold": None,
"market_type": "scalar",
},
}
# === Trading Strategy ===
MIN_EDGE_BPS = 200 # Minimum edge in basis points to trade
MAX_POSITION_USDC = 500.0 # Maximum position per market in USDC
KELLY_FRACTION = 0.25 # Fraction of full Kelly to use
MIN_LIQUIDITY_USDC = 100.0 # Minimum market liquidity to trade