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. Since this implementation omits Ohlson’s price-level deflator, its scores sit about 2.6 below Ohlson’s scale and this cutoff flags far too few companies (see the Notes).
  • A higher probability indicates a higher likelihood of bankruptcy.

Also known as: Ohlson O-Score, bankruptcy prediction, financial distress score.

Ohlson O-Score in Python or via the MCP

Install the Finance Toolkit with:

pip install financetoolkit -U

Then call get_ohlson_o_score as shown below.

from financetoolkit import Toolkit

toolkit = Toolkit(
    ["CCL", "RCL", "NCLH"],
    api_key="FINANCIAL_MODELING_PREP_KEY",
    start_date="2021-01-01",
    end_date="2025-12-31",
)

toolkit.models.get_ohlson_o_score().xs("Ohlson O-Score", level=1)

Or, after setting up the Finance Toolkit MCP, ask:

What was the Ohlson O-Score of Carnival, Royal Caribbean and Norwegian Cruise Line from 2021 to 2025?

Which returns:

  2021 2022 2023 2024 2025
CCL -5.7604 -5.4419 -6.2136 -6.8358 -6.78
NCLH -4.4192 -4.1038 -5.0639 -5.269 -4.9984
RCL -4.9997 -5.0496 -6.2194 -6.3642 -6.6839

Parameters

get_ohlson_o_score accepts the following parameters.

ParameterTypeDescriptionExample
roundingintThe number of decimals to round the results to. Defaults to None.2
growthboolWhether to calculate the growth of the values. Defaults to False.True
lagint | list[int]The lag to use for the growth calculation. Defaults to 1.4
standardizeboolWhether to standardize (Z-Score) the result. When combined with growth=True, standardizes the growth values instead of the raw values. Defaults to False.True
trailingint | NoneThe 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_columnslist[str] | NoneList of columns to show in the results. If None, all columns will be shown. Defaults to None.["Ohlson O-Score", "Ohlson Bankruptcy Probability"]
Share