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.

The Models module page introduces the module, and the sidebar lists all of its functions.

Share