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:
M-Score = -4.84 + 0.92 * DSRI + 0.528 * GMI + 0.404 * AQI + 0.892 * SGI + 0.115 * DEPI - 0.172 * SGAI + 4.679 * TATA - 0.327 * LVGI
The eight variables are:
- DSRI: Days Sales in Receivables Index
- GMI: Gross Margin Index
- AQI: Asset Quality Index
- SGI: Sales Growth Index
- DEPI: Depreciation Index
- SGAI: Selling, General and Administrative Expenses Index
- TATA: Total Accruals to Total Assets
- LVGI: Leverage Index
Also known as: Beneish M-Score, earnings manipulation score.
Beneish M-Score in Python
Install the Finance Toolkit with:
pip install financetoolkit -U
Then call get_beneish_m_score as shown below.
from financetoolkit import Toolkit
toolkit = Toolkit(["AAPL", "MSFT"], api_key="FINANCIAL_MODELING_PREP_KEY")
toolkit.models.get_beneish_m_score().loc["AAPL"]
Which returns:
| 2021 | 2022 | 2023 | |
|---|---|---|---|
| Days Sales in Receivables Index | 1.0322 | 1.0975 | 1.0297 |
| Gross Margin Index | 0.9151 | 0.9647 | 0.9814 |
| Asset Quality Index | 1.1404 | 0.9841 | 0.9387 |
| Sales Growth Index | 1.3326 | 1.0779 | 0.972 |
| Depreciation Index | 1.0566 | 1.0635 | 0.9982 |
| SGA Expenses Index | 0.8279 | 1.0595 | 1.0222 |
| Leverage Index | 1.0608 | 1.0729 | 0.9516 |
| Total Accruals to Total Assets | -0.0267 | -0.0634 | -0.0384 |
| Beneish M-Score | -2.2503 | -2.6691 | -2.6802 |
Parameters
The function accepts the following parameters:
- rounding (int, optional): The number of decimals to round the results to. Defaults to None.
- growth (bool, optional): Whether to calculate the growth of the values. Defaults to False.
- lag (int | list[int], optional): The lag to use for the growth calculation. Defaults to 1.
- standardize (bool, optional): Whether to standardize (Z-Score) the result. When combined with growth=True, standardizes the growth values instead of the raw values. Defaults to False.
- trailing (int | None, optional): The trailing period to use for the calculation. Defaults to None.
- show_columns (list[str] | None, optional): List of columns to show in the results. If None, all columns will be shown. Defaults to None.