Beneish M-Score
The Beneish M-Score is a probabilistic model, developed by Messod Beneish, that uses eight financial ratios derived from a company’s financial statements to identify whether a company has manipulated its earnings. It is a natural companion to the Altman Z-Score and Piotroski F-Score, using the same normalized financial statements as its input.
The formula is as follows, where (t-1) is the same period a year earlier (the previous column on yearly data, four quarters back on quarterly data, so quarterly comparisons are year over year):
\[\text{DSRI} (\text{Days Sales in Receivables Index}) = (\text{Net Receivables} / \text{Revenue}) (t) / (\text{Net Receivables} / \text{Revenue}) (t-1)\] \[\text{GMI} (\text{Gross Margin Index}) = \text{Gross Margin} (t-1) / \text{Gross Margin} (t),\;\; \text{with Gross Margin} = (\text{Revenue} - \text{Cost of Goods Sold}) / \text{Revenue}\] \[\text{AQI} (\text{Asset Quality Index}) = \text{Asset Quality} (t) / \text{Asset Quality} (t-1),\;\; \text{with Asset Quality} = 1 - (\text{Total Current Assets} + \text{Property},\; \text{Plant and Equipment}) / \text{Total Assets}\] \[\text{SGI} (\text{Sales Growth Index}) = \text{Revenue} (t) / \text{Revenue} (t-1)\] \[\text{DEPI} (\text{Depreciation Index}) = \text{Depreciation Rate} (t-1) / \text{Depreciation Rate} (t),\;\; \text{with Depreciation Rate} = \text{Depreciation and Amortization} / (\text{Depreciation and Amortization} + \text{Property},\; \text{Plant and Equipment})\] \[\text{SGAI} (\text{SG\&A} \;\text{Expenses Index}) = (\text{SG\&A} \;\text{Expenses} / \text{Revenue}) (t) / (\text{SG\&A} \;\text{Expenses} / \text{Revenue}) (t-1)\] \[\text{LVGI} (\text{Leverage Index}) = \text{Leverage} (t) / \text{Leverage} (t-1),\;\; \text{with Leverage} = (\text{Total Current Liabilities} + \text{Long Term Debt}) / \text{Total Assets}\] \[\text{TATA} (\text{Total Accruals to Total Assets}) = (\text{Net Income} - \text{Operating Cash Flow}) / \text{Total Assets}\] \[\text{M-Score} = - 4.84 + 0.92 \cdot \text{DSRI} + 0.528 \cdot \text{GMI} + 0.404 \cdot \text{AQI} + 0.892 \cdot \text{SGI} + 0.115 \cdot \text{DEPI} - 0.172 \cdot \text{SGAI} + 4.679 \cdot \text{TATA} - 0.327 \cdot \text{LVGI}\]With trailing, the flows are summed over the trailing periods, while the balance sheet items are taken at the end of each period.
The -1.78 threshold belongs to this eight-variable model; the five-variable version uses -2.22. Fast-growing companies are flagged more often because sales growth itself raises the score, and the model was estimated without financial companies and is not suited to banks and insurers, so a score above the threshold is a prompt to read the accounts, not a finding.
Also known as: Beneish M-Score, earnings manipulation score.
Beneish M-Score in Python or via the MCP
Install the Finance Toolkit with:
pip install financetoolkit -U
Then call get_beneish_m_score as shown below.
from financetoolkit import Toolkit
toolkit = Toolkit(
["NFLX", "DIS", "CMCSA"],
api_key="FINANCIAL_MODELING_PREP_KEY",
start_date="2021-01-01",
end_date="2025-12-31",
)
toolkit.models.get_beneish_m_score().xs("Beneish M-Score", level=1)
Or, after setting up the Finance Toolkit MCP, ask:
What was the Beneish M-Score of Netflix, Disney and Comcast from 2021 to 2025?
Which returns:
| 2021 | 2022 | 2023 | 2024 | 2025 | |
|---|---|---|---|---|---|
| CMCSA | -2.6609 | -2.8625 | -2.661 | -2.6852 | -2.734 |
| DIS | -2.5143 | -2.5357 | -2.6392 | -2.6963 | -2.595 |
| NFLX | -1.6697 | -1.3345 | -2.5628 | -2.3319 | -2.1611 |
Parameters
get_beneish_m_score accepts the following parameters.
| Parameter | Type | Description | Example |
|---|---|---|---|
rounding | int | The number of decimals to round the results to. Defaults to None. | 2 |
growth | bool | Whether to calculate the growth of the values. Defaults to False. | True |
lag | int | list[int] | The lag to use for the growth calculation. Defaults to 1. | 4 |
standardize | bool | Whether to standardize (Z-Score) the result. When combined with growth=True, standardizes the growth values instead of the raw values. Defaults to False. | True |
trailing | int | None | The trailing period to use for the calculation. Defaults to None, which is 4 on quarterly data (a trailing twelve months), as the score was estimated on yearly statements. | 4 |
show_columns | list[str] | None | List of columns to show in the results. If None, all columns will be shown. Defaults to None. | ["Days Sales in Receivables Index", "Beneish M-Score"] |