misterrpink

misterrpink

May 20, 2026 · 6 min read

How to Build a Probability Convergence Chart Using Kalshi Historical Weather Data (VWPA Guide)

Step-by-step guide to building a probability convergence chart for Kalshi weather markets using historical trades, VWPA, and time bucketing in Lychee.

Kalshi weather markets often look noisy in real time.

But when you reconstruct them using historical trade data, a pattern emerges:

Prices don’t move randomly — they converge toward outcomes.

This guide shows you how to build that exact chart.

You will learn how to:

  • connect to the largest Kalshi historical datasets avaiable anywhere
  • pull Kalshi historical market data
  • pull Kalshi historical trade data
  • filter weather markets
  • rank markets by volume
  • reconstruct historical trade activity
  • aggregate trades into 15-minute time buckets
  • compute VWPA - style probability curves using volume weighted average prices.
  • bucket trades into time intervals
  • visualize probability convergence over time
  • build an interactive probability convergence chart

No code required.

No infrastructure.

Just structured market data.

What you are building

You will recreate a chart that shows:

YES probability over time NO probability over time smoothed using VWPA aggregated in 15-minute intervals

This reveals:

how market consensus evolves before settlement

Why this matters

Raw trade data is too noisy to interpret directly.

A single market can have thousands of trades per hour.

So instead of raw ticks, we:

  • smooth price using VWPA
  • aggregate into time buckets
  • reconstruct probability over time

This turns chaotic trading into:

a clean probability convergence curve

Make a request on Kalshi historical data now

You can start pulling weather market and trade data here before walking through each step. Try Markets with a Weather category filter, or search by ticker to load trade history for convergence analysis.

Search Kalshi weather trades now

Filter weather markets, sort by volume, and pull trade data — the same workflow this guide builds step by step below.

Step 1 — Connect to Kalshi Historical Data

Go to Lychee and open:

  • Kalshi Historical Integration

Create API connection screen

Then:

  • Select Markets

Select Markets

  • Choose columns:
    • category: Kalshi meta categories (Sports, Crypto, Weather, Finance, Politics, Science/Tech, Entertainment, Media, World Events, Esports, Other)
    • ticker: Kalshi's unique identifier for each market. Required to pull trade data for that market.
    • title: Human-readable market name (e.g. “Will NYC high temperature be X on date Y?”). Useful for finding markets of interest.
    • volume: Total contracts traded over the market's lifespan.

Choose Markets Columns

Step 2 — Filter Weather Markets

Head to Refine Query section.

Select "Where" to apply filter:

WHERE → Category value → Weather (you would change the value selection to Sports, Crypto, etc depending on the category you are interested in)

This isolates weather-related prediction markets.

Filter Weather Markets

Step 3 — Sort by Volume (find meaningful markets)

Now:

SORT → volume order → Descending

This arranges your Weather markets from highest volume to lowest volume.

This ensures you are working with liquid markets (important for signal quality).

Sort Your Data

Step 4 — Limit dataset

Select "Limit" from Refine query section

Set the limit value to 30:

LIMIT → 30

Now you have:

Top 30 most actively traded Kalshi weather markets

Setting a limit to your dataset is good practice to limit query size, memory usage and load times.

Name your Sheet and hit "Run Pull" to execute your query.

Top 30 Most Active Markets

Step 5 — Select a market

Your data is now loaded into Data Sheet. Browse the different markets that match your query criteria.

Pick a market like:

“Will NYC high temperature be X on date Y?”

Copy its ticker by double clicking on the cell in the Ticker column and ctrl + c

Select your market to analyze

Step 6 — Pull historical trades

Now that we know which market we want to analyze. Lets pull all trades placed for this market. In this guides case:

  • Title: "Will the high temp in NYC be 48-49° on Nov 13, 2024?
  • Ticker: KXHIGHNY-24NOV13-B48.5

Now switch to Trades in Kalshi Historical Data:

  • Select Integrations tab in data sheets. This will open the side panel.
    • This side panel allows you to make a new data pull request within your current Project workspace
  • Select Kalshi Historical to start another request to Kalshi Historical Data

Pull Historical Trades

In Kalshi Historical:

  • Select TRADES
  • Select Select All: to select all columns in the TRADES data base:
    • trade_id: each trade has a unique trade_id to identify the trade
    • ticker: this is the market ticker, in our case KXHIGHNY-24NOV13-B48.5
    • count: the number of contracts that exchanged hands in each trade
    • yes_price: the yes_price set for this trade in cents (0-99)
    • no_price: the no_price set for this trade in cents (0-99)
      • note yes_price + no_price = 100 for a given trade i.e. $1
    • taker_side: which side of the trade (yes or no) was playing the role of the taker
    • created-time: the time that the trade was executed
    • _fetched_at: this is a meta metric when the data was pulled by Lychee. You can mostly ignore it.

