VectorFin/Glossary/Beneish M-Score
Quant Finance

What is Beneish M-Score?

An eight-variable forensic-accounting model that estimates the likelihood a company has manipulated its reported earnings.

In Plain English

The Beneish M-Score is a forensic-accounting model designed to answer a simple question: is this company cooking its books? Developed by Messod Beneish in 1999, it combines eight financial ratios that tend to behave abnormally when management inflates earnings, deteriorates receivables relative to sales, expands margins that reverse, softens asset quality, and raises accruals, among other red flags.

The model is famous for a real-world catch: a group of Cornell business students used it to flag Enron as a likely manipulator in 1998, well before the company collapsed. That is the spirit of the M-Score, it does not prove fraud, but it raises a statistically grounded red flag worth investigating.

The output is a single number. Above a threshold (commonly -1.78), a company is classified as a likely manipulator; below it, unlikely. Because it is rules-based and computable from public filings, it naturally fits into systematic screens as a risk filter, a way to down-weight or exclude names whose reported earnings may not be trustworthy.

Technical Definition

The M-Score is a linear combination of eight indices:

M = -4.84 + 0.920·DSRI + 0.528·GMI + 0.404·AQI + 0.892·SGI + 0.115·DEPI - 0.172·SGAI + 4.679·TATA - 0.327·LVGI

where the indices compare the current year to the prior year: DSRI (Days Sales in Receivables), GMI (Gross Margin), AQI (Asset Quality), SGI (Sales Growth), DEPI (Depreciation), SGAI (SG&A), TATA (Total Accruals to Total Assets), and LVGI (Leverage).

Rule of thumb: M > -1.78 flags a likely manipulator.

How VectorFin Uses This

The Beneish M-Score is one of the five signal families inside VectorFin's flat signals table (alongside piotroski, altman_z, sloan_accrual, and regime), served at GET /v1/signals/{ticker}. Each record's components.beneish_m object carries the score and a boolean flag set when the score crosses the manipulation threshold.

Scores update nightly as new filings arrive, and the bitemporal stamps (effective_ts + knowledge_ts) ensure point-in-time backtests remain free from look-ahead bias.

Code Example

import requests

resp = requests.get(
    "https://api.vectorfinancials.com/v1/signals/AAPL",
    params={"limit": 1},
    headers={"X-API-Key": "vf_sk_your_key_here"},
)
record = resp.json()[0]
m = record["components"]["beneish_m"]
print(m["score"], m["flag"])   # e.g. -2.61 False  (below threshold → not flagged)

Put Beneish M-Score to work in your pipeline

Access AI-ready financial data — embeddings, signals, Iceberg tables.