Skip to content
OraMarkets
Methodology

How the numbers are made

Every formula the platform uses, in plain words. Financial arithmetic runs on 40-digit decimals and is rounded once, for display.

Unit conversions

One metric tonne is 2,204.62262185 lb. Everything else follows from that constant.

USD/MT  = US cents/lb x 22.0462262185
USD/lb  = US cents/lb / 100
USD/kg  = USD/MT / 1,000
UGX/kg  = USD/kg x USD/UGX

Robusta is already quoted in USD/MT. A converted price is a mathematical equivalent of the futures price. It is not a Ugandan physical buying price, and the platform labels it that way wherever it appears.

Differentials

Robusta differentials are entered in USD/MT, Arabica differentials in US cents/lb, because those are the units of the futures they sit on. The display keeps your native input; every calculation downstream uses USD/MT. Cents/lb are never added to or subtracted from USD/MT.

outright (native) = futures + differential
outright (USD/MT) = to_USD_MT(futures) + to_USD_MT(differential)

Exporter netback and trade margin

The Netback, Trade Margin and Maximum Buying Price screens are three views of one trade engine, so they cannot disagree about the same trade.

export kg      = kg bought x recovery
revenue (UGX)  = outright USD/MT x export MT x USD/UGX
coffee cost    = kg bought x purchase price (UGX/kg)
finance        = coffee cost x annual rate x days / 365
profit         = revenue - coffee - processing - logistics - finance - other
margin %       = profit / revenue

Each cost line carries a basis: per kg bought, per kg exported, per MT exported, per 60 kg bag, per lot, or a percentage of sales. Recovery is always an input; there is no fixed Kiboko to FAQ factor.

Break-even is solved exactly, including costs that move with the sale value. With p the total of percentage-of-sales costs:

break-even revenue  R* = (costs that do not move with revenue) / (1 - p)
break-even outright    = R* / (export MT x USD/UGX)
break-even futures     = break-even outright - differential
break-even differential = break-even outright - futures

Maximum buying price

The highest price per kg bought that still earns your target margin. Interest is charged on the price paid, so it is solved for rather than added afterwards:

max price = (revenue - non-coffee costs - target) / (kg bought x (1 + rate x days / 365))

The target can be USD per MT exported, UGX per kg bought, or a percentage of sales. Sensitivity rows re-run the same engine with London or New York moved by 50 USD/MT or 5 c/lb, and with the shilling 1% weaker or stronger.

Hedging and position valuation

Robusta contract = 10 MT
Coffee C contract = 37,500 lb = 37,500 / 2,204.62262185 MT = 17.00971... MT
contracts = exposure MT x hedge % / contract MT   (rounded to whole contracts last)

Scenario tables show the physical and futures legs separately: a long physical position gains when futures rise and a short hedge loses the same amount per tonne hedged. Differential (basis) risk is not modelled. This is informational analytics; Ora Markets does not execute trades.

Forward curves, spreads and the arbitrage

Contracts are generated from each market’s delivery-month cycle, and expiry dates are modelled from the exchange rules and a maintained holiday calendar. The front month is the first contract not yet past first notice; a contract in delivery is shown and flagged but kept out of the curve’s structure.

Structure is calculated segment by segment. A segment where the deferred contract is higher is contango; lower is backwardation; a move under 0.10% of price is flat. The annualised figure scales the segment’s spread to a year. Calendar spreads are quoted near minus far, as the coffee trade quotes them.

The Arabica/Robusta arbitrage converts Arabica to USD/MT first, then subtracts Robusta. The ratio divides the two USD/MT prices.

The Uganda physical composite

For one grade, in one region, the composite is built in this order:

  1. Only buying-price submissions are used.
  2. Impossible values outside plausibility bounds for the grade are rejected.
  3. Unverified contributors are excluded.
  4. Prices older than 30 hours are outside the freshness window.
  5. One contributor, one vote: a contributor’s latest price stands; two within twelve hours are a duplicate.
  6. With four or more contributors, a price further than 3.5 x 1.4826 x the median absolute deviation from the median is rejected as an outlier. The median absolute deviation is used because it is not dragged around by the outliers it is looking for.
  7. If fewer than 3 distinct contributors remain, nothing is published. The platform shows “Insufficient current observations”. A missing composite is never estimated, filled in, or carried forward as current.
  8. Otherwise the composite publishes the low, high and median, and a volume-weighted median where every price carries a quantity band.

A median that moves more than 8% against the previous published value is flagged for review, not rejected: coffee prices do gap. Contributor identities are never published; the platform shows how many valid contributors stand behind a number and what kind of business they are.

Freshness

Freshness is computed every time a value is shown, from when it was observed, the delay the source is licensed at, and whether its market is in session.

  • LIVE or a stated delay: market open and the value is within the source’s promised latency.
  • UPDATED N MIN AGO: older than promised but not yet stale.
  • STALE: past the stale threshold. The value stays visible but is marked.
  • MARKET CLOSED: the last settlement of a closed market, correct until the next session.
  • SOURCE UNAVAILABLE: the source returned nothing. No substitute is shown.

Demonstration data is only ever used in demo mode, and never as a fallback for a failed licensed source.

Market hours

Whether a market is open is decided in the exchange’s own timezone from its regular session and holiday calendar: ICE Europe Robusta in London time, ICE US Coffee C in New York time. The viewer’s clock never decides it. Beyond the maintained holiday calendar, status reads “session unknown” rather than assuming a trading day.

Technical indicators

Simple and exponential moving averages, Wilder’s RSI (14), MACD (12, 26, 9) and Bollinger Bands (20, 2 population standard deviations) are computed from the full fetched history, including lookback before the visible range, so a 200-day average is correct from the first bar shown. Indicators are chart analytics and never feed a trade calculation.