MF
MarketForecastBeta
← Back to home

Methodology

How MarketForecast collects data, calculates technical indicators, and generates AI-powered market scenarios.

Overview

MarketForecast aggregates real-time market data from multiple public APIs, computes standard technical indicators from price history, and generates structured market analysis using a large language model (Claude by Anthropic). All analysis is refreshed on a scheduled basis and cached to ensure consistent, up-to-date information.

This platform is designed for informational and educational purposes. It presents data and model-generated analysis — not investment advice. See the disclaimer section below.

Where the Data Comes From

  • CoinGecko — all cryptocurrency prices and 180-day daily histories.
  • Alpha Vantage — energy spot prices (WTI, Brent, Henry Hub natural gas), sourced from the U.S. Energy Information Administration. These are official statistics published in arrears, so the page shows the observation date whenever it is more than a couple of days old.
  • Twelve Data — gold spot (XAU/USD) and the exchange-traded funds used as proxies for silver, platinum, palladium, copper, wheat, corn and sugar.
  • alternative.me — the Crypto Fear & Greed Index.

Where an asset is tracked through a fund rather than the commodity itself, the asset page says so directly above the price. A fund's share price follows the underlying's direction and volatility closely, but is not the same number — silver ETF shares do not cost what an ounce of silver costs, and we do not pretend otherwise.

Technical Indicators

All indicators are computed from the closing price history fetched from the data sources above. No third-party indicator libraries are used — calculations are implemented directly from standard definitions.

RSI (14)RSI = 100 − 100/(1+RS)Relative Strength Index over 14 periods. Above 70 = overbought, below 30 = oversold.
MACDEMA(12) − EMA(26)Moving Average Convergence Divergence. Positive = bullish momentum, negative = bearish.
Bollinger Band Position(Price − Lower) / (Upper − Lower)Where price sits within the 20-period Bollinger Bands. 0 = lower band, 1 = upper band, 0.5 = midpoint.
EMA50 Distance(Price − EMA50) / EMA50 × 100Percentage distance of current price from the 50-period Exponential Moving Average. Positive = price above EMA50.
ATR (14)Avg of True Range over 14 periodsAverage True Range measures market volatility. Higher ATR = larger expected daily price movement.

Market Regime Classification

Each asset is assigned one of four market regimes based on the relationship between current price, EMA20, EMA50, RSI, and average daily volatility:

  • ↑ UptrendPrice above EMA20 and EMA50, RSI above 52, low volatility. Consistent directional movement upward.
  • ↓ DowntrendPrice below EMA20 and EMA50, RSI below 48, low volatility. Consistent directional movement downward.
  • → SidewaysNo clear trend — price near moving averages with RSI in neutral zone (48–52).
  • ⚡ ChaoticAverage daily swing exceeds 4% — high volatility with no clear directional bias.

The Forecast Model

Every price range and every probability on this site comes from a statistical model, not from a language model. This distinction matters: a language model can write convincing analysis, but it cannot produce probabilities that mean anything numerically. Ours can, and they are checked.

The model works in four steps:

  1. Volatility. Daily log returns over the trailing 180 days are converted into an exponentially weighted volatility estimate (RiskMetrics, λ=0.94), so recent market conditions count for more than old ones.
  2. Horizon. That daily volatility is scaled to the 30-day forecast horizon by the square root of time, and given a Student-t shape so that large moves are not treated as impossible the way a normal distribution would treat them.
  3. Levels. Scenario boundaries are real technical levels — the recent swing high and swing low — rather than arbitrary round numbers.
  4. Probabilities. The probability of each scenario is the probability mass the fitted distribution places above the resistance level, between the two levels, and below the support level. This is why the numbers are rarely round, and why they differ between assets.

Exact parameters

  • EWMA decay λ = 0.94 (RiskMetrics standard)
  • Student-t degrees of freedom ν = 8 for the horizon distribution
  • Volatility inflation = 1.10, covering estimation error and volatility-of-volatility
  • Drift shrinkage = 0.15 of the trailing mean log return
  • Daily returns winsorised at 5 MAD before the volatility estimate
  • Levels from the 60-day swing high/low, held at least 0.5 horizon-sigma from spot
  • Horizon 30 days; history window 180 daily closes

The coverage figures below are only valid at these settings. ν was 4 in an earlier version and under-covered badly — 71% against a nominal 80% — because a standardized Student-t has narrow shoulders at equal variance, and thirty days of aggregation pulls the distribution toward normal anyway.

The central forecast is deliberately close to the current price. Over a 30-day horizon, a random walk is an extremely difficult benchmark to beat on point accuracy, and models that claim to beat it usually do so by extrapolating recent trends — which measurably increases error. What the model does claim to get right is the width of the range and the probabilities attached to it.

How We Check the Model

The model is scored by walk-forward backtesting. For each historical date, the forecast is rebuilt using only the prices available on that date, then compared against what actually happened 30 days later. The model never sees the outcome it is being graded on.

Because we forecast a distribution rather than a single number, the meaningful test is calibration: when the model says there is an 80% chance the price lands in a given range, does that happen about 80% of the time?

