Toggle menu
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

Consumer Price Index: Difference between revisions

From Prosperity SMP Wiki
Initial content
 
Redact exact basket weights and manipulation-defense thresholds (keep page substance)
 
(2 intermediate revisions by one other user not shown)
Line 1: Line 1:
The '''Consumer Price Index''' (CPI) is a custom-built price tracking system on Prosperity SMP. It measures the cost of a fixed basket of goods using real player-to-player trade data, producing a single index number that represents the overall price level of the server economy. The CPI feeds directly into the [[Monetary policy engine]] and is reported weekly to the community via Discord.
The '''Consumer Price Index''' (CPI) is a custom-built price tracking system on Prosperity SMP. It measures the cost of a fixed basket of goods using real player-to-player trade data, producing a single index number that represents the overall price level. The CPI feeds directly into the [[Monetary policy engine]] and is reported weekly via Discord.


== What the CPI measures ==
== What it measures ==
The CPI tracks the price of a weighted basket of 27 common items across five categories. It answers the question: "Are things getting more or less expensive on the server?"
The CPI tracks the price of a weighted basket of 27 common items. It answers: are things getting more or less expensive?


A rising CPI means prices are going up (inflation). A falling CPI means prices are dropping (deflation). A stable CPI means the economy is in equilibrium.
A rising CPI means inflation. A falling CPI means deflation. A stable CPI means equilibrium.
 
Since 2026-06-09 the system tracks '''two baskets''': the ''policy basket'' of curated staples described below (the cautious signal used for policy decisions), and an ''observed market basket'' built from what players actually trade, which adapts to real market activity.


== Basket composition ==
== Basket composition ==
The policy CPI basket is weighted to reflect typical player spending patterns:
The policy basket is weighted toward everyday staples, not luxury items:


{| class="wikitable" style="width:100%;"
{| class="wikitable" style="width:100%;"
|-
|-
! Category !! Weight !! Items
! Category !! Key items
|-
|-
| Building materials || 20% || Cobblestone, stone, deepslate, sand, gravel, logs, planks, sandstone, glass, bricks
| Building materials || Cobblestone, stone, deepslate, logs, planks, sand, glass
|-
|-
| Basic inputs || 30% || Iron ingot (12%), coal (6%), copper ingot (4%), gold ingot (4%), redstone (4%)
| Basic inputs || Iron ingot, coal, copper, gold, redstone
|-
|-
| Food and farming || 20% || Wheat, potato, carrot, cooked beef, cooked chicken, cooked porkchop, sugar cane, paper
| Food and farming || Wheat, potato, carrot, cooked meats, sugar cane
|-
|-
| Utility consumables || 15% || Arrow, torch, firework rocket, lapis lazuli
| Utility consumables || Arrow, torch, firework rocket, lapis lazuli
|-
|-
| Premium commodities || 15% || Diamond (8%), emerald (3%), netherite scrap (4%)
| Premium commodities || Diamond, emerald, netherite scrap
|}
|}


Diamond is weighted at 8%, not 30% — the basket is deliberately tilted toward everyday staples rather than luxury items. A few large diamond trades should not distort the overall price signal.
Premium items carry deliberately modest weights — the basket is tilted toward staples so a few large trades cannot distort the signal. The exact weights are internal.


== Index formula ==
== Index formula ==
The CPI uses a '''winsorized geometric mean''', the same mathematical approach used by real-world national statistics offices:
The CPI uses a '''winsorized geometric mean''', the same approach used by real-world national statistics offices:


: '''P = exp( SUM of weight_i x ln(price_i_trimmed) )'''
: '''P = exp( SUM of weight_i x ln(price_i_trimmed) )'''


Where each item price is winsorized (extreme outliers in the top and bottom 10% are clamped) before the geometric mean is computed. This prevents a single unusual trade from skewing the index.
Each item's observed unit prices are sorted, then the extreme tails are clamped (winsorized) before the geometric mean is computed. This prevents a single outlier trade from skewing the index.


== Data source ==
== Data source ==
The CPI is computed exclusively from '''completed, non-simulated, player-to-player''' [[ChestShop]] transactions:
The CPI is computed from '''completed, non-simulated, player-to-player''' [[ChestShop]] transactions only:


* Only real trades between players count. [[Simulated ChestShop]] activity is excluded.
* Only real trades count. [[Simulated ChestShop]] activity is tagged <code>simulated: true</code> and excluded.
* Only completed sales count. Listed prices (signs with no actual purchase) are tracked separately and do not affect the policy CPI.
* Only completed sales count, not listed prices.
* The rolling window covers the last 7 days of trade data.
* Rolling 7-day window.


