Minimum Track Record Length
Calculate the Minimum Track Record Length (MinTRL): how many return observations are needed before the measured Sharpe ratio is, with the given confidence, above the benchmark Sharpe ratio. A short track record with a high Sharpe ratio can still be luck; the MinTRL says how long the record has to be for it not to be, taking the skewness and fat tails of the returns into account.
The formula is as follows:
\[\text{MinTRL} = 1 + (1 - \text{γ₃} \cdot \text{SR} + ((\text{γ₄} - 1) / 4) \cdot \text{SR} ^{2}) \cdot (Z_{\alpha} / (\text{SR} - \text{SR} \cdot)) ^{2}\]Where SR is the Sharpe ratio of one observation (not annualized), SR* the benchmark Sharpe ratio on the same scale, γ₃ the skewness and γ₄ the non-excess (raw) kurtosis of the excess returns (3 for a normal distribution) and Z_α the standard normal quantile at confidence_level (1.645 for 95%). With n = MinTRL observations, the Probabilistic Sharpe Ratio, get_sharpe_ratio(method="probabilistic"), equals confidence_level. Negative skewness and fat tails lengthen the record needed. When SR does not exceed SR*, no track record is long enough and the value is left out (NaN).
By default one MinTRL is reported per period, computed from the daily excess returns within that period, so it counts trading days (divide by 252 for years). For a rolling period, period sets the frequency of the returns and the measure is computed over a rolling window of rolling such returns, so it counts periods (e.g. months).
For more information about the method, see the following paper:
- Bailey, D.H., & López de Prado, M. (2012). “The Sharpe Ratio Efficient Frontier.” Journal of Risk, 15(2), 3-44.
Also known as: MinTRL, minimum track record, required track record length.
Minimum Track Record Length in Python or via the MCP
Install the Finance Toolkit with:
pip install financetoolkit -U
Then call get_minimum_track_record_length as shown below.
from financetoolkit import Toolkit
toolkit = Toolkit(
["SPY", "TLT", "GLD", "BTCUSD"],
api_key="FINANCIAL_MODELING_PREP_KEY",
start_date="2021-01-01",
end_date="2025-12-31",
benchmark_ticker=None,
)
toolkit.performance.get_minimum_track_record_length()
Or, after setting up the Finance Toolkit MCP, ask:
How many daily returns would SPY, TLT, gold (GLD) and Bitcoin need in each year from 2021 to 2025 to be confident that their Sharpe ratio is above zero?
Which returns:
| Date | SPY | TLT | GLD | BTCUSD |
|---|---|---|---|---|
| 2021 | 176.151 | nan | nan | 1701.64 |
| 2023 | 282.904 | 627999 | 1490.71 | 247.195 |
| 2024 | 319.167 | nan | 381.29 | 337.604 |
| 2025 | 1220.25 | 197659 | 135.453 | nan |
Parameters
get_minimum_track_record_length 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”. | "weekly" |
rolling | int | The rolling window size, in observations of period. Defaults to None, one value per period. | 4 |
benchmark_sharpe_ratio | float | The benchmark Sharpe ratio SR*, on the scale of one observation (e.g. 1 / SQRT(252) for an annualized benchmark of 1 on daily returns). Defaults to 0.0, i.e. any skill at all. | 0.5 |
confidence_level | float | The confidence level. Defaults to 0.95. | 0.95 |
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 values. 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 |