Back to Lab

Can you forecast auction-house prices?

A first forecasting model on four weeks of hourly World of Warcraft auction data, and the result that was too good to be true.

  • Python
  • Data
  • Gaming
  • Learning

What this is

My wow-forever collector has saved an hourly snapshot of a World of Warcraft auction house since mid-September: about 650 snapshots and 7.7 million price rows. This is what happened when I tried to forecast prices from it, in five steps. Everything was tested on the last 7 days, which the model never saw during training.

1. Look before predicting

Plotting single items showed that prices do not move in waves. They move in steps: a price sits on one level and jumps when the cheap listings run out or someone refills them. Averages by hour and weekday seemed to show patterns, but those came from a few spikes and coincidences. Using the median instead removed the spikes, and no rhythm was left.

2. Set the bar

The dumbest forecast is “the price will be the same as now”. Over 5,269 items it was the best of every simple guess:

Ahead same as now same hour last week
1 hour 0.1% off 41.5% off
1 day 10.9% off 41.5% off
3 days 27.7% off 41.5% off

A model that cannot beat “same as now” is worthless, so that is the bar.

3. A first model

One LightGBM model for all items at once, predicting the change rather than the price. It beat the bar: 9.2% typical error a day ahead, 23.1% three days ahead. When it predicted a move of more than 25%, the direction was right 85% of the time.

It barely used the clock or the weekday. It leaned on how far the cheapest listing sits below the rest, and how far the price is from its own normal.

4. Would it have made gold?

The model made pretend trades: buy the cheapest listing, hold it for a day, list it just under the cheapest price then, and pay the auction house’s 5% cut. The first result was +135,000 gold. Then I added a delay between seeing the snapshot and buying:

Bought trades made money profit
immediately 6,121 73% +135,642g
1 hour later 1,127 58% +2,695g
2 hours later 136 51% −461g

The model had learned to snipe: to spot a cheap listing in the snapshot. Players with auction addons buy those within the hour, and the snapshot is already up to an hour old when it arrives. The +135,000 assumed nobody else got there first.

5. Does the listing sell?

The more useful question turned out to be the seller’s: if I list at this price, does it get to the front of the queue? For Copper Ore, listing 10% above the cheapest price got there within a day 73% of the time, and 50% above only 13% of the time. The hour of day hardly mattered.

What I learned

  • Distrust the first good number. The trading result looked great until one realistic assumption was added.
  • High prices fall back; low prices do not reliably come back up. The dashboard’s own “more expensive than usual, good to sell” advice was right 76% of the time a day later. “Cheaper than usual, good to buy” was right 34% and wrong 52%, so I removed it.
  • Good ideas are not always new information. Player hours, weekends and supply floods all show up in the data, but none of them improved the model, because their effect was already in the price by the time an hourly snapshot could see it.

What I want to remember

Every percentage here is from one test week in a falling market. Measure again before trusting any of it.

What’s next

The game this is for launches in November with a brand-new economy. The method carries over; the numbers will not. The plan is to retrain on the new market once there are a few weeks of data.