Skip to content

Methodology

S.I.R.O.S. (Systematic Institutional Research On Securities) is a data and analytics utility built on primary sources.

Every number on this site is computed once, in the data pipeline, and the pages only format and render it — they never calculate a financial metric themselves. This page states exactly how each figure is derived, the window and rounding behind it, and the sample size it rests on. It describes the arithmetic; it does not interpret the result, rate it, or suggest a position. Where a figure is a historical base rate, its sample size is stated wherever the figure appears.

COT positioning metrics

Source: the weekly CFTC Commitments of Traders report — the Traders in Financial Futures (TFF) report, futures-only, for financial markets (indices, forex, bonds), and the Disaggregated report, futures-only, for physical commodities (metals, energy). The speculative read is the Leveraged Funds net position for financial markets and the Managed Money net position for physical commodities — long contracts minus short contracts — for each tracked market.

Report sources and the Legacy toggle. Financial markets use the TFF report (Leveraged Funds = speculative, Dealer/Intermediary = hedger, plus Asset Managers and Other Reportables); physical commodities use the Disaggregated report (Managed Money = speculative, Producer/Merchant = hedger, plus Swap Dealer and Other Reportables). The per-asset page carries a Legacy toggle behind the primary report: the CFTC Legacy futures-only report covers every market (Commercial, Non-Commercial, Nonreportable). The computed metrics below are always taken from the primary (TFF / Disaggregated) report, in both toggle states; the Legacy view carries positions only, no ladder metrics.

Open interest, Change, Change %. Open interest is the total number of outstanding contracts (all traders) in the weekly report. Change and Change % are its week-over-week absolute and percentage differences. These are computed in the export (the site never diffs).

Speculative net. The raw input for every derived COT metric is lev_net = lev_long − lev_short, the Leveraged Funds net position in contracts. 1-week change is its simple week-over-week difference; momentum extends the same idea to net − net(4 weeks ago) and net − net(13 weeks ago). Net positioning is signed and can cross zero, so momentum is a difference in contracts, not a percent change (a percentage through zero is meaningless).

COT Index (0–100). A min–max rescaling of the speculative net over its trailing window — the Larry Williams COT Index: 100 × (net − min) / (max − min), where min and max are taken over the last 156 weekly reports (≈ 3 years) and the result is clipped to 0–100. A reading near 0 sits at the low end of the trailing 3-year range, near 100 at the high end. It is a position within a range, not a probability or a target.

z-score. The same net standardized against its own trailing 156-week window: z = (net − mean) / standard deviation. It expresses how far current positioning sits from its 3-year average in standard deviations. A reading is flagged an extreme when |z| > 2 or the COT Index is at or beyond 95 / 5.

Percentile rank (0–100). A rank-based alternative to the z-score over the same 156-week window: the share of weeks in the window whose net was below the current week, times 100. Being rank-based, it is robust to outliers — one extreme week does not distort it the way it can stretch a min–max range or a standard deviation.

Open-interest normalization (% OI). The net expressed as a share of total open interest: 100 × net / open interest. Because open interest grows over the years, the same contract count means less in a larger market; % OI makes positioning comparable across time and across markets of different size.

Window caveat. Each rolling metric needs history to exist. The pipeline requires at least half the window populated (about 78 of the 156 weeks) before it emits a value, so the earliest weeks of a market's history carry no COT Index, z-score, or percentile. Early in a series these figures rest on fewer than 156 observations — the full 3-year sample is only reached once the market has that much history.

Extreme. A reading is flagged an extreme when |z| > 2 or the COT Index is at or beyond 95 / 5 — equivalently, beyond the trailing 3-year 5th / 95th percentiles. It marks where positioning sits in its own history; it is not a signal.

The per-asset dashboard. Each market's page restates the same data several ways. The latest report table lists every category's long, short, and net positions, the one-week change in net, and each leg's share of open interest. The trader-group split bar shows each group's gross positions (long + short) as a percentage of all displayed groups' gross, so the segments sum to 100%. Positions by category plots the net (long − short) for each group; net vs price overlays any one category's net against the price; the open interest chart tracks total contracts outstanding; and weekly change breaks the selected group's week-over-week move into its long, short, and net legs. The price candles are weekly OHLC. These follow the primary / Legacy toggle.

Seasonal statistics

Source: daily price history from Yahoo Finance (auto-adjusted). All seasonal statistics are averages over complete past calendar years; the current, incomplete year is never mixed into an average — it is only drawn as an overlay.

Calendar alignment. Years differ in length and trading days, so returns are mapped onto a fixed 365-slot calendar (a non-leap reference year; Feb 29 is dropped). Within each year the cumulative return is measured from that year's first session (defined as 0%) and carried forward across weekends and holidays, so every slot holds the last known value. Days before the year's first trade read 0%.

Average path. For a chosen window, the blue line is the mean of those per-year cumulative-return paths, slot by slot — the typical journey through the calendar. The amber overlay is the current year so far, filled only up to the latest observation and left blank beyond it; it is never extrapolated and never enters the average.

Monthly average return. Closes are resampled to month-end and (this month / last month − 1) × 100 gives each month-over-month return; the figure shown is the mean of that month's returns across the window's complete years, rounded to two decimals.

Positive-close probability. The share of the window's years in which that month closed higher than it opened, in percent. It is a descriptive base rate over the sample — not a “win rate.” No position, entry, exit, or outcome is implied, and it says nothing about magnitude or about the next occurrence.