Select Trades columns

Apply query filter:

WHERE → ticker = your selected market

In this guide's case:

  • WHERE ticker = KXHIGHNY-24NOV13-B48.5

Apply query filters

Then:

  • create New Sheet, Name your sheet
  • run query

You now have full trade history for your market.

View fill trade history

Step 7 — Bucket trades into time intervals

Time bucketing is a practical data aggregation method that takes high-frequency, tick-by-tick trading data and organizes it into fixed time intervals — like 1-minute, 5-minute, or 1-hour blocks.

Rather than analyzing every single second, it lets traders step back to see the bigger picture, smooth out random short-term noise, and more effectively run technical analysis or quantitative trading strategies.

  • Open: FUNCTIONS (Σ)

Selecting Functions

  • Select StatsBUCKET

Navigate to Bucketing Operations

  • In the Bucket view, set:
    • New Sheet to bucket trades into a new sheet (i.e. not overwrite the original trades and market pulls)
    • Column to Bucket → created_time
    • Name the new bucket column anything you want, we are going with "date"
    • Bucket StyleTime Intervals
    • Time Bucket15 mins
      • This aggregates our trades into 15 minute windows

This converts tick data into time series structure.

  • You may also name your new sheet for clarity

Execute on bucketing operations

Step 8 — Aggregate volume

Now since we are bucketing multiple rows in 15 minute windows into a single row, we need to aggreagate the columns we are interested in analyzing:

  • Select Aggreatagions and set the following:
    • Aggreagation 1: get the total volume traded during each 15 minute time interval
      • Type: Sum
      • Value Column: count
      • Generated Column: volume (you can name this anything you want)

Step 9 — Compute VWPA (key step)

Here for added accuracy we will use a quantitative financial technique called `Volume Weighted Average Price".

Unlike a regular simple average (which treats every price equally regardless of how many shares were traded), VWAP is superior because it weights each price by the actual trading volume at that price. This gives much more importance to prices where heavy volume occurred, making it a far more accurate reflection of the true average price buyers and sellers paid during that time bucket.

Traders rely on VWAP as a key benchmark because it shows where the real money was exchanged, rather than being skewed by low-volume outlier prices.

  • Aggregation 2: Calculate Volume Weighted Average Yes_Price for each 15 minute window
    • Type: Value weighted avg
    • Value Column: yes_price
    • Weight Column: count
    • Generated Column: vwpa_yes_price (you can name this anything you want)
  • Aggregation 3: Calculate Volume Weighted Average No_Price for each 15 minute window
    • Type: Value weighted avg
    • Value Column: no_price
    • Weight Column: count
    • Generated Column: vwpa_no_price (you can name this anything you want)

Compute VWPA

This represents traded activity per interval.

  • Click Create bucket sheet

Step 10 — Interpret convergence (Building Chart)

  • Select charts from the tabs above Data Sheet or above the right Side Panel

Charting Convergence

Set:

  • ChartLine Chart
  • X-axistime_bucket (whatever you named this column. Dropdown is organized by sheet name + column name)
  • Y-axisyes_price

Then:

  • add second line → no_price

Visualizing yes_price and no_price charts

  • Use the design panel to design the chart as you desire

What you now see:

  • early: noisy disagreement
  • mid: information incorporation
  • late: sharp convergence
  • final: settlement-level consensus

This is:

real-time probability discovery in action

Key Insight

Kalshi weather markets are not static probabilities.

They are:

evolving belief systems shaped by continuous trading

VWPA reveals the true signal behind noisy ticks.

What to build next

You now know how to:

  • pull historical Kalshi markets
  • reconstruct trade history
  • aggregate market probabilities
  • calculate VWAP-style pricing
  • visualize convergence over time

Once you understand convergence curves, you can extend this into:

  • volatility clustering analysis
  • forecast vs market divergence
  • regime detection (trend vs mean reversion)
  • cross-city weather comparison
  • liquidity analysis
  • probability forecasting systems
  • prediction market research

Related guides

Final takeaway

If you strip away noise, liquidity, and individual trades:

prediction markets become structured probability time series systems

And VWPA is how you extract that structure.

Go from raw markets to charts and dashboards in seconds—no code, no CSVs.

Gain Your Edge Now

Free to explore here · Polymarket, Kalshi, Chainlink & more

More reading