Previous articles have described a few simple formats of prediction market: simple double auctions, markets with open-ended prices, the symmetry of complementary purchases, and how to integrate an order book with an automated market maker. In this article, I describe the mechanics of multi-outcome markets, both as most markets currently implement them, and as I expect to implement them in the Zocalo Prediction Market. I’ve presented this idea before, so you can get another look at the idea by reviewing my slides. ( PowerPoint 3MB).

The basic idea is that instead of two exclusive outcomes, you want the market to give a prediction about an event that might turn out in one of three or more ways. Canonical examples include an election with multiple candidates running, or a tournament among some number of teams. The straightforward approach is to create a pair of assets for each candidate, representing respectively, that competitor’s chances of winning and losing. This way you end up with N separate markets, and each one has a price for buying and selling the particular candidate that gives their chance of winning. The same general idea can be used to turn a continuous variable (how many widgets will we sell? What will the temperature in San Jose be on August 27th?) into a series of discrete choices. I’ll talk about those kinds of markets later.

The market manages the prices in each separate market, buying and selling matched pairs when the prices bid for “candidate X will win” and “candidate X will lose” reach $1. The traders know that at most one candidate will win, so they arbitrage across the markets. Whenever the total price offered for a complete set of YES coupons exceeds $1, someone will buy the opposite coupons to drive the total bid back below $1. (All but one of the negative coupons will pay off, so the arbitrageur spends less than $N-1 in order to collect $N-1 when the bet is decided.) When the total price offered for a set of NO coupons goes over $N-1, arbitrageurs will buy coupons to drive the price back up. (They pay less than $1 for a set of assets that is guaranteed to pay $1.)

This approach works quite well, and is the basis for the Iowa Electronic Markets that have such a good track record at predicting election outcomes. I propose an alternative approach because I think it will improve liquidity in this kind of market. The idea is to ensure that every bid adds liquidity in every market, rather than just to the market for one candidate.

Lack of liquidity is a problem for a market. As I explained in the previous article in this series, many traders are primarily price takers: they only trade when the current price they see seems advantageous. They don’t see a large gap in prices as an opportunity to get a better deal from the next trader, they see only the lack of a tempting offer, and the possibility that the price will move against them if they enter an order within the spread.

The problem I am addressing is that the standard way of setting up the markets separates the offers into separate markets. The only time that an offer for (or against) one candidate has an effect on the other candidates is when it causes the total bid to exceed the arbitrage threshold.

The opportunity I want to take advantage of is that the market operator can offer a complete market in the exclusive outcomes that describe the possibility space. In the same way that the complementary views of a binary market can be viewed in more than one way as I described in the third article in this series, the offers to buy and sell claims for particular candidates can be aggregated in multiple ways. There isn’t even any need to change the way that the market choices are presented to the user; they will still see it as a series of choices between investing in favor or against each separate candidate.

The operator could do this by proactively playing the role of the arbitrageur and accepting riskless combinations of offers whenever they appear among the standing orders. The problem is that the operator can’t accept those orders unless they are placed on the book, and we already know that many traders, being price-takers, only accept standing offers. The alternative is for the operator to enter “phantom” offers into the book that represent trades that would be accepted immediately if they were offered.

  bid ask
A: 20 25
B: 30 31
C: 16 22
D: 32 37
(98) (105)

Here’s an example market with 4 candidates. (I’m ignoring quantities for now; assume that all bids are for 1 coupon. Most markets also present the best N bids, I’m just listing one for simplicity.) The current bid and ask for each candidate is listed. Notice that the total bid adds up to 98¢, and the total ask adds up to $1.05. The total bid is 2¢ under $1. That means that if you offer 2 cents more than the current offer for any of the current candidates, the total bid will be $1, and the operator can make a trade by simultaneously accepting all the offers. But notice that the ask price on candidate B is only 1 cent more than the bid price. If you want to buy B, you only have to offer 31¢, not 32¢.

  bid ask
A: 20 {22} 25
B: 30 31
C: 16 {17} {18} 22
D: 32 {34} 37
(98) (105)

The operator can make these choices clear to the traders by listing phantom orders in each book.

The same transformation works for the sell offers. In this case, Epsilon on the sell side is 5¢. The only spread that is greater than 5¢ is on candidate C, so only one phantom buy order appears in this circumstance.

Occasionally when I’ve presented this idea, someone has argued that it’s an advantage to have opportunities available for arbitrage; it attracts a certain kind of trader whose activity makes the market look more active. I think the advantage of enabling and encouraging more trading by price-takers clearly outweighs that, but you’ll have to make your own evaluation.

I’d like to make a few observations about implementation trade-offs. I expect (when I build support for this feature) that I will list the best phantom price in each market even if it isn’t the current best price. I will track the changing phantom prices in parallel across all the alternatives, so the best phantom will be available anyway. (since every phantom price in a market uses the same epsilon, I can update epsilon once when a best price changes and have that propagate to all the phantom orders in parallel.) That way, a phantom order will be revealed when the previous best offer is withdrawn or consumed, and doesn’t need to be generated before every trade.

Since the phantom offers will appear in the book, I’ll also need to ensure that I don’t generate new phantom offers based on previous phantom prices.