This separation prevents a feedback loop where the [[Simulated ChestShop|Sim Shop]] buying activity inflates the CPI, causing the Sim Shop to buy at higher prices, causing CPI to rise further.
This separation prevents a feedback loop where [[Simulated ChestShop|Sim Shop]] activity inflates CPI, which causes the Sim Shop to adjust prices upward, which inflates CPI further.


== Manipulation defenses ==
== Manipulation defenses ==
The CPI includes several custom-built defenses against price manipulation:


=== Depth gates ===
=== Depth gates ===
An item is excluded from the policy basket if it does not meet minimum thresholds:
An item is excluded from the policy basket unless it clears minimum thresholds for transaction depth and for the number of unique buyers and sellers in the window. The exact gates are internal.
* At least 10 transactions in the 7-day window
* At least 3 unique buyers
* At least 3 unique sellers


Items below these thresholds still appear in the <code>/market</code> command with a low-confidence flag, but they do not influence the engine.
Items below these thresholds still appear in <code>/market</code> with a low-confidence flag but do not influence the engine.


=== Rate-of-change clamp ===
=== Rate-of-change clamp ===
No item can move the CPI by more than 8% per week. If an item price jumps more than 8% from the prior week, the excess is attributed to possible manipulation and dampened.
No single item can move faster than an internal weekly limit. Excess movement is dampened.


=== Manipulation risk score ===
=== Manipulation risk score ===
Each item receives a composite risk score based on five factors (each weighted equally at 0.20):
Each item receives a composite score from five equally-weighted factors:
 
# Low transaction count
# Low transaction count (fewer than 10)
# Low buyer diversity
# Low buyer diversity (fewer than 3 unique buyers)
# Low seller diversity
# Low seller diversity (fewer than 3 unique sellers)
# Account concentration (volume dominated by a single account)
# Account concentration (one account responsible for more than 60% of trade volume)
# Category outlier (a price moving far out of line with its category)
# Category outlier (item moved more than 2 standard deviations from its category average)


When the risk score exceeds 0.5, the system applies asymmetric trust dampening — upward price moves are partially discounted while downward moves are trusted at face value. This reflects the reality that most market manipulation in Minecraft economies is bullish (inflating prices to profit from the Sim Shop).
When risk is high, upward price moves are partially dampened while downward moves are trusted. This reflects that most MC economy manipulation is bullish.


=== Median lag ===
=== Median lag ===
The [[Simulated ChestShop]] reads a CPI snapshot that is '''7 days old''', not the current snapshot. This means a manipulator would need to sustain artificial prices for over a week before the Sim Shop adjusts — raising the cost and risk of manipulation.
The [[Simulated ChestShop]] reads a '''lagged''' CPI snapshot, not current prices, so short-lived price spikes never reach it.


== Per-item confidence ==
== Per-item confidence ==
Each item in the basket receives its own confidence score:
Each basket item receives its own confidence score based on transaction depth and participant diversity:


: '''confidence = sqrt(depth_score x diversity_score)'''
: '''confidence = sqrt(depth_score x diversity_score)'''


Where depth_score reflects transaction count (maxes at 50 trades) and diversity_score reflects unique participant count (maxes at 8 unique buyers + sellers). Items with low confidence contribute less to the overall basket index.
Items with low confidence contribute less to the overall index.
 
== Player-facing: /market command ==
Players can check current market prices using <code>/market</code>:


== Player-facing: /market ==
{| class="wikitable"
{| class="wikitable"
|-
|-
! Command !! What it shows
! Command !! Shows
|-
|-
| <code>/market</code> || Top 10 items by total dollar volume traded (last 7 days)
| <code>/market</code> || Top 10 items by 7-day trading volume
|-
|-
| <code>/market &lt;item&gt;</code> || Median price, fair range (25th-75th percentile), volume, category
| <code>/market &lt;item&gt;</code> || Median price, fair range (25th-75th percentile), volume, category
|}
|}


The <code>/market</code> command shows real player-to-player data only. It does '''not''' reveal the Sim Shop buy price, CentralBank balance, or engine recommendations.
The <code>/market</code> command shows real player data only. It does '''not''' reveal Sim Shop buy prices, CentralBank balance, or engine state.


== Weekly Discord report ==
== Weekly Discord report ==
Every Monday at midnight, an automated report posts to the server Discord with:
Every Monday, an automated report posts to Discord showing total turnover, top items by value, and per-item medians. Same data pipeline as the policy CPI but formatted as a public summary.
* Total items traded and turnover
* Top 10 items by value
* Per-item median prices
 
This report uses the same data pipeline as the policy CPI but is formatted as a public-facing summary.


