> -- Robin Hanson, Shall We Vote on Values, But Bet on Beliefs? (2013)
In This Chapter
- 31.1 The Big Idea: Governance by Prediction
- 31.2 Conditional Prediction Markets
- 31.3 Decision Markets in Theory
- 31.4 Causal Inference from Markets
- 31.5 Corporate Prediction Markets for Decisions
- 31.6 Implementing a Decision Market
- 31.7 The Manipulation Problem
- 31.8 Thin Market Problem
- 31.9 Futarchy in Practice
- 31.10 Ethical and Philosophical Considerations
- 31.11 Advanced: Designing Better Decision Markets
- 31.12 Chapter Summary
- What's Next
Chapter 31: Decision Markets and Futarchy
"Vote on values, but bet on beliefs." -- Robin Hanson, Shall We Vote on Values, But Bet on Beliefs? (2013)
Prediction markets, as we have studied them throughout this book, aggregate dispersed information into probability estimates. But what if we could go further? What if, instead of merely predicting the future, markets could actively guide the decisions that shape it? This is the radical promise of decision markets and their most ambitious application, futarchy -- a form of governance in which prediction markets replace (or supplement) deliberation, debate, and voting as the mechanism for choosing policies.
The idea is simultaneously elegant and controversial. If markets can predict the consequences of different policies better than experts or voters, why not let them decide? But the leap from prediction to decision raises profound questions about causation, manipulation, democratic legitimacy, and mechanism design that occupy some of the deepest thinkers in economics, computer science, and political philosophy.
This chapter provides an exhaustive treatment of decision markets and futarchy. We begin with the conceptual foundations, work through the theoretical apparatus, examine real-world implementations (from corporate experiments at Google and HP to DAO governance on Solana), and confront the hard problems that remain unsolved. Along the way, we implement conditional market mechanisms, causal inference tools, and full futarchy simulations in Python.
31.1 The Big Idea: Governance by Prediction
31.1.1 From Information Aggregation to Decision-Making
Throughout this book, we have seen that prediction markets excel at aggregating dispersed information. When a market asks "What will quarterly revenue be?", traders with private signals -- sales data, customer feedback, supply chain intelligence -- trade their way to prices that outperform expert forecasts (Chapter 11). The market's price is not just a number; it is a sufficient statistic that compresses the collective knowledge of all participants.
Robin Hanson, an economist at George Mason University, made the conceptual leap that transformed prediction markets from information tools into governance mechanisms. His insight was deceptively simple: if prediction markets can tell us what will happen, perhaps they can also tell us what we should do.
The key innovation is the conditional prediction market: instead of asking "What will GDP be next year?", we ask "What will GDP be next year if we adopt Policy A?" and simultaneously "What will GDP be next year if we adopt Policy B?" If the market for Policy A shows a higher expected GDP, we adopt Policy A. The market has made the decision for us.
31.1.2 Hanson's Futarchy Proposal
In his seminal 2000 paper (later published in the Journal of Political Philosophy in 2013), Hanson proposed futarchy as a new form of government:
Futarchy: A system of governance in which elected officials define measures of national welfare, and prediction markets determine which policies are adopted, based on which policies the markets predict will maximize those welfare measures.
The slogan is memorable: "Vote on values, but bet on beliefs."
Under futarchy: 1. Citizens vote (via democratic processes) on welfare metrics -- what constitutes the good society. For example: maximize GDP per capita plus a health index minus a Gini coefficient penalty. 2. For any proposed policy, conditional prediction markets are opened: "If this policy is adopted, what will the welfare metric be in 5 years?" and "If this policy is not adopted, what will the welfare metric be?" 3. The policy is adopted if and only if the conditional market price under the policy exceeds the conditional price without it.
The appeal is profound. Futarchy claims to solve several problems simultaneously:
- Rational ignorance: Voters need not understand complex policy; traders with expertise handle the analysis.
- Special interest capture: It is harder for lobbyists to buy predictions than to buy votes.
- Ideology and tribalism: Markets force participants to put money where their mouths are, penalizing wishful thinking.
- Expert disagreement: The market aggregates across all experts (and non-experts with relevant information) automatically.
31.1.3 The Controversy
Futarchy is also one of the most controversial proposals in institutional design. Critics raise serious objections:
-
Who defines the welfare metric? The entire system depends on the metric being correct. But defining "national welfare" is precisely the hard part of politics -- it is not a technical problem but a values problem.
-
Causal inference: Conditional market prices tell us about correlations, not necessarily causation. If sophisticated traders condition on "Policy A passes," they may also condition on the political context in which Policy A would pass -- which might itself be correlated with good (or bad) outcomes.
-
Manipulation: If the market determines the policy, traders have incentives beyond information revelation. A corporation might lose money on a prediction to gain billions from the resulting policy.
-
Thin markets: Conditional markets split liquidity. If only one of two conditions will actually resolve, half the trading capital is "wasted."
-
Democratic legitimacy: Should market participants (weighted by capital) override the preferences of citizens (weighted equally)?
We will examine each of these objections rigorously in the sections that follow.
31.1.4 The Intellectual Landscape
Futarchy sits at the intersection of several intellectual traditions:
| Tradition | Contribution |
|---|---|
| Market socialism (Lange, Hayek) | Using prices to aggregate information for social planning |
| Mechanism design (Hurwicz, Myerson) | Designing institutions to elicit private information |
| Prediction markets (Hanson, Wolfers, Zitzewitz) | Empirical evidence that markets aggregate beliefs |
| Causal inference (Rubin, Pearl) | Frameworks for distinguishing causation from correlation |
| Social choice theory (Arrow, Sen) | Understanding the limits of collective decision-making |
| Blockchain governance (Buterin, Gnosis) | New venues for implementing futarchy |
31.2 Conditional Prediction Markets
31.2.1 The Basic Structure
A conditional prediction market is a market that only resolves if a certain condition is met. The canonical structure involves two components:
- The decision variable $D \in \{d_1, d_2, \ldots, d_k\}$: the action or policy under consideration.
- The outcome variable $Y$: the quantity we care about measuring.
For each possible decision $d_i$, we create a market that pays $Y$ if $D = d_i$ and is "called off" (positions returned at cost) if $D \neq d_i$.
Example: A company is deciding between Product Strategy A and Product Strategy B. $Y$ is next-year revenue.
- Market A: pays $Y$ per share if Strategy A is chosen; called off if B is chosen.
- Market B: pays $Y$ per share if Strategy B is chosen; called off if A is chosen.
Let $P_A$ denote the price in Market A and $P_B$ the price in Market B. Under standard rational expectations:
$$P_A = \mathbb{E}[Y \mid D = A, \text{market information}]$$ $$P_B = \mathbb{E}[Y \mid D = B, \text{market information}]$$
If $P_A > P_B$, the market collectively believes that Strategy A will produce higher revenue.
31.2.2 Implementing Conditional Markets
There are several approaches to implementing conditional markets:
Approach 1: Separate Conditional Markets
Create distinct markets for each condition. Each market is independently operated and resolves only if the corresponding decision is made. This is the simplest approach but splits liquidity across markets.
Approach 2: Combinatorial Market with Conditional Tokens (Gnosis Framework)
Use a combinatorial market maker (Chapter 28) with tokens that represent joint states of $(D, Y)$. Traders buy and sell tokens like "Decision A AND Revenue > 100M." Conditional prices are derived by normalizing:
$$P(Y > 100M \mid D = A) = \frac{P(D = A \text{ AND } Y > 100M)}{P(D = A)}$$
This approach preserves liquidity across conditions but requires a more complex market structure.
Approach 3: Call Auction with Conditional Orders
Traders submit orders contingent on the decision. A single clearing mechanism processes all orders simultaneously, resolving the decision and the outcome market together.
31.2.3 Python Implementation: Conditional Market
"""
Conditional Prediction Market Implementation
Implements a basic decision market with two conditions.
"""
import numpy as np
from dataclasses import dataclass, field
from typing import Dict, List, Optional, Tuple
from enum import Enum
import uuid
class Decision(Enum):
"""Possible decisions in the market."""
A = "A"
B = "B"
UNDECIDED = "UNDECIDED"
@dataclass
class ConditionalOrder:
"""An order in a conditional prediction market."""
trader_id: str
decision_condition: Decision # Which decision this order is conditioned on
quantity: float # Positive = buy, negative = sell
limit_price: float # Maximum price to pay (or min to receive)
order_id: str = field(default_factory=lambda: str(uuid.uuid4())[:8])
def __repr__(self):
side = "BUY" if self.quantity > 0 else "SELL"
return (f"Order({self.order_id}: {side} {abs(self.quantity):.1f} "
f"units | D={self.decision_condition.value} @ {self.limit_price:.3f})")
class ConditionalMarketMaker:
"""
Logarithmic Market Scoring Rule (LMSR) based conditional market.
Maintains separate cost functions for each decision condition.
"""
def __init__(self, liquidity_param: float = 100.0,
outcome_range: Tuple[float, float] = (0.0, 1.0),
n_buckets: int = 10):
"""
Args:
liquidity_param: LMSR liquidity parameter (b)
outcome_range: (min, max) of the outcome variable
n_buckets: Number of outcome buckets for discretization
"""
self.b = liquidity_param
self.outcome_range = outcome_range
self.n_buckets = n_buckets
# Create outcome buckets
self.bucket_edges = np.linspace(outcome_range[0], outcome_range[1], n_buckets + 1)
self.bucket_centers = (self.bucket_edges[:-1] + self.bucket_edges[1:]) / 2
# Outstanding shares for each (decision, outcome_bucket) pair
self.shares: Dict[Decision, np.ndarray] = {
Decision.A: np.zeros(n_buckets),
Decision.B: np.zeros(n_buckets),
}
# Track total cost collected
self.total_cost = 0.0
# Trade history
self.trade_history: List[dict] = []
def cost_function(self, shares: np.ndarray) -> float:
"""LMSR cost function: C(q) = b * ln(sum(exp(q_i / b)))."""
# Numerical stability: subtract max
max_q = np.max(shares / self.b)
return self.b * (max_q + np.log(np.sum(np.exp(shares / self.b - max_q))))
def prices(self, decision: Decision) -> np.ndarray:
"""Current prices for each outcome bucket under the given decision."""
q = self.shares[decision]
exp_q = np.exp(q / self.b - np.max(q / self.b))
return exp_q / np.sum(exp_q)
def expected_value(self, decision: Decision) -> float:
"""Expected value of outcome conditioned on decision."""
p = self.prices(decision)
return np.sum(p * self.bucket_centers)
def buy_outcome_bucket(self, decision: Decision, bucket_idx: int,
quantity: float, trader_id: str = "anon") -> float:
"""
Buy shares in a specific (decision, outcome_bucket) pair.
Returns:
Cost of the trade.
"""
old_cost = self.cost_function(self.shares[decision])
self.shares[decision][bucket_idx] += quantity
new_cost = self.cost_function(self.shares[decision])
cost = new_cost - old_cost
self.total_cost += cost
self.trade_history.append({
'trader_id': trader_id,
'decision': decision.value,
'bucket_idx': bucket_idx,
'bucket_center': self.bucket_centers[bucket_idx],
'quantity': quantity,
'cost': cost,
'new_expected': self.expected_value(decision),
})
return cost
def buy_expected_value_shift(self, decision: Decision, direction: str,
budget: float, trader_id: str = "anon") -> float:
"""
Shift the expected value up or down using a budget.
This simulates a trader who believes the outcome will be higher/lower
than the current market expectation.
Args:
decision: Which conditional market to trade in.
direction: "up" or "down".
budget: Maximum to spend.
trader_id: Trader identifier.
Returns:
Amount actually spent.
"""
total_spent = 0.0
step_size = budget / 20 # Trade in small increments
for _ in range(20):
p = self.prices(decision)
if direction == "up":
# Buy the highest bucket, sell the lowest
buy_bucket = self.n_buckets - 1
sell_bucket = 0
else:
buy_bucket = 0
sell_bucket = self.n_buckets - 1
cost = self.buy_outcome_bucket(decision, buy_bucket, 1.0, trader_id)
total_spent += cost
if total_spent >= budget:
break
return total_spent
def get_decision_signal(self) -> Tuple[Decision, float, float]:
"""
Returns the market's recommendation.
Returns:
(recommended_decision, expected_value_A, expected_value_B)
"""
ev_a = self.expected_value(Decision.A)
ev_b = self.expected_value(Decision.B)
if ev_a >= ev_b:
return Decision.A, ev_a, ev_b
else:
return Decision.B, ev_a, ev_b
def summary(self) -> str:
"""Print a summary of current market state."""
ev_a = self.expected_value(Decision.A)
ev_b = self.expected_value(Decision.B)
rec, _, _ = self.get_decision_signal()
lines = [
"=== Conditional Market Summary ===",
f"E[Y | D=A] = {ev_a:.4f}",
f"E[Y | D=B] = {ev_b:.4f}",
f"Difference (A - B) = {ev_a - ev_b:.4f}",
f"Market recommends: Decision {rec.value}",
f"Total trades: {len(self.trade_history)}",
f"Total cost collected: {self.total_cost:.2f}",
]
return "\n".join(lines)
# --- Demonstration ---
if __name__ == "__main__":
print("=== Conditional Decision Market Demo ===\n")
# Create market for a decision between A and B
# Outcome is revenue (normalized to 0-1 scale)
market = ConditionalMarketMaker(
liquidity_param=50.0,
outcome_range=(0.0, 1.0),
n_buckets=10
)
print("Initial state:")
print(market.summary())
print()
# Trader 1 believes Decision A leads to higher outcomes
cost1 = market.buy_expected_value_shift(Decision.A, "up", budget=10.0, trader_id="T1")
print(f"Trader 1 spent {cost1:.2f} pushing A's expected value up")
# Trader 2 also believes A is better but not by as much
cost2 = market.buy_expected_value_shift(Decision.A, "up", budget=5.0, trader_id="T2")
print(f"Trader 2 spent {cost2:.2f} pushing A's expected value up")
# Trader 3 believes Decision B leads to higher outcomes
cost3 = market.buy_expected_value_shift(Decision.B, "up", budget=12.0, trader_id="T3")
print(f"Trader 3 spent {cost3:.2f} pushing B's expected value up")
print()
print("Final state:")
print(market.summary())
31.2.4 Interpreting Conditional Prices
The interpretation of conditional market prices is subtle and important. The price $P_A = \mathbb{E}[Y \mid D = A]$ is a conditional expectation -- it tells us the market's belief about $Y$ given that decision $A$ is made. But this conditioning has a critical ambiguity:
The correlation problem: When the market conditions on $D = A$, it conditions on everything that is correlated with $D = A$. If the decision is made by some external process (a legislature, a CEO), then the market is conditioning not just on the direct effect of the policy, but also on the state of the world in which that policy would be adopted.
For example, suppose a government considering a fiscal stimulus. The stimulus would likely be adopted during a recession. The conditional market $\mathbb{E}[\text{GDP} \mid \text{stimulus}]$ might show lower GDP not because the stimulus hurts the economy, but because the stimulus is adopted precisely when the economy is already weak.
This is the fundamental challenge: we want the causal effect of the decision, but the market gives us a conditional expectation that mixes the causal effect with selection effects.
31.3 Decision Markets in Theory
31.3.1 The Formal Framework
Let us formalize the decision market mechanism. We have:
- A set of possible decisions $\mathcal{D} = \{d_1, d_2, \ldots, d_k\}$
- An outcome variable $Y \in \mathbb{R}$ (the welfare metric)
- A state of the world $\omega$ drawn from some space $\Omega$, which determines both the feasibility of decisions and the outcomes
The key quantities are:
$$\mu_i = \mathbb{E}[Y \mid D = d_i]$$
for each decision $d_i$. The decision rule is:
$$d^* = \arg\max_{d_i \in \mathcal{D}} \mu_i$$
That is, we choose the decision that the market predicts will maximize the expected outcome.
31.3.2 The Causal Challenge: Formal Statement
Define the potential outcome $Y(d)$ as the outcome that would occur if decision $d$ were implemented (regardless of what actually happens). This is the Rubin causal model notation. The causal effect of decision $d_i$ relative to $d_j$ is:
$$\tau_{ij} = \mathbb{E}[Y(d_i)] - \mathbb{E}[Y(d_j)]$$
What the market gives us is:
$$\hat{\tau}_{ij} = \mathbb{E}[Y \mid D = d_i] - \mathbb{E}[Y \mid D = d_j]$$
These are equal if and only if the decision $D$ is independent of potential outcomes conditional on market information:
$$Y(d) \perp D \mid \mathcal{I}_{\text{market}}$$
This is the ignorability or unconfoundedness assumption from causal inference. In general, it does not hold for decision markets because the decision itself may be endogenous -- correlated with unobserved factors that also affect $Y$.
31.3.3 When Does the Decision Market Get It Right?
Hanson (2013) argues that the decision market gets the causal effect right under specific conditions:
-
The decision is randomized: If the mechanism randomly selects which conditional market to "count" (i.e., whether $D = A$ or $D = B$ is implemented), then the selection effect vanishes. This is the market equivalent of a randomized controlled trial.
-
The decision is determined solely by the market: If the decision rule is solely $d^* = \arg\max_i \mu_i$, then traders know that their trading affects the decision. In equilibrium, traders who try to exploit the selection effect would move the market and potentially change the decision, creating a fixed-point problem.
-
Thick markets: With sufficiently many traders, no individual trader can move the market enough to change the decision, so each trader acts as a price-taker and reports truthfully.
The formal result (Hanson, 2013; Othman and Sandholm, 2010) is that under certain equilibrium conditions, decision markets do produce causal estimates. The intuition is that the decision market creates an incentive structure where being "right about the causal effect" is the only reliable way to make money.
However, this result is delicate. It relies on equilibrium reasoning that may not hold in thin or manipulated markets.
31.3.4 Alternative Theoretical Frameworks
Several researchers have proposed modifications to address the causal inference problem:
Chen, Kash, and Ruberry (2014) -- Proposed "decision scoring rules" that directly reward traders for the causal effect, not the conditional expectation. This requires additional structural assumptions.
Page and Clemen (2013) -- Analyzed conditions under which conditional market prices converge to causal effects and showed that even small deviations from the ideal conditions can produce large biases.
Othman and Sandholm (2010) -- Studied the game-theoretic equilibria of decision markets and showed that truthful reporting is a Bayesian Nash Equilibrium under certain conditions, but that multiple equilibria can exist.
31.4 Causal Inference from Markets
31.4.1 The Potential Outcomes Framework Applied
To rigorously analyze whether conditional markets reveal causal effects, we apply the Rubin Causal Model (potential outcomes framework).
For each unit $i$ and decision $d$, define: - $Y_i(d)$: the potential outcome for unit $i$ under decision $d$ - $D_i$: the actual decision applied to unit $i$ - $Y_i^{\text{obs}} = Y_i(D_i)$: the observed outcome
The Average Treatment Effect (ATE) is:
$$\text{ATE} = \mathbb{E}[Y(A)] - \mathbb{E}[Y(B)]$$
The selection bias is:
$$\text{Bias} = \left(\mathbb{E}[Y \mid D = A] - \mathbb{E}[Y \mid D = B]\right) - \text{ATE}$$
$$= \left(\mathbb{E}[Y(A) \mid D = A] - \mathbb{E}[Y(A) \mid D = B]\right) + \left(\mathbb{E}[Y(B) \mid D = A] - \mathbb{E}[Y(B) \mid D = B]\right) / \text{adjustments}$$
In simpler terms, selection bias arises when the decision is correlated with the baseline potential outcome. If $A$ is chosen when things are already going well, then $\mathbb{E}[Y \mid D = A]$ will be inflated not because $A$ caused good outcomes, but because $A$ was selected when outcomes were already going to be good.
31.4.2 The Decision Market Solution
Decision markets attempt to solve the causal inference problem through a clever mechanism:
- Both conditional markets (A and B) are open simultaneously.
- The decision is made based on the market prices.
- Only the market corresponding to the actual decision resolves.
The key insight is that if the decision is solely determined by comparing $P_A$ and $P_B$, then the mapping from market prices to decisions is known to all traders. A trader who believes that $A$ causes better outcomes (regardless of selection) will buy in the $A$-conditional market, pushing $P_A$ up, which makes $A$ more likely to be chosen, which makes their bet more likely to resolve (and pay off).
The equilibrium argument is subtle: in a large market, each trader is a price-taker. Their individual trade does not change the decision. Therefore, they simply report their honest belief about $\mathbb{E}[Y \mid D = d]$ for the decision $d$ they trade on. Since they know the decision rule, they can "undo" the selection effect in their heads and report the causal estimate.
31.4.3 Python Implementation: Causal Analysis
"""
Causal Inference Analysis for Decision Markets.
Simulates scenarios where conditional market prices may or may not
reflect causal effects, and implements diagnostic tools.
"""
import numpy as np
from typing import Tuple, Dict
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
class CausalDecisionMarketSimulator:
"""
Simulates a world where we can observe both potential outcomes
(for analysis) and a decision market that observes only
conditional expectations.
"""
def __init__(self, n_worlds: int = 10000, seed: int = 42):
self.n_worlds = n_worlds
self.rng = np.random.RandomState(seed)
def generate_scenario(self,
true_effect_A: float = 0.5,
true_effect_B: float = 0.3,
selection_correlation: float = 0.0
) -> Dict:
"""
Generate a causal scenario.
Args:
true_effect_A: True causal effect of decision A on outcome.
true_effect_B: True causal effect of decision B on outcome.
selection_correlation: How correlated the decision is with
baseline outcome (0 = no selection bias).
Returns:
Dictionary with potential outcomes, decisions, and observed outcomes.
"""
n = self.n_worlds
# Baseline state of the world (unobserved confounder)
U = self.rng.normal(0, 1, n)
# Potential outcomes under each decision
Y_A = U + true_effect_A + self.rng.normal(0, 0.5, n)
Y_B = U + true_effect_B + self.rng.normal(0, 0.5, n)
# Decision process: may be correlated with U
# Higher selection_correlation means D=A is more likely when U is high
decision_propensity = selection_correlation * U + self.rng.normal(0, 1, n)
D = (decision_propensity > 0).astype(int) # 1 = A, 0 = B
# Observed outcomes
Y_obs = np.where(D == 1, Y_A, Y_B)
# True causal quantities
true_ATE = np.mean(Y_A) - np.mean(Y_B)
# Naive conditional difference (what a simple market might report)
naive_diff = np.mean(Y_obs[D == 1]) - np.mean(Y_obs[D == 0])
# Selection bias
bias = naive_diff - true_ATE
return {
'Y_A': Y_A,
'Y_B': Y_B,
'U': U,
'D': D,
'Y_obs': Y_obs,
'true_ATE': true_ATE,
'true_effect_A': true_effect_A,
'true_effect_B': true_effect_B,
'naive_conditional_diff': naive_diff,
'selection_bias': bias,
'selection_correlation': selection_correlation,
}
def analyze_bias_vs_selection(self,
true_effect_A: float = 0.5,
true_effect_B: float = 0.3
) -> Tuple[np.ndarray, np.ndarray, np.ndarray]:
"""
Analyze how selection bias varies with selection correlation.
Returns:
(correlations, true_ATEs, naive_diffs)
"""
correlations = np.linspace(-2, 2, 41)
true_ates = []
naive_diffs = []
for corr in correlations:
scenario = self.generate_scenario(
true_effect_A=true_effect_A,
true_effect_B=true_effect_B,
selection_correlation=corr
)
true_ates.append(scenario['true_ATE'])
naive_diffs.append(scenario['naive_conditional_diff'])
return correlations, np.array(true_ates), np.array(naive_diffs)
def simulate_decision_market_equilibrium(self,
true_effect_A: float = 0.5,
true_effect_B: float = 0.3,
n_traders: int = 50,
n_rounds: int = 100
) -> Dict:
"""
Simulate a decision market where traders know the decision rule
and report beliefs accordingly.
This demonstrates how the decision market mechanism can recover
causal effects even when naive conditioning would not.
"""
prices_A = [0.5] # Starting price for E[Y|A]
prices_B = [0.5] # Starting price for E[Y|B]
# Traders have noisy signals about the true effects
trader_signals_A = true_effect_A + self.rng.normal(0, 0.2, n_traders)
trader_signals_B = true_effect_B + self.rng.normal(0, 0.2, n_traders)
for round_num in range(n_rounds):
# Each round, a random trader updates the market
trader = self.rng.randint(n_traders)
# Trader knows that the decision will be based on
# which price is higher, so they report their causal estimate
signal_A = trader_signals_A[trader]
signal_B = trader_signals_B[trader]
# Update prices via simple averaging (Bayesian-like)
learning_rate = 1.0 / (round_num + 2)
new_price_A = prices_A[-1] + learning_rate * (signal_A - prices_A[-1])
new_price_B = prices_B[-1] + learning_rate * (signal_B - prices_B[-1])
prices_A.append(new_price_A)
prices_B.append(new_price_B)
return {
'prices_A': np.array(prices_A),
'prices_B': np.array(prices_B),
'true_effect_A': true_effect_A,
'true_effect_B': true_effect_B,
'final_price_A': prices_A[-1],
'final_price_B': prices_B[-1],
'market_recommendation': 'A' if prices_A[-1] > prices_B[-1] else 'B',
'correct': (prices_A[-1] > prices_B[-1]) == (true_effect_A > true_effect_B),
}
# --- Demonstration ---
if __name__ == "__main__":
sim = CausalDecisionMarketSimulator()
print("=== Causal Inference from Decision Markets ===\n")
# Scenario 1: No selection bias
s1 = sim.generate_scenario(
true_effect_A=0.5, true_effect_B=0.3, selection_correlation=0.0
)
print("Scenario 1: No selection bias (random assignment)")
print(f" True ATE (A - B): {s1['true_ATE']:.4f}")
print(f" Naive conditional diff: {s1['naive_conditional_diff']:.4f}")
print(f" Selection bias: {s1['selection_bias']:.4f}")
print()
# Scenario 2: Positive selection bias
s2 = sim.generate_scenario(
true_effect_A=0.5, true_effect_B=0.3, selection_correlation=1.5
)
print("Scenario 2: Positive selection bias (A chosen when U is high)")
print(f" True ATE (A - B): {s2['true_ATE']:.4f}")
print(f" Naive conditional diff: {s2['naive_conditional_diff']:.4f}")
print(f" Selection bias: {s2['selection_bias']:.4f}")
print()
# Scenario 3: Negative selection bias
s3 = sim.generate_scenario(
true_effect_A=0.5, true_effect_B=0.3, selection_correlation=-1.5
)
print("Scenario 3: Negative selection bias (A chosen when U is low)")
print(f" True ATE (A - B): {s3['true_ATE']:.4f}")
print(f" Naive conditional diff: {s3['naive_conditional_diff']:.4f}")
print(f" Selection bias: {s3['selection_bias']:.4f}")
print()
# Decision market simulation
dm = sim.simulate_decision_market_equilibrium(
true_effect_A=0.5, true_effect_B=0.3, n_traders=100, n_rounds=200
)
print("=== Decision Market Equilibrium ===")
print(f" Final price A: {dm['final_price_A']:.4f} (true: {dm['true_effect_A']:.4f})")
print(f" Final price B: {dm['final_price_B']:.4f} (true: {dm['true_effect_B']:.4f})")
print(f" Market recommends: Decision {dm['market_recommendation']}")
print(f" Correct? {dm['correct']}")
31.4.4 Limitations of Causal Inference from Markets
Even with the theoretical arguments in favor, several practical limitations remain:
-
Finite trader effects: The equilibrium argument relies on each trader being a price-taker. In thin markets, a single trader can move the price and change the decision, breaking the argument.
-
Common knowledge requirements: Traders must understand the decision rule and reason about how their trades affect the decision. This is a strong cognitive requirement.
-
Multiple equilibria: There can be self-fulfilling prophecy equilibria. If traders believe $A$ will be chosen and trade accordingly, the market can "lock in" to either decision, regardless of the true causal effects.
-
Dynamic manipulation: A patient manipulator can slowly move prices, conditioning the behavior of other traders who interpret prices as signals.
31.5 Corporate Prediction Markets for Decisions
31.5.1 The Corporate Use Case
While futarchy in government remains largely theoretical, corporate prediction markets for decision-making have been implemented and studied in real organizations. The corporate context is in many ways the ideal testing ground:
- Decisions are clearly defined (launch product A or B, invest in project X or Y).
- Outcome metrics are measurable (revenue, profit, market share).
- The population of traders (employees) has genuine private information.
- The stakes are high enough to motivate participation.
- The organization controls the decision process.
31.5.2 Google's Internal Markets
Google operated one of the most studied corporate prediction markets from 2005 to the mid-2010s. While most of Google's markets were standard prediction markets (e.g., "Will Chrome reach 20% market share by Q4?"), some were structured as decision-support tools:
- Product launch predictions: Markets on expected user adoption conditional on different launch strategies.
- Hiring predictions: Markets on candidate success conditional on different team assignments.
- Resource allocation: Markets on project success probabilities used to inform investment decisions.
Key findings from the Google experience (Cowgill, Wolfers, and Zitzewitz, 2009): - Markets were well-calibrated overall. - There was an optimism bias (prices slightly too high for positive outcomes), possibly due to selection of enthusiastic participants. - Markets outperformed simple baselines but the advantage over well-structured expert panels was modest.
31.5.3 Hewlett-Packard Experiments
HP conducted some of the earliest controlled experiments with corporate prediction markets in the late 1990s and early 2000s (Chen and Plott, 2002). Their focus was on sales forecasting:
- Markets were opened among small groups of HP employees to predict printer sales.
- Despite having only 8-12 traders, the markets significantly outperformed HP's official sales forecasts.
- The improvement came largely from aggregating information that existed in different departments (sales, manufacturing, marketing) but was not effectively shared.
The HP experiments demonstrated that prediction markets could work in corporate settings even with very few participants, provided those participants had genuinely diverse information.
31.5.4 Microsoft
Microsoft operated internal prediction markets for software development:
- Markets predicted ship dates, bug counts, and feature completion.
- These were primarily predictive (not decision-conditional), but the information was used to inform resource allocation decisions.
- Markets were notably more accurate than project manager estimates for ship dates.
31.5.5 Ford Motor Company
Ford experimented with prediction markets for vehicle demand forecasting:
- Markets predicted sales volumes for different models under different incentive programs.
- This represented a decision-adjacent use: the market was not directly choosing the incentive program, but the conditional structure ("What will F-150 sales be if we offer 0% financing?") informed the decision.
- Results were mixed: markets were good at short-term forecasting but struggled with longer horizons.
31.5.6 Lessons from Corporate Implementations
| Factor | Findings |
|---|---|
| Market size | Even 8-12 active traders can produce useful forecasts |
| Incentives | Play money works surprisingly well; real money adds modestly |
| Participation | Self-selection bias is a concern; mandated participation can help |
| Question design | Precise, falsifiable questions with clear resolution criteria are essential |
| Management buy-in | Markets that management ignores become demoralized quickly |
| Time horizon | Short-term predictions (weeks/months) outperform long-term ones |
| Decision coupling | Directly tying decisions to market prices is rare and challenging |
31.6 Implementing a Decision Market
31.6.1 Design Principles
Implementing a decision market requires careful attention to several design dimensions:
1. Define the Decision Space
The set of possible decisions must be: - Mutually exclusive and collectively exhaustive (MECE) - Clearly defined (no ambiguity about what each decision entails) - Feasible (each decision must be implementable)
2. Define the Outcome Metric
The welfare metric $Y$ must be: - Measurable and verifiable - Available within a reasonable time frame - Sensitive to the decision (not swamped by external factors) - Resistant to manipulation (not easily gamed)
3. Design the Conditional Market Structure
Choose between: - Separate conditional markets (simpler, but splits liquidity) - Combinatorial tokens (more complex, preserves liquidity) - Conditional limit orders (most flexible, hardest to implement)
4. Specify the Decision Rule
The rule mapping market prices to decisions. Options include: - Argmax: Choose the decision with the highest conditional expected outcome. - Threshold: Choose a new policy only if its expected outcome exceeds the status quo by some margin. - Randomized: With some probability, randomize the decision (to maintain incentive compatibility). - Advisory: Market prices inform but do not determine the decision (this is not technically futarchy, but is more commonly implemented).
5. Design the Resolution Protocol
How the market resolves after the decision is made: - The conditional market matching the actual decision resolves normally. - Conditional markets for decisions not taken are voided (positions returned at purchase price). - Define the oracle or data source for the outcome metric.
31.6.2 Python Implementation: Decision Market Framework
"""
Complete Decision Market Framework.
Implements a full decision market with:
- Multiple decision alternatives
- LMSR-based conditional markets
- Decision rule
- Resolution protocol
"""
import numpy as np
from dataclasses import dataclass, field
from typing import Dict, List, Optional, Tuple, Callable
from enum import Enum
import json
@dataclass
class MarketConfig:
"""Configuration for a decision market."""
decisions: List[str]
outcome_description: str
outcome_range: Tuple[float, float] = (0.0, 100.0)
n_outcome_buckets: int = 20
liquidity_param: float = 100.0
decision_rule: str = "argmax" # "argmax", "threshold", "randomized"
threshold_margin: float = 0.0 # For threshold rule
random_prob: float = 0.1 # For randomized rule
@dataclass
class TraderAccount:
"""A trader's account in the decision market."""
trader_id: str
balance: float = 1000.0
positions: Dict[str, np.ndarray] = field(default_factory=dict)
trade_count: int = 0
total_pnl: float = 0.0
class DecisionMarket:
"""
Full decision market implementation.
Supports multiple decisions, LMSR pricing, and various decision rules.
"""
def __init__(self, config: MarketConfig):
self.config = config
self.n_decisions = len(config.decisions)
self.n_buckets = config.n_outcome_buckets
self.b = config.liquidity_param
# Outcome bucket structure
self.bucket_edges = np.linspace(
config.outcome_range[0], config.outcome_range[1],
self.n_buckets + 1
)
self.bucket_centers = (self.bucket_edges[:-1] + self.bucket_edges[1:]) / 2
# Share state for each decision
self.shares: Dict[str, np.ndarray] = {
d: np.zeros(self.n_buckets) for d in config.decisions
}
# Trader accounts
self.traders: Dict[str, TraderAccount] = {}
# Market state
self.is_open = True
self.decision_made: Optional[str] = None
self.actual_outcome: Optional[float] = None
# History
self.trade_log: List[dict] = []
self.price_history: Dict[str, List[float]] = {
d: [self._expected_value(d)] for d in config.decisions
}
def register_trader(self, trader_id: str, initial_balance: float = 1000.0):
"""Register a new trader."""
self.traders[trader_id] = TraderAccount(
trader_id=trader_id,
balance=initial_balance,
positions={d: np.zeros(self.n_buckets) for d in self.config.decisions}
)
def _cost_function(self, shares: np.ndarray) -> float:
"""LMSR cost function."""
max_q = np.max(shares / self.b)
return self.b * (max_q + np.log(np.sum(np.exp(shares / self.b - max_q))))
def _prices(self, decision: str) -> np.ndarray:
"""Current outcome prices for a given decision."""
q = self.shares[decision]
exp_q = np.exp(q / self.b - np.max(q / self.b))
return exp_q / np.sum(exp_q)
def _expected_value(self, decision: str) -> float:
"""Expected outcome value conditioned on decision."""
p = self._prices(decision)
return np.sum(p * self.bucket_centers)
def trade(self, trader_id: str, decision: str,
bucket_idx: int, quantity: float) -> dict:
"""
Execute a trade.
Args:
trader_id: Who is trading.
decision: Which conditional market.
bucket_idx: Which outcome bucket.
quantity: How many shares (positive = buy, negative = sell).
Returns:
Trade receipt dictionary.
"""
if not self.is_open:
raise ValueError("Market is closed.")
if trader_id not in self.traders:
raise ValueError(f"Unknown trader: {trader_id}")
if decision not in self.config.decisions:
raise ValueError(f"Unknown decision: {decision}")
if not (0 <= bucket_idx < self.n_buckets):
raise ValueError(f"Invalid bucket index: {bucket_idx}")
trader = self.traders[trader_id]
# Calculate cost
old_cost = self._cost_function(self.shares[decision])
self.shares[decision][bucket_idx] += quantity
new_cost = self._cost_function(self.shares[decision])
cost = new_cost - old_cost
# Check if trader can afford it
if cost > trader.balance:
# Revert
self.shares[decision][bucket_idx] -= quantity
raise ValueError(
f"Insufficient funds: cost={cost:.2f}, balance={trader.balance:.2f}"
)
# Update trader state
trader.balance -= cost
trader.positions[decision][bucket_idx] += quantity
trader.trade_count += 1
# Record
receipt = {
'trader_id': trader_id,
'decision': decision,
'bucket_idx': bucket_idx,
'bucket_range': (self.bucket_edges[bucket_idx],
self.bucket_edges[bucket_idx + 1]),
'quantity': quantity,
'cost': cost,
'new_balance': trader.balance,
'new_expected': self._expected_value(decision),
}
self.trade_log.append(receipt)
# Update price history
for d in self.config.decisions:
self.price_history[d].append(self._expected_value(d))
return receipt
def get_recommendation(self) -> Tuple[str, Dict[str, float]]:
"""
Get the market's decision recommendation.
Returns:
(recommended_decision, {decision: expected_value})
"""
expectations = {d: self._expected_value(d) for d in self.config.decisions}
if self.config.decision_rule == "argmax":
rec = max(expectations, key=expectations.get)
elif self.config.decision_rule == "threshold":
# Compare alternatives to the first (status quo)
status_quo = self.config.decisions[0]
sq_val = expectations[status_quo]
best_alt = max(
[d for d in self.config.decisions[1:]],
key=lambda d: expectations[d]
)
if expectations[best_alt] > sq_val + self.config.threshold_margin:
rec = best_alt
else:
rec = status_quo
else: # randomized
rec = max(expectations, key=expectations.get)
# Note: actual randomization would happen at decision time
return rec, expectations
def make_decision(self, decision: Optional[str] = None) -> str:
"""
Make the decision and close the market for new trading.
Args:
decision: Override decision. If None, use market recommendation.
Returns:
The decision made.
"""
if decision is None:
decision, _ = self.get_recommendation()
self.decision_made = decision
self.is_open = False
return decision
def resolve(self, actual_outcome: float) -> Dict[str, float]:
"""
Resolve the market with the actual outcome.
Returns:
{trader_id: pnl} for each trader.
"""
if self.decision_made is None:
raise ValueError("No decision has been made yet.")
self.actual_outcome = actual_outcome
# Find which bucket the outcome falls in
outcome_bucket = np.searchsorted(self.bucket_edges[1:], actual_outcome)
outcome_bucket = min(outcome_bucket, self.n_buckets - 1)
pnl = {}
for tid, trader in self.traders.items():
# Payout from the decision that was made
position = trader.positions[self.decision_made]
payout = position[outcome_bucket] # 1 unit per share in correct bucket
# Return cost basis for voided conditional markets
# (simplified: just track PnL on the resolved market)
trader.total_pnl = payout # Simplified PnL
trader.balance += payout
pnl[tid] = payout
return pnl
def summary(self) -> str:
"""Generate a summary of market state."""
lines = ["=" * 50]
lines.append("DECISION MARKET SUMMARY")
lines.append("=" * 50)
lines.append(f"Outcome: {self.config.outcome_description}")
lines.append(f"Decisions: {', '.join(self.config.decisions)}")
lines.append(f"Status: {'OPEN' if self.is_open else 'CLOSED'}")
lines.append(f"Total trades: {len(self.trade_log)}")
lines.append("")
for d in self.config.decisions:
ev = self._expected_value(d)
lines.append(f" E[Y | D={d}] = {ev:.2f}")
rec, _ = self.get_recommendation()
lines.append(f"\nRecommendation: {rec}")
if self.decision_made:
lines.append(f"Decision made: {self.decision_made}")
if self.actual_outcome is not None:
lines.append(f"Actual outcome: {self.actual_outcome:.2f}")
lines.append("=" * 50)
return "\n".join(lines)
# --- Demonstration ---
if __name__ == "__main__":
# Create a decision market for choosing a product strategy
config = MarketConfig(
decisions=["Strategy_A", "Strategy_B", "Strategy_C"],
outcome_description="Expected revenue (millions $)",
outcome_range=(0, 100),
n_outcome_buckets=20,
liquidity_param=50.0,
decision_rule="argmax"
)
market = DecisionMarket(config)
# Register traders
for i in range(5):
market.register_trader(f"trader_{i}", initial_balance=500.0)
print("=== Decision Market Simulation ===\n")
print(market.summary())
# Simulate trading: traders have different beliefs
# Trader 0 believes Strategy A will yield ~70M
market.trade("trader_0", "Strategy_A", 14, 10.0) # Bucket around 70
# Trader 1 believes Strategy B will yield ~80M
market.trade("trader_1", "Strategy_B", 16, 12.0) # Bucket around 80
# Trader 2 believes Strategy A will yield ~65M
market.trade("trader_2", "Strategy_A", 13, 8.0) # Bucket around 65
# Trader 3 believes Strategy C will yield ~60M
market.trade("trader_3", "Strategy_C", 12, 7.0) # Bucket around 60
# Trader 4 believes Strategy B will yield ~75M
market.trade("trader_4", "Strategy_B", 15, 9.0) # Bucket around 75
print("\nAfter trading:")
print(market.summary())
# Make decision based on market
decision = market.make_decision()
print(f"\nDecision made: {decision}")
# Resolve with actual outcome
actual = 78.5 # Actual revenue turned out to be $78.5M
pnl = market.resolve(actual)
print(f"Actual outcome: ${actual}M")
print(f"Trader PnL: {pnl}")
31.6.3 Resolution Considerations
The resolution protocol is critical and must address several issues:
Voided markets: When decision $A$ is chosen, the conditional market for $B$ is voided. Traders who bought positions in the $B$-conditional market get their money back. This creates an asymmetry: losing trades in the non-chosen market are refunded, while losing trades in the chosen market are not. This is by design -- it ensures that traders only bear risk in the market that actually resolves.
Time to resolution: The outcome metric may take months or years to materialize. During this period, traders' capital is locked up. This creates liquidity costs that may deter participation, especially for long-horizon decisions.
Metric gaming: Once the metric is defined and the decision is made, there may be incentives to manipulate the metric itself (rather than the decision). For example, if the metric is "stock price in 6 months," insiders might manipulate the stock price.
31.7 The Manipulation Problem
31.7.1 The Core Concern
Decision markets create a new type of manipulation incentive that does not exist in standard prediction markets. In a standard market, a manipulator who pushes the price away from the truth will lose money to better-informed traders. The market is self-correcting.
In a decision market, manipulation can be profitable because it changes the decision. Consider:
- A pharmaceutical company trades in a decision market on "Should the FDA approve Drug X?"
- The company buys shares pushing up "GDP conditional on approving Drug X."
- If this moves the decision toward approval, the company gains far more from selling Drug X than it lost on the market manipulation.
This is the "buying a decision" problem: the cost of market manipulation may be small relative to the value of the resulting policy change.
31.7.2 Formal Analysis of Manipulation
Let $C_m$ be the cost of manipulating the market (the expected loss from pushing prices away from truth) and $V_m$ be the value of the resulting decision change to the manipulator. Manipulation is profitable when:
$$V_m > C_m$$
The cost $C_m$ depends on: - Market liquidity ($b$ in the LMSR): Higher liquidity means more capital required to move prices. - Number of informed traders: More informed traders push back against manipulation. - Price impact: How much the price moves per dollar traded.
The value $V_m$ depends on: - The manipulator's stake in the decision outcome: Direct financial interest, political power, etc. - The sensitivity of the decision to market prices: How much price movement is needed to flip the decision.
31.7.3 Hanson's Defense
Hanson (2013) argues that manipulation is less of a problem than it appears:
-
Manipulation is costly: A manipulator must continuously trade against better-informed traders. Each manipulative trade loses money in expectation (to traders with genuine information). The manipulator is effectively subsidizing information aggregation.
-
Manipulation improves liquidity: Manipulative trades increase market volume and attract more informed traders, who profit from correcting the manipulation. This can actually improve market quality.
-
Double-edged sword: If manipulation is cheap, so is counter-manipulation. Parties harmed by the manipulated decision can profitably trade against the manipulator.
-
Empirical evidence: Studies of prediction market manipulation (e.g., Rhode and Strumpf, 2004, on presidential election markets) find that manipulation attempts have small and transient effects.
31.7.4 Critiques of the Defense
However, several researchers have challenged Hanson's optimism:
-
Asymmetric information about manipulation: Informed traders may not know that manipulation is occurring. They might interpret the manipulated price as a signal from someone with genuine information, leading to an "information cascade" that reinforces the manipulation.
-
Rational response to manipulation: If traders know manipulation is possible, they may discount market prices, reducing the market's informativeness. In the extreme, the market can break down (a "lemons problem" for information).
-
Budget constraints: While counter-manipulation is theoretically profitable, the traders who would benefit from correcting the manipulation may not have the capital to do so. The manipulator may have deeper pockets than any individual informed trader.
-
Strategic patience: A manipulator need not move the price all at once. Gradual manipulation over time can look like genuine trading and be harder to detect.
31.7.5 Defensive Mechanisms
Several mechanisms have been proposed to reduce manipulation:
| Mechanism | Description | Tradeoff |
|---|---|---|
| High liquidity provision | Increase $b$ so manipulation is more expensive | More capital at risk for the market maker |
| Anonymity requirements | Prevent identification of manipulators | May reduce accountability |
| Position limits | Cap the amount any single trader can hold | Limits information from large traders |
| Delayed decision | Don't make the decision immediately; allow time for correction | Delays the decision process |
| Randomized implementation | With probability $p$, ignore the market (implement randomly) | Reduces decision quality |
| Audit mechanisms | Monitor for suspicious trading patterns | Costly and may deter legitimate trading |
| Reputation systems | Weight prices by trader reliability | Complex to implement; may bias toward incumbents |
31.8 Thin Market Problem
31.8.1 The Liquidity Split
Conditional prediction markets suffer from a fundamental liquidity problem: by conditioning on different decisions, they split the available trading interest across multiple markets.
If a standard prediction market on outcome $Y$ would attract $N$ traders and $L$ dollars of liquidity, a conditional market with $k$ decision alternatives will have approximately $N/k$ traders and $L/k$ liquidity per conditional market. In practice, the split may be even worse because:
- Some traders may not have strong beliefs about the conditional outcomes.
- The "call off" feature (voided markets for non-chosen decisions) reduces the expected return on capital, deterring participation.
- The complexity of conditional markets raises the barrier to entry.
31.8.2 Consequences of Thin Markets
Thin markets have several negative consequences for decision quality:
Higher noise: With fewer traders, each individual has more price impact. Idiosyncratic beliefs (rather than aggregate information) have more influence.
Wider spreads: Market makers charge more to compensate for inventory risk, making it more expensive for informed traders to express their views.
Slower information incorporation: With fewer trades, new information is reflected in prices more slowly.
Vulnerability to manipulation: With less liquidity, the cost of price manipulation is lower (see Section 31.7).
Reduced incentive compatibility: The theoretical results that guarantee causal inference from decision markets rely on each trader being a price-taker. In thin markets, this assumption is violated.
31.8.3 Quantifying the Problem
Consider an LMSR-based conditional market with liquidity parameter $b$. The cost of moving the price from $p$ to $p'$ (for a single binary outcome) is approximately:
$$C \approx b \cdot |p' - p|$$
For a decision market with $k$ alternatives, if the total subsidy budget is $B$, each conditional market gets $b = B/k$. The cost of manipulation is reduced by a factor of $k$ compared to a single market.
For example, with $k = 5$ decision alternatives and a total budget of $\$50{,}000$, each conditional market has $b = \$10{,}000$. Moving a conditional price by 10% costs only about $\$1{,}000$ -- potentially cheap for a well-funded manipulator.
31.8.4 Solutions
1. Market Subsidization
The decision-making institution (company, government, DAO) can subsidize the conditional markets by providing liquidity. The LMSR market maker is a natural vehicle: the institution funds the market maker, accepting that it will lose money to informed traders. This loss is the cost of information acquisition.
The optimal subsidy level balances the cost of the subsidy against the expected improvement in decision quality. If the decision has value $V$ and the market improves the decision probability by $\Delta p$, the expected benefit is $V \cdot \Delta p$. The subsidy should be set so that marginal cost equals marginal benefit.
2. Focused Decision Markets
Rather than opening conditional markets on all possible decisions, focus on the most promising 2-3 alternatives. This concentrates liquidity and trading interest.
3. Sequential Markets
Open conditional markets sequentially: first compare the top 2 alternatives. Once a winner emerges, compare it against the next alternative. This tournament structure reduces the number of simultaneous markets.
4. Combinatorial Markets
Use a single combinatorial market (Chapter 28) that covers all (decision, outcome) pairs. Liquidity is shared across all conditions because the market maker operates on the joint distribution.
5. Reward for Participation
Offer bonuses or rewards for trading in conditional markets, independent of trading profits. This attracts marginal traders who would not otherwise participate.
31.9 Futarchy in Practice
31.9.1 From Theory to Reality
Futarchy has been discussed primarily as a theoretical proposal since Hanson introduced it in 2000. For most of its history, no serious attempt was made to implement it in real governance. This changed with the emergence of blockchain technology and decentralized autonomous organizations (DAOs).
31.9.2 Gnosis and the Futarchy Vision
Gnosis, an Ethereum-based prediction market platform, has been among the most vocal proponents of futarchy in the blockchain space. Their vision:
- Use conditional tokens (a token standard they developed) to represent claims contingent on decisions.
- Build automated market makers (AMMs) that operate on conditional token pairs.
- Deploy these in DAO governance: proposals are evaluated through conditional markets rather than (or in addition to) token votes.
The Gnosis conditional token framework (CTF) allows creating tokens for any combination of conditions and outcomes. For example:
- Token A: "Pays 1 DAI if Proposal X passes AND the DAO's treasury value is above $10M in 6 months"
- Token B: "Pays 1 DAI if Proposal X fails AND the DAO's treasury value is above $10M in 6 months"
If Token A trades at a higher price than Token B, the market believes Proposal X will increase treasury value.
31.9.3 Meta-DAO on Solana
The most significant real-world implementation of futarchy is Meta-DAO, launched on the Solana blockchain. Meta-DAO uses futarchy as its primary governance mechanism:
How it works: 1. Anyone can submit a proposal (e.g., "Hire developer X at salary Y"). 2. Two conditional markets are created: - "What will the META token price be if this proposal passes?" - "What will the META token price be if this proposal fails?" 3. Trading occurs over a defined period (typically days). 4. At the end, if the "pass" conditional price exceeds the "fail" conditional price, the proposal is executed automatically.
Design choices: - Welfare metric: META token price. This is controversial (see Section 31.10) but has the advantage of being continuously observable and hard to manipulate. - Resolution: Token price at a random time point after the decision is made, to prevent manipulation at a known resolution time. - Liquidity: Provided through an AMM funded by the DAO treasury.
Results (as of 2025): - Meta-DAO has processed dozens of governance proposals through futarchy. - Token-price-based futarchy tends to favor proposals that are perceived as positive for short-term token value. - Participation has been concentrated among a small number of sophisticated traders, raising concerns about oligarchic tendencies. - Some proposals that were widely supported by the community were rejected by the market (and vice versa), creating governance tension.
31.9.4 Theoretical vs. Practical Futarchy
The gap between Hanson's theoretical proposal and real-world implementations is substantial:
| Theoretical Futarchy | Practical Futarchy (e.g., Meta-DAO) |
|---|---|
| Welfare metric chosen by democratic vote | Welfare metric is token price (not democratically chosen) |
| Many informed traders | Few active traders (thin markets) |
| Long-term welfare metric (GDP, health) | Short-term metric (token price) |
| Costly manipulation (deep markets) | Potentially cheap manipulation (thin markets) |
| Clear causal interpretation | Unclear causal interpretation (token price endogenous) |
| Complemented by democratic institutions | Replaces democratic governance |
31.9.5 Other Experiments
Augur (2018-present): While not strictly futarchy, Augur's decentralized prediction markets have been used informally for decision-relevant predictions. However, low liquidity and front-running issues have limited their effectiveness.
Colony (2017-present): Colony, a DAO framework on Ethereum, has explored prediction-market-based reputation and decision-making, though their implementation diverges significantly from pure futarchy.
GitcoinDAO experiments: Gitcoin has discussed using prediction markets to evaluate the impact of grants, which would be a form of decision market applied to resource allocation.
31.9.6 Scaling Challenges
Scaling futarchy from small DAO decisions to larger governance contexts faces several challenges:
- Complexity of decisions: Real governance involves complex, multi-dimensional decisions with long causal chains. Markets may struggle with this complexity.
- Metric specification: Defining a welfare metric that captures what matters is increasingly difficult as the scope of governance grows.
- Regulatory concerns: Financial prediction markets face regulatory scrutiny in most jurisdictions.
- Public understanding: For futarchy to be legitimate, the public must understand how it works. This is a high bar.
- Integration with existing institutions: Futarchy does not exist in a vacuum. It must interact with legal systems, constitutions, international agreements, etc.
31.10 Ethical and Philosophical Considerations
31.10.1 Technocratic Governance
Futarchy is, at its core, a technocratic proposal: replace deliberation and political judgment with a market-based mechanism. This raises profound concerns:
The values problem: Hanson says "vote on values." But values and beliefs are not neatly separable. What we believe about the world shapes what we value, and vice versa. The idea that we can cleanly separate values (voted on) from beliefs (traded on) is philosophically contested.
Procedural vs. consequentialist legitimacy: Democratic governance derives its legitimacy partly from the process (everyone has an equal voice) and partly from outcomes. Futarchy maximizes consequentialist legitimacy (better outcomes) at the expense of procedural legitimacy (equal participation).
Expertise and capital: In markets, influence is proportional to capital and trading skill. This privileges the wealthy and financially sophisticated. Even if they make "better" decisions in some metric, the procedural injustice may be unacceptable.
31.10.2 The Welfare Metric Problem
The choice of welfare metric is the Achilles' heel of futarchy. Consider:
-
GDP as welfare metric: Maximizing GDP might lead to policies that increase GDP while worsening inequality, environmental quality, or social cohesion.
-
Composite metrics: We could use a weighted combination (GDP + health - inequality - pollution). But the weights are themselves value judgments. Who sets them? How are they updated?
-
Goodhart's Law: "When a measure becomes a target, it ceases to be a good measure." If the government optimizes for a specific metric, there will be strong incentives to game that metric.
-
Incommensurability: Some values may be fundamentally incommensurable -- they cannot be reduced to a single scalar metric. How do you weigh cultural heritage against economic efficiency?
-
Temporal scope: Should the metric focus on this generation or include future generations? Discount rates embed profound ethical choices.
31.10.3 Minority Rights
A particularly sharp concern is the protection of minority rights:
If the welfare metric is aggregate (total GDP, average health), policies that benefit the majority at the expense of minorities could score well in the market. Traditional democratic governance has evolved protections (constitutional rights, judicial review, anti-discrimination laws) that are not obviously preserved under futarchy.
Hanson's response is that the welfare metric can be designed to include minority welfare (e.g., include the Gini coefficient with a high weight). But this pushes the problem back to metric design, which is itself a political process.
31.10.4 The Democratic Accountability Gap
In a democracy, citizens can "throw the bums out" -- replace leaders who make bad decisions. Under futarchy, the decision-maker is the market. You cannot vote out a price. If the market makes a bad decision (which it inevitably will, sometimes), there is no clear mechanism for accountability.
This is not merely a theoretical concern. Consider: the market recommends Policy X. Policy X turns out to be catastrophic. Traders who were wrong lost money, but they may be anonymous, diffuse, and bear no responsibility proportional to the harm caused.
31.10.5 A Defense of Futarchy's Ethics
Proponents argue:
-
Existing governance fails too: Democracies regularly adopt terrible policies due to voter ignorance, special interest capture, and short-term thinking. Futarchy need not be perfect; it only needs to be better than the alternative.
-
The market as a moral technology: Like democracy itself, markets are not natural but are designed institutions. We can iterate on the design to incorporate ethical constraints.
-
Hybrid systems: Futarchy need not replace democracy entirely. It can serve as an advisory mechanism, with democratic institutions retaining veto power.
-
Revealed preference: Markets force participants to put their money where their beliefs are. This is a stronger form of accountability than cheap talk in a voting booth.
31.11 Advanced: Designing Better Decision Markets
31.11.1 Scoring-Rule-Based Decision Markets
Traditional decision markets use a market scoring rule (like LMSR) to price conditional securities. An alternative approach uses proper scoring rules directly:
Instead of having traders buy and sell securities, each trader reports a probability distribution over outcomes conditional on each decision. The trader is then scored using a proper scoring rule (e.g., the logarithmic scoring rule) applied to the outcome conditional on the actual decision.
Formally, trader $i$ reports distributions $F_i^{(d)}$ for each decision $d$. If decision $d^*$ is made and outcome $Y$ is observed, the trader receives:
$$S_i = \log f_i^{(d^*)}(Y)$$
where $f_i^{(d^*)}$ is the probability density function of $F_i^{(d^*)}$.
The advantage of this approach is that it avoids the need for a market mechanism entirely. Each trader independently reports their beliefs, and the scoring rule incentivizes truthful reporting. The aggregate prediction is formed by combining reports (e.g., averaging or using a proper aggregation method).
Disadvantages: - No price discovery process (no information from observing others' trades). - Requires specifying the scoring rule and the aggregation method in advance. - Less robust to misspecification of the model.
31.11.2 Combinatorial Decision Markets
When decisions are multi-dimensional (e.g., choosing a budget allocation across multiple departments), the number of possible decisions is combinatorial. A conditional market for each possible decision is infeasible.
Combinatorial decision markets allow traders to express beliefs about arbitrary combinations of decisions and outcomes. For example:
- "If the marketing budget exceeds $1M AND the R&D budget is below $500K, revenue will be below $50M."
This requires a combinatorial market maker (Chapter 28) that can handle exponentially many outcomes. The computational challenges are significant (pricing is #P-hard in general), but approximation algorithms and restriction to common decision structures make it tractable in practice.
31.11.3 Privacy-Preserving Decision Markets
A concern with decision markets is that trading reveals information that traders might prefer to keep private. For example, an employee trading in a corporate decision market might reveal negative views about a project that their manager champions.
Privacy-preserving approaches include:
-
Anonymized trading: Traders' identities are hidden from other participants (though the market operator may know them for compliance).
-
Secure multi-party computation: Traders submit encrypted reports that are combined without revealing individual inputs. The aggregate prediction is public, but no individual contribution is identifiable.
-
Differential privacy: Add calibrated noise to individual trades or reports, ensuring that no observer can infer much about any single trader's beliefs.
-
Zero-knowledge proofs: Traders prove they have a valid position without revealing the position itself.
These approaches trade off information quality (noisy reports, computational overhead) against privacy protection.
31.11.4 Bayesian Decision Markets
Chen et al. (2011) proposed Bayesian decision markets that explicitly model the causal structure:
- Traders report their beliefs about a causal model linking decisions to outcomes.
- The mechanism combines these beliefs using Bayesian updating.
- The decision is made based on the posterior causal model.
This approach addresses the causal inference problem directly but requires traders to articulate (and the mechanism to process) complex causal beliefs, which is a significant practical challenge.
31.11.5 Multi-Period Decision Markets
Real decisions unfold over time. A single conditional market at one point in time may miss important dynamics:
- The optimal decision may change as new information arrives.
- Early market participants may have very different information than late ones.
- The decision itself may be sequential (commit to Phase 1, then decide Phase 2).
Multi-period decision markets allow for: - Rolling decision markets that update the decision at intervals. - Contingent decision trees where each decision opens new conditional markets. - Real-options-style markets where traders can bet on the value of future flexibility.
31.11.6 Recent Research Directions
| Research Area | Key Papers | Status |
|---|---|---|
| Equilibrium analysis of decision markets | Othman & Sandholm (2010), Chen & Kash (2011) | Theoretical results under strong assumptions |
| Manipulation resistance | Shi et al. (2009), Chakraborty & Yilmaz (2004) | Some bounds; practical defense remains open |
| Causal inference from markets | Page & Clemen (2013), Chen et al. (2014) | Conditions identified; general solution elusive |
| Blockchain-based futarchy | Buterin (2014 blog), Meta-DAO (2023-) | Active experimentation |
| Multi-dimensional decisions | Boutilier (2012), Conitzer (2009) | Computational hardness results |
| Voter-augmented futarchy | Procaccia & Tennenholtz (2009) | Hybrid voting-market mechanisms |
31.12 Chapter Summary
Decision markets and futarchy represent perhaps the most ambitious application of prediction markets: using market mechanisms not merely to forecast, but to govern. The key ideas of this chapter are:
-
Conditional prediction markets allow traders to express beliefs about outcomes contingent on specific decisions. The price in a conditional market reflects the market's aggregate expectation of the outcome under that decision.
-
Futarchy is Robin Hanson's proposal to use conditional markets for governance: "vote on values, bet on beliefs." Citizens define welfare metrics democratically; markets determine which policies maximize those metrics.
-
The causal inference challenge is fundamental: conditional market prices reflect correlations, not necessarily causation. The decision market mechanism addresses this under certain theoretical conditions (large markets, decision determined by prices), but the conditions may not hold in practice.
-
Corporate prediction markets have demonstrated that conditional-style information aggregation can work in organizational settings, though most implementations have been advisory rather than decision-determining.
-
Manipulation is a heightened concern in decision markets because traders can profit from changing the decision, not just from predicting correctly. Defenses exist but are imperfect.
-
Thin markets arise because conditional markets split liquidity. This reduces information quality, increases vulnerability to manipulation, and undermines the theoretical conditions for causal inference.
-
Practical futarchy has emerged in blockchain DAOs, most notably Meta-DAO on Solana. Early results are mixed: the mechanism functions but faces thin market, welfare metric, and legitimacy challenges.
-
Ethical and philosophical concerns about futarchy are profound: the separation of values and beliefs, the welfare metric problem, minority rights protection, and democratic accountability.
-
Advanced designs including scoring-rule-based markets, combinatorial markets, and privacy-preserving approaches offer potential improvements but remain largely theoretical.
The vision of governance by prediction remains provocative and contested. Whether decision markets will evolve from niche DAO experiments to mainstream governance tools depends on resolving the deep theoretical and practical challenges discussed in this chapter. What is clear is that the intellectual apparatus of prediction markets, mechanism design, and causal inference will be central to this endeavor.
What's Next
In Chapter 32, we turn to Combinatorial Prediction Markets, where we tackle the problem of predicting complex, multi-dimensional outcomes. Combinatorial markets generalize the conditional markets studied here to handle exponentially many possible states. We will learn how automated market makers can operate in these high-dimensional spaces, study computational complexity results, and implement practical combinatorial market mechanisms. The combinatorial framework provides the technical substrate on which large-scale decision markets must ultimately be built.