Ohlson O-Score
Calculates the Ohlson O-Score, a financial metric used to predict the likelihood of a company going bankrupt. Unlike the Altman Z-Score, which is built with multiple discriminant analysis, the O-Score’s coefficients come from a fitted logistic regression (logit) model. This is why the two models are usually reported side by side rather than one being treated as a replacement for the other: the Z-Score is only meaningful compared against Altman’s empirically derived threshold bands, while the O-Score is directly interpretable as a probability of bankruptcy once passed through the logistic transform.
The formula is as follows:
\[\text{SIZE} = \ln(\text{Total Assets})\] \[\text{TLTA} = \text{Total Liabilities} / \text{Total Assets}\] \[\text{WCTA} = \text{Working Capital} / \text{Total Assets}\] \[\text{CLCA} = \text{Current Liabilities} / \text{Current Assets}\] \[\text{OENEG} = 1 \text{if Total Liabilities} > \text{Total Assets else} 0\] \[\text{NITA} = \text{Net Income} / \text{Total Assets}\] \[\text{FUTL} = \text{Operating Cash Flow} / \text{Total Liabilities}\] \[\text{INTWO} = 1 \text{if Net Income was negative for the last two years else} 0\] \[\text{CHIN} = (\text{Net Income} (t) - \text{Net Income} (t-1)) / (| \text{Net Income} (t) | + | \text{Net Income} (t-1) |)\] \[\text{O-Score} = - 1.32 - 0.407 \cdot \text{SIZE} + 6.03 \cdot \text{TLTA} - 1.43 \cdot \text{WCTA} + 0.0757 \cdot \text{CLCA}\] \[1.72 \cdot \text{OENEG} - 2.37 \cdot \text{NITA} - 1.83 \cdot \text{FUTL} + 0.285 \cdot \text{INTWO} - 0.521 \cdot \text{CHIN}\] \[\text{Bankruptcy Probability} = 1 / (1 + e ^{- \text{O-Score}})\]The Ohlson O-Score can be interpreted as follows:
- Ohlson’s (1980) original cutoff is a bankruptcy probability of 0.038 (3.8%), the threshold that minimized the sum of Type I and Type II misclassification errors on his sample. It is deliberately far below the naive 0.50 midpoint because bankruptcy is a rare event. Equivalently, in raw O-Score terms the cutoff sits at ln(0.038 / 0.962), i.e. approximately -3.23.
- A higher probability indicates a higher likelihood of bankruptcy.
Also known as: Ohlson O-Score, bankruptcy prediction, financial distress score.
No programming experience? With the Finance Toolkit MCP server, AI assistants such as Claude and ChatGPT can calculate the Ohlson O-Score for you. Just ask in plain English.
Calculate the Ohlson O-Score in Python
The Ohlson O-Score is available in the Models module of the open-source Finance Toolkit. Install it with:
pip install financetoolkit -U
Then call get_ohlson_o_score as shown below.
from financetoolkit import Toolkit
toolkit = Toolkit(["AAPL", "MSFT"], api_key="FINANCIAL_MODELING_PREP_KEY")
ohlson_o_score = toolkit.models.get_ohlson_o_score()
ohlson_o_score.loc["AAPL"]
Which returns:
| 2020 | 2021 | 2022 | 2023 | |
|---|---|---|---|---|
| Log of Total Assets | 26.5037 | 26.5841 | 26.589 | 26.5886 |
| Total Liabilities to Total Assets | 0.7983 | 0.8203 | 0.8564 | 0.8237 |
| Working Capital to Total Assets | 0.1183 | 0.0267 | -0.0527 | -0.0049 |
| Current Liabilities to Current Assets | 0.7334 | 0.9306 | 1.1372 | 1.0121 |
| Negative Equity Indicator | 0 | 0 | 0 | 0 |
| Net Income to Total Assets | 0.1773 | 0.2697 | 0.2829 | 0.2751 |
| Funds from Operations to Total Liabilities | 0.312 | 0.3614 | 0.4044 | 0.3806 |
| Negative Income Indicator | 0 | 0 | 0 | 0 |
| Change in Net Income | nan | 0.245 | 0.0263 | -0.0143 |
| Ohlson O-Score | nan | -8.5895 | -8.2408 | -8.4318 |
| Ohlson Bankruptcy Probability | nan | 0.0002 | 0.0003 | 0.0002 |
Note that the first period is NaN because the Change in Net Income and Negative Income Indicator components require a prior period to compare against.
Parameters
get_ohlson_o_score 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.
Related Models
The Models module page introduces the module, and the sidebar lists all of its functions.