Fit a Probit Regression of whether dependent_ticker’s return is positive on independent_tickers.

As with get_logistic_regression, the dependent variable is turned into a binary outcome (1 when the return is positive, 0 otherwise). The probability of that outcome is modelled through the standard normal cumulative distribution function instead of the logistic function.

The formula is as follows:

\[\text{yₜ} = 1 \;\text{if the dependent ticker's}\; \text{column} (\text{Return by default}) \text{is above}\; 0,\;\; \text{else 0}\] \[P(\text{yₜ} = 1 | \text{xₜ}) = \Phi(\text{xₜ'beta}),\;\; \text{with xₜ the independent tickers' column plus a constant}\] \[\text{betâ} = \text{argmax}\; \text{Σ} \left[\text{yₜ} \cdot \ln(\text{pₜ}) + (1 - \text{yₜ}) \cdot \ln(1 - \text{pₜ})\right],\;\; \text{solved by Newton-Raphson (statsmodels Probit)}\] \[\text{Pseudo}\; R ^{2} = 1 - \text{ln}\; L (\text{betâ}) / \text{ln}\; \text{L₀} (\text{McFadden}),\;\; \text{with L₀ the likelihood of a constant-only model}\]

Where Phi is the standard normal CDF. The model is fitted by Maximum Likelihood. A positive coefficient means a higher probability of a positive return, but the size of a coefficient is not a log-odds ratio as in the Logit model. In practice Probit and Logit give very similar fitted probabilities; Probit is the convention in parts of the econometrics literature and underlies two-step estimators such as the Heckman selection correction.

For more information about the method, see the following paper:

  • Bliss, C.I. (1934). “The Method of Probits.” Science, 79(2037), 38-39.

Also known as: probit model.

Probit Regression in Python or via the MCP

Install the Finance Toolkit with:

pip install financetoolkit -U

Then call get_probit_regression as shown below.

from financetoolkit import Toolkit

toolkit = Toolkit(
    ["TSLA", "QQQ"],
    api_key="FINANCIAL_MODELING_PREP_KEY",
    start_date="2025-01-01",
    end_date="2025-12-31",
)

# TSLA (the first ticker) is dependent; QQQ is independent
toolkit.econometrics.get_probit_regression()

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

How well did the daily returns of the Invesco QQQ Trust predict whether Tesla rose on a day in 2025, according to a probit model?

Which returns:

  Coefficient Std. Error z-Statistic P-Value
Intercept -0.0848 0.0913 -0.9294 0.3527
QQQ 78.1324 11.1444 7.0109 0

Using Your Own Data

get_probit_regression runs on any data, not only prices: ratios, economic indicators, yield curves or your own dataset. Pass a DataFrame, a Series or a dictionary of them to Econometrics as data, with the dates in the rows or the columns, and set changes to how its changes are calculated: "percentage", "log", "difference" for rates and ratios, or None when the data are changes already. For example, for the monthly unemployment rates of the United States and Germany:

from financetoolkit import Economics, Econometrics

economics = Economics(start_date="2000-01-01")

unemployment = economics.get_unemployment_rate(
    countries=["United States", "Germany"], period="monthly"
)

econometrics = Econometrics(data=unemployment, changes="difference")

econometrics.get_probit_regression()

Parameters

get_probit_regression accepts the following parameters.

ParameterTypeDescriptionExample
dependent_tickerstr | NoneThe dependent asset (whose up/down direction is predicted). Defaults to None, meaning the Toolkit instance’s first ticker."AAPL"
independent_tickersstr | list[str] | NoneThe independent (predictor) asset(s). Defaults to None, meaning every other ticker in the Toolkit instance besides dependent_ticker.["MSFT", "Benchmark"]
include_benchmarkboolWhether to include “Benchmark” in the default independent ticker(s) (has no effect when independent_tickers is given explicitly). Defaults to False.True
periodstrThe data frequency (daily, weekly, monthly, quarterly, or yearly). Defaults to “daily”."weekly"
columnstrThe historical data column to derive returns from. Defaults to “Return”."Return"
add_constantboolWhether to include an intercept. Defaults to True.False
roundingint | NoneThe number of decimals to round the results to. Defaults to None.2
Share