Windows and sample size. The pipeline precomputes every trailing window from 1 to 25 complete calendar years, so choosing a window on a page is a lookup, not a fresh calculation. A market with a short price history simply has fewer complete years than the window requests, so each statistic is exported with the actual number of years behind it. That count is shown as the n years column in the monthly table and in the hero captions — read every seasonal figure against its stated n, especially at the shorter windows where a single unusual year moves the average appreciably.

Low-sample flag and presentation. Futures tickers carry varying history on the data source, so usable depth differs across markets. A market with fewer than 10 complete calendar years is flagged low-sample — shown with a caution, never hidden (honesty rule) — and its per-asset page states its exact depth. On the overview and the monthly bars, a positive average return reads blue and a negative one amber (never red/green). The overview ranks each asset class by the current month's 15-year average return and shows the 1/5/10/15/25-year averages side by side so short-, intermediate-, and long-run seasonality read together.

Interest rates

Source: FRED (Federal Reserve Bank of St. Louis) for the Fed and ECB, and the BIS central-bank policy-rate dataset for the rest. This tool does no arithmetic beyond reshaping published levels — it reads a policy-rate series, finds the most recent change, and formats it.

Fed & ECB (FRED). The Fed maps to the Federal Funds Effective Rate and the ECB to the Deposit Facility Rate, from FRED, requested at monthly frequency, end-of-period — so each point is the rate in force at that month's close. For the Fed, the FOMC target range (the lower and upper bounds the Committee sets) is shown beside the effective rate, which trades inside that band. Current is the latest monthly observation; previous is the level before the most recent change.

Other banks (BIS). The UK, Japan, Switzerland, Canada, Australia and China take their rate from the BIS central-bank policy-rate dataset (WS_CBPOL) — each the bank's official policy rate. FRED's OECD central-bank-rate series for these economies were discontinued, and its remaining fallbacks were 3-month interbank rates rather than the policy rate, so BIS is used instead. All series are monthly, end-of-period, normalized to the same monthly shape so they align in the history chart. China's is the 1-year Loan Prime Rate (1Y LPR) from 20 August 2019 onward, and the 1-year benchmark lending rate before it — labelled 1Y LPR in the table.

Direction and the change threshold. The pipeline walks back from the latest month to the start of the current rate level and reads the level just before it. A month-to-month move smaller than 0.05 percentage points is treated as no change, because effective-rate series drift a basis point or two within a single policy setting; a real 25 bp policy move clears that threshold cleanly. Update cadence: monthly, after each bank's rate series is refreshed at its source.

Year-over-year CPI

Source: the published all-items consumer-price index for each economy — via FRED for the US and euro area, and the BIS long consumer-price dataset for the rest. This is the one metric a tool derives rather than reshapes — and it is derived in the pipeline, never in the page.

Data origins. The US uses the CPI for All Urban Consumers and the euro area the Harmonised Index of Consumer Prices, both from FRED. The UK, Japan, Canada, Switzerland and China take their all-items CPI index from the BIS long consumer-price dataset (WS_LONG_CPI, UNIT_MEASURE 628 = the index level, not BIS's ready-made year-on-year change): FRED's OECD CPI series for these economies were discontinued, so BIS is used instead. Every source is read as an index level and the year-over-year change is computed the same way for all of them.

Year-over-year inflation. For a monthly index level at month t: YoY = (level[t] / level[t−12] − 1) × 100, computed on contiguous monthly observations so that t−12 is exactly twelve months back. This is the standard headline-CPI inflation rate. It is rounded to one decimal place — the resolution at which headline CPI is quoted. Prior is the previous period's YoY rate.

Australia — quarterly cadence. Australia's headline CPI (ABS) is published quarterly, not monthly, so its index is read at quarterly frequency from the BIS dataset and its YoY is taken over four quarters rather than twelve months (level[t] / level[t−4] − 1). It is labelled quarterly beside the country name, and its staleness allowance is widened to about five months to accommodate the longer release-and-aggregation lag, so a normal one-quarter-behind reading is not mistaken for a dead feed.

Trend and release lag. Trend compares the latest period's YoY to the prior period's; a move smaller than 0.05 percentage points is treated as steady. A period's CPI is published a few weeks after it closes, so the latest available reading trails the calendar — the as-of stamp reflects the most recent period released, not today. Update cadence: monthly (quarterly for Australia), after each source refreshes.

Sources & caveats

Primary sources only. COT positioning comes from the CFTC (the Traders in Financial Futures and Disaggregated reports, futures-only); seasonality from daily price history via Yahoo Finance; interest rates and inflation from FRED (US and euro area) and the BIS (the rest — policy rates from WS_CBPOL, consumer prices from WS_LONG_CPI). Nothing on this site is sourced from, or modelled on, any competitor.

What these figures are not. Everything here is descriptive. There are no scores, ratings, signals, or buy/sell framing anywhere, by design. A COT Index near 100 or a z-score beyond +2 describes where positioning sits within its own history; it is not a forecast and not advice. Historical base rates describe a sample of the past — they carry no claim about the next observation.

Determinism. The pipeline is deterministic and idempotent: rerunning it on the same source data reproduces the same JSON, and the site is a static build over that JSON. When a source revises a past value (FRED and the CFTC both revise), the next run picks the revision up and the figures update accordingly.