Skip to main content

Calculating Predictions

In this example we will take a look at how you can parse the the state of a market and calculate the current prediction based on the outcome asset prices.

1. Set up

We boot up the sdk in full context mode.

import {
calcSpotPrice,
create,
FullContext,
getIndexOf,
IOMarketOutcomeAssetId,
mainnet,
Market,
Sdk,
} from "@zeitgeistpm/sdk";

const sdk: Sdk<FullContext> = await create(mainnet());

2. Fetch Market and Pool

Then we fetch the market and pool we want to query the prediction for.

const marketId = 90;

const market: Market<FullContext> = await sdk.model.markets
.get({ marketId })
.then((market) => market.unwrap()!);

const pool = await sdk.model.swaps
.getPool({ marketId })
.then((pool) => pool.unwrap()!);

3. Fetching Base asset weight and balance.

Next we get the assets of the pool and fetch the pools base asset balance and base asset weight.

const assets = pool
.getAssetIds()
.filter(IOMarketOutcomeAssetId.is.bind(IOMarketOutcomeAssetId));

const poolBaseAssetBalance = await pool.getAssetBalance({ Ztg: null });
const poolBaseAssetWeight = await pool.getAssetWeight({ Ztg: null }).unwrap()!;

4. Calculating Prices

Now we can iterate through the markets assets, fetch their balances, weights and correlated market metadata category. Then we can calculate the price for the given assets.

к сведению

The zeitgeist node also supports rpc calls to fetch asset prices. Read more about them here.

const assetPrices = await Promise.all(
assets.map(async (asset) => {
const assetBalance = await pool.getAssetBalance(asset);
const assetWeight = pool.getAssetWeight(asset).unwrap()!;
const category = market.categories?.[getIndexOf(asset)];

const price = calcSpotPrice(
poolBaseAssetBalance,
poolBaseAssetWeight,
assetBalance,
assetWeight,
0
);

return {
name: category?.name ?? asset.toString(),
price,
};
})
);
примечание

Note that the category metadata can be missing on markets.

5. Printing the current prediction

Now we can get the highest asset price and print the current prediction.

к сведению

Here we are assuming the market is a Categorical market. To see how you can calculate the value if the market is a Scalar market, jump to the next section.

const predictedPrice = assetPrices
.sort((a, b) => (a.price.gt(b.price) ? -1 : 1))
.at(0)!;

console.log(
`${market.question}`,
`The prediction is ${predictedPrice.name} at ${predictedValue.toFixed(2)}`
);

Based on the market data at time of writing the output will be:

Will a DEX be deployed on Statemint or Statemine before the end of Q2 2023?
The prediction is `no` at 0.80767457218061127617

Full Code

Go to the full code snippet for this example