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.

ParameterTypeDescriptionExample
periodstrThe period to use for the calculation. Defaults to “quarterly” if the Toolkit is initialised with quarterly=True, otherwise “yearly”."weekly"
rollingintThe rolling window size, in observations of period. Defaults to None, one value per period.4
benchmark_sharpe_ratiofloatThe 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_levelfloatThe confidence level. Defaults to 0.95.0.95
roundingint | NoneThe number of decimals to round the results to. Defaults to None, which uses the rounding of the Toolkit (4 unless set otherwise).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
Share