== Commodity index ==
== Commodity index ==
In addition to the policy CPI (which drives the [[Monetary policy engine]]), the system computes a separate '''commodity index''' tracking premium items (diamond, gold, netherite, emerald, ancient debris). This index is for dashboard display only and does not influence policy decisions.
Separately from the policy CPI, the system computes a '''commodity index''' tracking premium items (diamond, gold, netherite, emerald). This is dashboard-only and does not influence the [[Monetary policy engine]].


== See also ==
== See also ==
* [[Monetary policy engine]] — the system that consumes the CPI
* [[Monetary policy engine]] — consumes the CPI for recommendations
* [[Economy]] — how the economy works
* [[Economy]] — how money flows through the server
* [[Simulated ChestShop]] — the market activity system (excluded from CPI)
* [[Simulated ChestShop]] — excluded from CPI by design
* [[Trading]] — how trading works on the server
* [[Trading]] — how trading works
* [[ChestShop]] — the shop system that generates CPI data
* [[ChestShop]] — the shop system generating CPI data


[[Category:Systems]]
[[Category:Systems]]

Latest revision as of 12:11, 21 July 2026

The Consumer Price Index (CPI) is a custom-built price tracking system on Prosperity SMP. It measures the cost of a fixed basket of goods using real player-to-player trade data, producing a single index number that represents the overall price level. The CPI feeds directly into the Monetary policy engine and is reported weekly via Discord.

What it measures

The CPI tracks the price of a weighted basket of 27 common items. It answers: are things getting more or less expensive?

A rising CPI means inflation. A falling CPI means deflation. A stable CPI means equilibrium.

Since 2026-06-09 the system tracks two baskets: the policy basket of curated staples described below (the cautious signal used for policy decisions), and an observed market basket built from what players actually trade, which adapts to real market activity.

Basket composition

The policy basket is weighted toward everyday staples, not luxury items:

Category Key items
Building materials Cobblestone, stone, deepslate, logs, planks, sand, glass
Basic inputs Iron ingot, coal, copper, gold, redstone
Food and farming Wheat, potato, carrot, cooked meats, sugar cane
Utility consumables Arrow, torch, firework rocket, lapis lazuli
Premium commodities Diamond, emerald, netherite scrap

Premium items carry deliberately modest weights — the basket is tilted toward staples so a few large trades cannot distort the signal. The exact weights are internal.

Index formula

The CPI uses a winsorized geometric mean, the same approach used by real-world national statistics offices:

P = exp( SUM of weight_i x ln(price_i_trimmed) )

Each item's observed unit prices are sorted, then the extreme tails are clamped (winsorized) before the geometric mean is computed. This prevents a single outlier trade from skewing the index.

Data source

The CPI is computed from completed, non-simulated, player-to-player ChestShop transactions only:

  • Only real trades count. Simulated ChestShop activity is tagged simulated: true and excluded.
  • Only completed sales count, not listed prices.
  • Rolling 7-day window.

This separation prevents a feedback loop where Sim Shop activity inflates CPI, which causes the Sim Shop to adjust prices upward, which inflates CPI further.

Manipulation defenses

Depth gates

An item is excluded from the policy basket unless it clears minimum thresholds for transaction depth and for the number of unique buyers and sellers in the window. The exact gates are internal.

Items below these thresholds still appear in /market with a low-confidence flag but do not influence the engine.

Rate-of-change clamp

No single item can move faster than an internal weekly limit. Excess movement is dampened.

Manipulation risk score

Each item receives a composite score from five equally-weighted factors:

  1. Low transaction count
  2. Low buyer diversity
  3. Low seller diversity
  4. Account concentration (volume dominated by a single account)
  5. Category outlier (a price moving far out of line with its category)

When risk is high, upward price moves are partially dampened while downward moves are trusted. This reflects that most MC economy manipulation is bullish.

Median lag

The Simulated ChestShop reads a lagged CPI snapshot, not current prices, so short-lived price spikes never reach it.

Per-item confidence

Each basket item receives its own confidence score based on transaction depth and participant diversity:

confidence = sqrt(depth_score x diversity_score)

Items with low confidence contribute less to the overall index.

Player-facing: /market

Command Shows
/market Top 10 items by 7-day trading volume
/market <item> Median price, fair range (25th-75th percentile), volume, category

The /market command shows real player data only. It does not reveal Sim Shop buy prices, CentralBank balance, or engine state.

Weekly Discord report

Every Monday, an automated report posts to Discord showing total turnover, top items by value, and per-item medians. Same data pipeline as the policy CPI but formatted as a public summary.

Commodity index

Separately from the policy CPI, the system computes a commodity index tracking premium items (diamond, gold, netherite, emerald). This is dashboard-only and does not influence the Monetary policy engine.

See also