Upside Capture Ratio
Calculate the Upside Capture Ratio of an investment portfolio or asset’s returns.
The Upside Capture Ratio measures how well an investment portfolio or asset performs relative to a benchmark during periods in which the benchmark’s return is positive. A ratio above 1 (or 100%) indicates the asset captured more of the benchmark’s gains than the benchmark itself.
The formula is as follows:
\[\text{Upside Capture Ratio} = \text{Geometric Average Return in Up Periods} / \text{Geometric Average Benchmark Return in Up Periods}\] \[\text{Geometric Average Return} = (\operatorname{PRODUCT}(1 + \text{Return})) ^{1 / n} - 1\]Where the up periods are the observations (days within each period) with a positive benchmark return and n is their number, following Morningstar’s definition. Geometric rather than arithmetic averages make the ratio reflect the compounded return captured, so it does not depend on how volatile the returns within the up periods were.
Upside and downside capture (see get_downside_capture_ratio) are read together: an upside capture above the downside capture means the asset kept more of the benchmark’s gains than of its losses, which is what defensive and low-volatility strategies aim for even with both ratios below 1. Both are computed from the daily returns within each period, while fund factsheets usually use monthly returns over three to five years, so the figures are not directly comparable with published ones.
Upside Capture Ratio in Python or via the MCP
Install the Finance Toolkit with:
pip install financetoolkit -U
Then call get_upside_capture_ratio as shown below.
from financetoolkit import Toolkit
toolkit = Toolkit(
["QQQ", "SCHD", "USMV"],
api_key="FINANCIAL_MODELING_PREP_KEY",
start_date="2021-01-01",
end_date="2025-12-31",
)
toolkit.performance.get_upside_capture_ratio()
Or, after setting up the Finance Toolkit MCP, ask:
How much of the S&P 500's gains on its up days did QQQ, SCHD and USMV capture in each year from 2021 to 2025?
Which returns:
| Date | QQQ | SCHD | USMV |
|---|---|---|---|
| 2021 | 1.1827 | 0.832 | 0.6961 |
| 2022 | 1.2845 | 0.7129 | 0.7051 |
| 2023 | 1.3244 | 0.765 | 0.6077 |
| 2024 | 1.3372 | 0.5237 | 0.5323 |
| 2025 | 1.2056 | 0.5019 | 0.4674 |
Parameters
get_upside_capture_ratio accepts the following parameters.
| Parameter | Type | Description | Example |
|---|---|---|---|
period | str | The period to use for the calculation. Defaults to “quarterly” if the Toolkit is initialised with quarterly=True, otherwise “yearly”. | "quarterly" |
rounding | int | None | The number of decimals to round the results to. Defaults to None, which uses the rounding of the Toolkit (4 unless set otherwise). | 2 |
growth | bool | Whether to calculate the growth of the ratios. Defaults to False. | True |
lag | int | list[int] | The lag to use for the growth calculation. Defaults to 1. | 4 |
standardize | bool | Whether to standardize (Z-Score) the result. When combined with growth=True, standardizes the growth values instead of the raw values. Defaults to False. | True |