Two measurements, and they disagree

Test80% band50% bandSamples
Simulated market (GARCH + jumps)80.7%50.4%9,720
Real history — BTC, ETH, SOL, gold70.8%52.5%120

The simulation is where the model's constants were chosen, so it is the weaker evidence — it shows the model works on data generated by the model's own assumptions. The real-history number is the one to weigh, and it is nine points below nominal.

It is also not conclusive. Those 120 windows overlap by 90%, leaving roughly a dozen independent observations — a standard error near 11 points, so 70.8% sits inside the range you would expect from a perfectly calibrated model measured this crudely. The test cannot currently tell a good model from a bad one, which is a statement about the test, not a defence of the model.

Point error on the same real-history test was 8.11% median absolute error against a random walk's 7.72% — very slightly worse, consistent with the claim that the model does not beat a random walk on point accuracy. Naive trend extrapolation came in at 18.07%, more than twice our error.

What a “bad” score looks like when you only have 180 days

An earlier version of this page reported two results as model defects: a Brier score of 0.5125 against 0.45 for a base-rate baseline — negative skill — and a bull scenario that did not occur once in 120 windows. Both readings were wrong, and the correction is worth showing.

To find out what those numbers should look like, we ran the identical test against series generated by geometric Brownian motion — a process this model is correctly specified for, so every result is pure sampling noise rather than model error. Given the same 180 days across the same four assets, 500 times over, a correct model scores (reproduce with npx tsx scripts/calibrate-forecast.ts, section 5):

Metric5th pctMedian95th pctOurs
Brier skill−0.62−0.22−0.06−0.14 (73rd pct)
80% coverage67.5%80.8%91.7%70.8% (10th pct)

The reference median for Brier skill is negative. The baseline is fitted to the very outcomes it is scored against, which is a forecast nobody could have made in advance, and on a short trending sample that hindsight is close to unbeatable. Our −0.14 sits at the 73rd percentile of what a correct model produces here — above median.

The bull scenario needs one more correction. Three of our four assets are crypto that fell together, so they are nowhere near four independent tests. Simulated as independent, a correct model produces bull=0 across all four in only 1.8% of runs — which would be damning. Simulated with the correlation such assets actually have, it happens in 14% of runs, and that is before accounting for the fact that our window was a sustained decline while the reference has no trend at all. Uncommon, then, but not the smoking gun the earlier text made it out to be.

Coverage is the one figure that still deserves the amber. At the 10th percentile it is low — inside the range a correct model produces, but near the bottom of it. It is also the metric worth trusting most, because unlike the scenario probabilities it does not depend on where we chose to draw the boundaries. The honest summary: this sample is too small to convict the model or acquit it, and the fix is more history, not more tuning. The live ledger is accumulating it.

Honest limitations

  • Neither calibration figure above is a live track record. One comes from simulation, the other from a backtest small enough that it settles nothing. Every forecast we publish is recorded before its outcome exists, so a real answer will appear on the accuracy page as those mature.
  • The model knows nothing about news, regulation, hacks, or macro announcements. It extrapolates volatility, and any event outside that is by definition outside the model.
  • Volatility estimates react to changes with a lag. A sudden shift in regime will make the bands too narrow until the estimate catches up.
  • Probabilities are conditional on the model being right about the shape of the distribution. They are not guarantees, and no probability on this site is ever 0% or 100%.
  • The bull and bear boundaries are not equidistant. Bull means clearing the 60-day high, which after a drawdown can sit far above spot, while bear means losing a low that may be close by — so a low bull probability often means the bar was set high, not that the model is bearish. We tested capping both boundaries at a fixed multiple of volatility to force symmetry; it made calibration measurably worse on every simulated regime, so it was not adopted. Each scenario states its own threshold and distance from spot instead, so you can see the asymmetry rather than have it hidden inside a percentage.

Written Commentary

The prose accompanying each forecast is written by Claude (Anthropic). It receives the model's output — the levels, the ranges, the probabilities — and is instructed to explain them, not to produce its own. Targets and probabilities shown on the page are taken from the model regardless of what the language model returns, so the commentary cannot introduce numbers the model did not generate.

Commentary is regenerated weekly per asset and cached, while the numbers themselves are recomputed from live prices on every refresh. If the language model is unavailable, a deterministic template describes the same figures.

What This Site Does Not Do

  • Provide personalised investment advice or recommendations
  • Predict future prices with any guaranteed accuracy
  • Account for tax implications of any transactions
  • Consider individual financial circumstances or risk tolerance
  • Offer brokerage, custody, or trading services

Disclaimer

All content on MarketForecast is provided for informational and educational purposes only. Nothing on this website constitutes financial, investment, legal, or tax advice.

Investing in cryptocurrencies and commodities involves substantial risk of loss. Past performance is not indicative of future results. Price predictions and scenario analyses are speculative by nature and may not reflect future market conditions.

Always conduct your own research and consult a qualified financial advisor before making any investment decision. MarketForecast is not a registered investment advisor and does not hold any financial regulatory licence.