FINRA Margin Debt Statistics, Explained
FINRA margin debt statistics explained: the rule behind the filing, the third week release, the four to seven week lag, and how to read the history since 1997.
FINRA margin debt statistics are the monthly tally of how much investors have borrowed against their brokerage accounts, collected from every broker that carries margin accounts for customers. The headline figure is one dollar total of customer debit balances, measured as of the last business day of the month. It reaches the public in the third week of the following month, which leaves it four to seven weeks old on arrival.
What FINRA margin debt statistics measure
The filing sits under FINRA Rule 4521(d). Each member carrying margin accounts for customers submits, on a settlement date basis, as of the last business day of the month, the total of all debit balances in securities margin accounts and the total of all free credit balances in all cash accounts and all securities margin accounts.
Those two totals are the whole series. A debit balance is a loan: the dollars a customer owes a broker for securities bought with borrowed money. Summed across the industry, that is the number quoted as margin debt. A free credit balance is the other side, customer cash sitting at the broker and payable on demand, split in the file between cash accounts and margin accounts.
Four details change how the numbers read.
- Debit balances go in gross, with short market values included rather than netted against short credit balances.
- Free credit balances leave out short account balances and special memorandum accounts.
- Settlement date basis means a trade counts on the day it settles rather than the day it prints. Under T+1 settlement, a purchase made in the final session of a month settles in the next month and lands in the next month's figure.
- Several account types sit outside the collection entirely, including accounts of other FINRA members, DVP and RVP accounts, and non-securities accounts.
The form is due as promptly as possible after month end, and no later than the sixth business day of the following month. Publication comes later.
When is FINRA margin debt data released?
FINRA generally publishes updates to the margin statistics in the third week of the month following the reference month. Firms have filed by the sixth business day; the aggregate posts roughly two weeks after that. There is no fixed calendar date announced in advance, which is a real difference from the short interest release calendar, where settlement dates and dissemination dates are published a year ahead.
To see what that gap costs a reader, take the 20th of the following month as a stand-in for the third-week posting and measure the market across the interval. The panel below runs the last year and a half of month ends: the as-of date, the stand-in release date, the count of regular sessions in between, and what SPY did over the stretch.
The exact SQL behind every number
WITH daily AS
(
SELECT
toDate(toTimeZone(window_start, 'America/New_York')) AS d,
argMax(close, window_start) AS px
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= toDateTime('2024-11-01 00:00:00')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) >= 570
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) < 960
GROUP BY d
),
reference_month AS
(
SELECT
toStartOfMonth(d) AS m,
max(d) AS as_of,
argMax(px, d) AS as_of_close
FROM daily
GROUP BY m
),
release AS
(
SELECT
m,
as_of,
as_of_close,
addDays(toStartOfMonth(addMonths(m, 1)), 19) AS release_day
FROM reference_month
)
SELECT
formatDateTime(r.m, '%Y-%m') AS month,
any(formatDateTime(r.as_of, '%b %e')) AS as_of_label,
any(formatDateTime(r.release_day, '%b %e')) AS release_label,
count() AS sessions_count,
round(100 * (toFloat64(argMax(d.px, d.d))
/ toFloat64(any(r.as_of_close)) - 1), 2) AS spy_change_pct
FROM release AS r
CROSS JOIN daily AS d
WHERE d.d > r.as_of
AND d.d <= r.release_day
AND r.release_day < today()
GROUP BY r.m
ORDER BY r.mOver the most recent completed interval, from Jun 30 to Jul 20, the market held 13 regular sessions and SPY moved -0.57%. Anyone reading the margin figure on the day it posts is reading a snapshot taken that many sessions earlier.
How stale is margin debt when you read it?
The month-end snapshot is the freshest thing in the release, about three weeks old. Borrowing that happened in the first days of the reference month is about seven weeks old. That is the four to seven week range, and it is a property of the schedule rather than of any particular month.
The next panel widens the same measurement to every month end back to 2006, and sorts the intervals by how far the market travelled inside them.
The exact SQL behind every number
WITH daily AS
(
SELECT
toDate(toTimeZone(window_start, 'America/New_York')) AS d,
argMax(close, window_start) AS px
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= toDateTime('2006-01-01 00:00:00')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) >= 570
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) < 960
GROUP BY d
),
reference_month AS
(
SELECT
toStartOfMonth(d) AS m,
max(d) AS as_of,
argMax(px, d) AS as_of_close
FROM daily
GROUP BY m
),
release AS
(
SELECT
m,
as_of,
as_of_close,
addDays(toStartOfMonth(addMonths(m, 1)), 19) AS release_day
FROM reference_month
),
gaps AS
(
SELECT
r.m AS m,
abs(round(100 * (toFloat64(argMax(d.px, d.d))
/ toFloat64(any(r.as_of_close)) - 1), 2)) AS abs_move_pct
FROM release AS r
CROSS JOIN daily AS d
WHERE d.d > r.as_of
AND d.d <= r.release_day
AND r.release_day < today()
GROUP BY r.m
)
SELECT
multiIf(abs_move_pct < 1, '0 to 1%',
abs_move_pct < 2, '1 to 2%',
abs_move_pct < 3, '2 to 3%',
abs_move_pct < 5, '3 to 5%',
abs_move_pct < 8, '5 to 8%',
'8% or more') AS move_bucket,
count() AS months_count,
round(100 * count() / (SELECT count() FROM gaps), 1) AS share_pct
FROM gaps
GROUP BY move_bucket
ORDER BY min(abs_move_pct)21.1% of those intervals sat in the 0 to 1% band, while the widest band on the chart, 8% or more, holds 15 of them. A balance figure that arrives after a move of that size describes a portfolio the market has already repriced.
The lag rules out two uses cleanly. The number cannot describe the current week, and it cannot be set beside a same-day price without a note that the two measure different moments. Short interest carries the same problem in a shorter form, which we walk through in why short interest is two weeks old.
Why a record dollar total is the least interesting part
Margin debt gets quoted most often when it sets a record. The mechanics make that a low bar. Debit balances are dollars borrowed against portfolios whose market value moves with prices. Hold borrowing constant as a fraction of portfolio value, let prices climb, and the dollar total climbs alongside them. A nominal record then restates the price level in different units.
How routine is a record? The panel counts month-end closes in SPY that topped every earlier month-end close in the window.
The exact SQL behind every number
WITH daily AS
(
SELECT
toDate(toTimeZone(window_start, 'America/New_York')) AS d,
argMax(close, window_start) AS px
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= toDateTime('2006-01-01 00:00:00')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) >= 570
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) < 960
GROUP BY d
),
month_close AS
(
SELECT
toStartOfMonth(d) AS m,
toFloat64(argMax(px, d)) AS close_px
FROM daily
GROUP BY m
),
peaks AS
(
SELECT
m,
close_px,
max(close_px) OVER (ORDER BY m ASC
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS running_peak
FROM month_close
),
per_year AS
(
SELECT
toYear(m) AS y,
count() AS closes_observed,
countIf(close_px >= running_peak) AS new_highs
FROM peaks
GROUP BY y
)
SELECT
toString(y) AS year,
closes_observed,
new_highs,
round(100 * sum(new_highs) OVER (ORDER BY y ASC
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
/ sum(closes_observed) OVER (ORDER BY y ASC
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 1) AS cumulative_share_pct
FROM per_year
ORDER BY yAcross the window, 34.3% of month-end closes were new highs for the window, and 2026 on its own holds 4 of them so far. A dollar series that rises with portfolio values inherits that frequency. Reading a nominal record as news, on its own, mostly restates that the market is near a high.
Two transforms make the borrowing history comparable across decades.
- Real terms: deflate the dollar column by a consumer price index, so a 1997 dollar and a 2026 dollar are the same unit. The Bureau of Labor Statistics publishes that CPI history free of charge.
- A ratio: divide debit balances by a measure of what the borrowing is set against, such as total US equity market value or nominal GDP. The result is a borrowing intensity instead of a dollar amount.
A further view needs no outside data at all. The month-over-month or year-over-year percent change in the debit-balance column is scale free by construction, and it strips out the slow drift that the price level contributes to the raw total.
Is margin debt a leading indicator?
Coincident is the honest word. Debit balances and portfolio values move together inside the same month, and by the time the aggregate publishes, the price history of that month is already public. Any lead-lag claim has to clear two hurdles: the arithmetic link between a dollar balance and the price level, and the four to seven week delay before the number exists at all.
A reader can run the co-movement check directly. Line the FINRA history up against the market's own worst months and see how much of the leverage series' decline sits in the same months rather than ahead of them. The panel supplies the dates to check.
The exact SQL behind every number
WITH daily AS
(
SELECT
toDate(toTimeZone(window_start, 'America/New_York')) AS d,
argMax(close, window_start) AS px
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= toDateTime('2006-01-01 00:00:00')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) >= 570
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) < 960
GROUP BY d
),
month_close AS
(
SELECT
toStartOfMonth(d) AS m,
toFloat64(argMax(px, d)) AS close_px
FROM daily
GROUP BY m
),
chained AS
(
SELECT
m,
close_px,
lagInFrame(close_px, 1) OVER (ORDER BY m ASC
ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prior_close
FROM month_close
)
SELECT
formatDateTime(m, '%b %Y') AS calendar_label,
round(100 * (close_px / prior_close - 1), 2) AS spy_change_pct
FROM chained
WHERE prior_close > 0
ORDER BY spy_change_pct ASC
LIMIT 10The worst of the ten, Oct 2008, printed -16.74% between consecutive month-end closes, and the tenth still printed -8.4%. Put the debit-balance column beside these months and the timing question settles itself for the reader rather than for a headline writer.
How to download the full history back to 1997
FINRA posts the table on its Margin Statistics page and offers the same series as an Excel download that starts in January 1997. One row per month, the debit-balance total next to the free-credit columns, reported in millions of dollars.
Two habits make the file more useful. Keep a dated copy of every download, since an amended filing can revise a prior month and only your own archive will show the change. And carry the as-of month through to every chart label you build, so a chart never quietly attaches a month's balance to the month it was published in.
For the FINRA data set most often read next to this one, see FINRA short interest data, which follows the same collect-and-publish pattern on a twice-monthly cycle. For a breadth measure with no reporting lag at all, the high low index is built straight from daily price data.
FAQ
When is FINRA margin debt data released?
FINRA generally publishes updates to the margin statistics in the third week of the month following the reference month. Firms file the Customer Margin Balance Form no later than the sixth business day of that following month, and the aggregate posts after that. No fixed release date is announced in advance.
What is the difference between debit balances and free credit balances?
A debit balance is money a customer owes a broker for securities bought on margin. A free credit balance is customer cash held at the broker and payable on demand. FINRA collects the debit total for securities margin accounts and the free credit total for cash accounts and securities margin accounts.
How far back does FINRA margin debt data go?
The downloadable history on FINRA's Margin Statistics page starts in January 1997, one row per month. Balances are reported in millions of dollars on a settlement date basis as of the last business day of each month.
Does margin debt predict market tops?
Two features of the series limit that use. The dollar level moves with portfolio values, so it climbs as prices climb even at constant borrowing intensity, and every figure is four to seven weeks old when it publishes. Readers who study turning points tend to work with the year-over-year percent change or a ratio version instead of the raw dollar level.
Is margin debt the same as short interest?
No. Margin debt is borrowed cash held against long positions. Short interest counts shares sold short and not yet covered. Both reach the public through broker filings to FINRA on a fixed cycle, and both arrive with a lag measured in weeks.
Every panel above expands to the exact SQL that produced it. To run the same month-end and release-gap arithmetic over another ticker or a longer window, ask for it in plain English on the Strasmore terminal.