| name | polymarket-weather-trader |
| description | Trade Polymarket weather markets using NOAA (US) and Open-Meteo (international) forecasts via Simmer API. Inspired by gopfan2's weather trading approach. Use when user wants to trade temperature markets, automate weather bets, check forecasts, or run weather-based strategies. |
| metadata | {"author":"Simmer (@simmer_markets)","version":"1.19.1","displayName":"Polymarket Weather Trader","difficulty":"beginner","attribution":"Strategy inspired by gopfan2 (public Polymarket trader — approach referenced, not endorsed)."} |
Polymarket Weather Trader
Trade temperature markets on Polymarket using NOAA forecast data.
This is a template. The default signal is NOAA temperature forecasts — remix it with other weather APIs, different forecast models, or additional market types (precipitation, wind, etc.). The skill handles the plumbing (market discovery, NOAA parsing, trade execution, safeguards). Your agent provides the alpha.
Risk Management
Weather market outcomes are discrete: a temperature bucket ("34-35°F") either matches the actual high on resolution day or it doesn't. The strategy works when the NOAA forecast is more accurate than what the market has priced in.
Test before going live. The skill defaults to paper mode — trades are simulated at real market prices while your USDC stays untouched. Pass --live when you're ready. For a fully virtual sandbox, switch the SDK venue to sim for $SIM-denominated paper trading.
Simmer's server-side risk monitor handles stop-loss and take-profit automatically. Defaults (editable at simmer.markets/dashboard → Settings → Auto Risk Monitor):
- Stop-loss at 20% drawdown from entry
- Take-profit at 50% price
External wallet users: monitors emit alerts via the briefing endpoint — your agent must be running for sells to execute. Managed wallet users: server executes directly.
You can override defaults per-skill in the dashboard.
When to Use This Skill
Use this skill when the user wants to:
- Trade weather markets automatically
- Set up gopfan2-style temperature trading
- Buy low on weather predictions
- Check their weather trading positions
- Configure trading thresholds or locations
What's New in v1.18.1
- SKILL.md rewrite highlighting paper mode (default) and $SIM venue as first-class ways to test the skill before going live.
What's New in v1.18.0
- Autotune config defaults aligned with documented defaults (entry 0.15, exit 0.45, max position $2, sizing 5%).
SIMMER_WEATHER_BINARY_ONLY is now an autotune-exposed tunable — set true to trade only binary yes/no weather markets.
- Autotune ranges for
max_position_usd and sizing_pct tuned to match typical use.
- Risk management documentation clarified: auto-risk monitor handles stop-loss/take-profit at the user level.
What's New in v1.17.0
- Volatility Targeting: Dynamic position sizing based on realized market volatility. Uses EWMA of log returns from price history. High vol → smaller positions, low vol → larger positions. Enable with
--vol-targeting flag or SIMMER_WEATHER_VOL_TARGETING=true.
SIMMER_WEATHER_TARGET_VOL — target annualized vol (default 20%)
SIMMER_WEATHER_VOL_MAX_LEVERAGE — max scale-up multiplier (default 2.0x)
SIMMER_WEATHER_VOL_MIN_ALLOC — min allocation floor (default 20%)
SIMMER_WEATHER_VOL_SPAN — EWMA responsiveness (default 10)
v1.14.0
- Fixed env var names to match autotune registry (old names still work as aliases):
SIMMER_WEATHER_ENTRY → SIMMER_WEATHER_ENTRY_THRESHOLD
SIMMER_WEATHER_EXIT → SIMMER_WEATHER_EXIT_THRESHOLD
SIMMER_WEATHER_MAX_POSITION → SIMMER_WEATHER_MAX_POSITION_USD
SIMMER_WEATHER_MAX_TRADES → SIMMER_WEATHER_MAX_TRADES_PER_RUN
- New tunable:
SIMMER_WEATHER_SLIPPAGE_MAX — adjustable slippage safeguard (default 15%). Set higher for research mode on illiquid markets.
- New tunable:
SIMMER_WEATHER_MIN_LIQUIDITY — skip markets with liquidity below this USD threshold (default 0 = disabled). Pre-filters thin markets before execution.
SIMMER_WEATHER_LOCATIONS and SIMMER_WEATHER_BINARY_ONLY now exposed as autotune tunables.
v1.13.0
- Binary Only Mode: New
SIMMER_WEATHER_BINARY_ONLY config to skip range-bucket events (e.g., "NYC 34-35°F") and only trade binary yes/no weather markets
v1.2.0
- Max Trades Per Run: New
SIMMER_WEATHER_MAX_TRADES config to limit trades per scan cycle (default: 5)
v1.1.1
- Status Script: New
scripts/status.py for quick balance and position checks
- API Reference: Added Quick Commands section with API endpoints
v1.1.0
- Source Tagging: All trades tagged with
sdk:weather for portfolio tracking
- Smart Sizing: Position sizing based on available balance (
--smart-sizing)
- Context Safeguards: Checks for flip-flop warnings, slippage, time decay
- Price Trend Detection: Detects recent price drops for stronger signals
Setup Flow
When user asks to install or configure this skill:
-
Install the Simmer SDK
pip install simmer-sdk
-
Ask for Simmer API key
- They can get it from simmer.markets/dashboard → SDK tab
- Store in environment as
SIMMER_API_KEY
-
Ask for wallet private key (required for live trading)
- This is the private key for their Polymarket wallet (the wallet that holds USDC)
- Store in environment as
WALLET_PRIVATE_KEY
- The SDK uses this to sign orders client-side automatically — no manual signing needed
-
Ask about settings (or confirm defaults)
- Entry threshold: When to buy (default 15¢)
- Exit threshold: When to sell (default 45¢)
- Max position: Amount per trade (default $2.00)
- Locations: Which cities to trade (default NYC)
-
Save settings to environment variables
-
Set up cron (disabled by default — user must enable scheduling)
Configuration
| Setting | Environment Variable | Default | Description |
|---|
| Entry threshold | SIMMER_WEATHER_ENTRY_THRESHOLD | 0.15 | Buy when price below this |
| Exit threshold | SIMMER_WEATHER_EXIT_THRESHOLD | 0.45 | Sell when price above this |
| Max position | SIMMER_WEATHER_MAX_POSITION_USD | 2.00 | Maximum USD per trade |
| Max trades/run | SIMMER_WEATHER_MAX_TRADES_PER_RUN | 5 | Maximum trades per scan cycle |
| Locations | SIMMER_WEATHER_LOCATIONS | NYC | Comma-separated cities (NYC, Chicago, Seattle, Atlanta, Dallas, Miami) |
| Binary only | SIMMER_WEATHER_BINARY_ONLY | false | Skip range-bucket events (e.g., "34-35°F"), only trade binary yes/no markets |
| Smart sizing % | SIMMER_WEATHER_SIZING_PCT | 0.05 | % of balance per trade |
| Slippage max | SIMMER_WEATHER_SLIPPAGE_MAX | 0.15 | Skip trades with slippage above this (0.15 = 15%) |
| Min liquidity | SIMMER_WEATHER_MIN_LIQUIDITY | 0 | Skip markets with liquidity below this USD amount (0 = disabled) |
| Vol targeting | SIMMER_WEATHER_VOL_TARGETING | false | Enable volatility targeting for dynamic position sizing |
| Target vol | SIMMER_WEATHER_TARGET_VOL | 0.20 | Target annualized volatility (0.20 = 20%) |
| Vol max leverage | SIMMER_WEATHER_VOL_MAX_LEVERAGE | 2.0 | Max scale-up multiplier in calm markets |
| Vol min alloc | SIMMER_WEATHER_VOL_MIN_ALLOC | 0.2 | Min allocation floor in volatile markets (0.2 = 20%) |
| Vol EWMA span | SIMMER_WEATHER_VOL_SPAN | 10 | EWMA span for vol calculation (lower = more responsive) |
Legacy env var aliases (still accepted for backwards compatibility): SIMMER_WEATHER_ENTRY, SIMMER_WEATHER_EXIT, SIMMER_WEATHER_MAX_POSITION, SIMMER_WEATHER_MAX_TRADES
Supported locations: NYC, Chicago, Seattle, Atlanta, Dallas, Miami
Quick Commands
python scripts/status.py
python scripts/status.py --positions
API Reference:
- Base URL:
https://api.simmer.markets
- Auth:
Authorization: Bearer $SIMMER_API_KEY
- Portfolio:
GET /api/sdk/portfolio
- Positions:
GET /api/sdk/positions
Running the Skill
python weather_trader.py
python weather_trader.py --live
python weather_trader.py --live --smart-sizing
python weather_trader.py --positions
python weather_trader.py --config
python weather_trader.py --no-safeguards
python weather_trader.py --no-trends
python weather_trader.py --live --smart-sizing --vol-targeting
python weather_trader.py --live --quiet
python weather_trader.py --live --smart-sizing --quiet
How It Works
Each cycle the script:
- Fetches active weather markets from Simmer API
- Groups markets by event (each temperature day is one event)
- Parses event names to get location and date
- Fetches NOAA forecast for that location/date
- Finds the temperature bucket that matches the forecast
- Safeguards: Checks context for flip-flop warnings, slippage, time decay
- Trend Detection: Looks for recent price drops (stronger buy signal)
- Entry: If bucket price < threshold and safeguards pass → BUY
- Exit: Checks open positions, sells if price > exit threshold
- Tagging: All trades tagged with
sdk:weather for tracking
Smart Sizing
With --smart-sizing, position size is calculated as:
- 5% of available USDC balance (configurable via
SIMMER_WEATHER_SIZING_PCT)
- Capped at max position setting ($2.00 default)
- Falls back to fixed size if portfolio unavailable
This prevents over-deployment and scales with your account size.
Volatility Targeting
With --vol-targeting, position sizes are dynamically adjusted based on realized market volatility:
position_size = base_size × clamp(target_vol / realized_vol, min_alloc, max_leverage)
- High volatility (price swinging): positions scale down → less risk
- Low volatility (price stable): positions scale up → more alpha capture
- Falls back to base size if insufficient price history (< 15 data points)
Combines with smart sizing: first calculate base size from portfolio %, then apply the vol multiplier.
Safeguards
Before trading, the skill checks:
- Flip-flop warning: Skips if you've been reversing too much
- Slippage: Skips if estimated slippage > 15%
- Time decay: Skips if market resolves in < 2 hours
- Market status: Skips if market already resolved
Disable with --no-safeguards (not recommended).
Source Tagging
All trades are tagged with source: "sdk:weather". This means:
- Portfolio shows breakdown by strategy
- Copytrading skill won't sell your weather positions
- You can track weather P&L separately
Example Output
🌤️ Simmer Weather Trading Skill
==================================================
⚙️ Configuration:
Entry threshold: 15% (buy below this)
Exit threshold: 45% (sell above this)
Max position: $2.00
Locations: NYC
Smart sizing: ✓ Enabled
Safeguards: ✓ Enabled
Trend detection: ✓ Enabled
💰 Portfolio:
Balance: $150.00
Exposure: $45.00
Positions: 8
📍 NYC 2026-01-28 (high temp)
NOAA forecast: 34°F
Matching bucket: 34-35°F @ $0.12
💡 Smart sizing: $2.00 (capped at max position)
✅ Below threshold ($0.15) - BUY opportunity! 📉 (dropped 15% in 24h)
Executing trade...
✅ Bought 62.5 shares @ $0.12
📊 Summary:
Events scanned: 12
Entry opportunities: 1
Trades executed: 1
Troubleshooting
"Safeguard blocked: Severe flip-flop warning"
- You've been changing direction too much on this market
- Wait before trading again
"Slippage too high"
- Market is illiquid, reduce position size or skip
"Resolves in Xh - too soon"
- Market resolving soon, risk is elevated
"No weather markets found"
- Weather markets may not be active (seasonal)
"External wallet requires a pre-signed order"
WALLET_PRIVATE_KEY is not set in the environment
- The SDK signs orders automatically when this env var is present — no manual signing code needed
- Fix:
export WALLET_PRIVATE_KEY=0x<your-polymarket-wallet-private-key>
- Do NOT attempt to sign orders manually or modify the skill code — the SDK handles it
"Balance shows $0 but I have funds on Polygon"
- Polymarket V2 (live 2026-04-28) uses pUSD (PolyUSD, 1:1 backed by USDC.e). If your wallet holds USDC.e, migrate at simmer.markets/dashboard with one click (~30s)
- If you bridged native USDC (Circle), swap to USDC.e first, then migrate to pUSD
- Full migration guide: docs.simmer.markets/v2-migration
"API key invalid"
- Get new key from simmer.markets/dashboard → SDK tab