Propensity Score Matching (PSM)
Estimate the Average Treatment effect on the Treated (ATT) of treatment_ticker exceeding treatment_threshold on dependent_ticker’s return, via Propensity Score Matching (PSM) on covariate_tickers.
Also known as: PSM, nearest-neighbor propensity matching.
For more information about the method, see causal_inference_model.get_propensity_score_matching.
Derives a binary “treatment” indicator the same way get_logistic_regression derives its binary outcome: 1 if treatment_ticker’s return in a given period exceeds treatment_threshold (0.0, i.e. a positive return, by default), else 0. This lets PSM answer e.g. “on periods where treatment_ticker has an outsized/positive move, is dependent_ticker’s return different than it would otherwise be – comparing only periods that LOOK similar on covariate_tickers (to control for the possibility that treatment_ticker tends to move on the same periods/regimes that also independently affect dependent_ticker)?”
No programming experience? With the Finance Toolkit MCP server, AI assistants such as Claude and ChatGPT can calculate the Propensity Score Matching (PSM) for you. Just ask in plain English.
Calculate the Propensity Score Matching (PSM) in Python
The Propensity Score Matching (PSM) is available in the Econometrics module of the open-source Finance Toolkit. Install it with:
pip install financetoolkit -U
Then call get_propensity_score_matching as shown below.
from financetoolkit import Toolkit
toolkit = Toolkit(["AAPL", "MSFT"], api_key="FINANCIAL_MODELING_PREP_KEY")
toolkit.econometrics.get_propensity_score_matching(
"AAPL", "MSFT", "Benchmark", period="weekly"
)
Which returns:
| Metric | Value |
|---|---|
| ATT | 0.0335 |
| Std. Error | 0.0060 |
| t-Statistic | 5.5598 |
| P-Value | 0.0000 |
| Matched Pairs | 33 |
| N Treated | 84 |
| N Control | 73 |
Parameters
get_propensity_score_matching accepts the following parameters:
- dependent_ticker (str): The outcome asset.
- treatment_ticker (str): The asset whose return, once it exceeds
treatment_threshold, defines the treatment indicator. - covariate_tickers (str | list[str]): The asset(s) used as covariates to estimate the propensity score – should include asset(s) believed to drive selection into “treatment”.
- treatment_threshold (float, optional): The return threshold defining treatment. Defaults to 0.0.
- period (str, optional): The data frequency (daily, weekly, monthly, quarterly, or yearly). Defaults to “daily”.
- column (str, optional): The historical data column to use. Defaults to “Return”.
- caliper (float | None, optional): The maximum allowed logit-propensity-score
matching distance. Defaults to None, which uses Austin’s (2011) rule of thumb
– see
causal_inference_model.get_propensity_score_matching. - add_constant (bool, optional): Whether to include an intercept in the propensity score model. Defaults to True.
- rounding (int | None, optional): The number of decimals to round the results to. Defaults to None.
Related Causal Inference
The Econometrics module page introduces the module, and the sidebar lists all of its functions.