In On Floating Grain Prices, I discuss why we’d like to switch Grain from a fixed-price redemption to a floating, market-driven price. However, constructing a reasonably robust market with only a single buyer is challenging.
Before proposing a mechanism, it’s helpful to think about what constraints we are trying to satisfy, as well as what constraints we are not trying to satisfy.
- market driven price: the price should be set based on market dynamics (i.e. relative supply and demand)
- simple Buyer policy: the Buyer should be able to set a relatively simple and consistent policy (e.g. buy $ worth of Grain every week), rather than requiring lots of ad-hoc decision making
- simple Seller decision making: the Sellers should be able to make relatively simple decisions (e.g. offer to sell ¤ Grain at price p), not complicated price schedules
- price stability: the price should be relatively stable (i.e. not spike wildly if there’s a week when no-one is selling)
- market clearing: It’s OK if in a given sale, the Buyer isn’t able to buy as much as they want, or if the Sellers aren’t able to sell as much as they want.
Every sale period, the Buyer will have a “Buy Amount”
D of dollars they wish to spend on Grain (e.g. $10,000). There will also be an anchor price
A (e.g. $1) which is the price per Grain that parties are expecting for the sale.
During the sale period, contributors to SourceCred who wish to sell Grain can post (and update) offers to sell Grain; an offer is considered valid if the contributor has at least that much Grain to sell, and the Buyer can legally purchase Grain from them (e.g. the contributor is not from a country on which the US has imposed financial sanctions).
At the end of the sale period, we tally up the total Grain supplied
S, and compute the implied clearing price
D/S. However, there’s no guarantee that the clearing price will be anywhere near the anchor price. Using the numbers above, if there is only 1000 Grain supplied, the clearing price would be $10, but if there were 100,000 Grain supplied, the clearing price would be $0.1.
Therefore, we will also have a volatility cap parameter,
v, which determines how much the price can vary from the clearing price. We effectively have three prices: the anchor price
A, the minimum price
A / (1 + v), and the maximum price
A * (1 + v). Continuing the example, if
v=0.2, then the minimum price would be $0.83, and the maximum price would be $1.20.
We then compute the sale price
P using the following logic:
- If the clearing price is less than the minimum price, then the market fails to clear due to an excess of supply. The buyer fill sellers’ orders pro-rata at the minimum price.
- If the clearing price is between the minimum and maximum price, then the clearing price is the sale price, and all sell orders are filled at the clearing price.
- If the clearing price is greater than the maximum price, then the market fails to clear due to a shortage of supply, and the buyer fills every sell order at the maximum price.
The volatility parameter and the buy amount will both be posted publicly at the start of each sale period, and contributors can then post orders throughout the period. For the time being, I intend to manually choose the volatility parameter. I intend for it to start relatively high (e.g.
v=0.1) and then decrease as the market starts to clear consistently.
Every period, the anchor price will be the previous week’s sale price. Therefore, if there is a consistent mismatch between supply and demand, the price will adjust until it is resolved.
A Live Model
If you’d like to play with a live model of this system, consult this Observable notebook.
This construction satisfies all of the constraints listed up top, and has the benefit of being very simple. Its main tradeoff is expressed in the volatility parameter. If volatility is too low, the price is predictable but the market may fail to clear. If volatility is too high, the market will always clear, but may do so at a surprising price.
By virtue of its simplicity, this mechanism seems relatively robust to gaming. There might be some “timing” style gaming where contributors put really big sell orders upfront (implying a low price, discouraging others from selling) and then retract most of their order at the last minute to get a higher price. I ask contributors not to engage in this style of gaming. If this (or other) styles of gaming start being an issue, we will update the sale mechanisms. (For example, we might remove the ability to update or remove sell orders after posting them.)
I considered having an explicit mechanism for setting the volatility parameter (e.g. volatility increases if the market doesn’t clear, decreases if it does). However, doing so introduced new opportunities for gaming (e.g. contributors withholding sales to pump the volatility parameter and move the price faster, etc). I don’t think there’s any need to systematize the volatility right now, and having a trusted human choosing the parameter makes it harder to game.
Originally, I considered a construction where each Grain sale had three prices: a low price, an anchor price, and a high price. Sellers would decide how much Grain to offer at every price, and then the market would clear at the lowest satisfying price. I decided against this approach, both because it required much more decision making from sellers, and because it seemed more susceptible to gaming.
Request for comments
Please let me know what you think of this mechanism and (if you are expecting to sell Grain in the coming year) whether you think it will work for you. I’m also very interested in hearing potential attacks or exploits against this construction.