Summarise the history of a technical indicator per ticker in a single row instead of the series itself: where the latest value ranks in its own history, the lowest and highest value with their dates, how many periods the indicator spent below or above a threshold, when it last crossed into that zone and how the price did afterwards. This answers questions such as “how oversold is the RSI compared with the last five years, and what happened after the previous times it fell below 30?” without the thousands of daily values behind it.

Each value is ranked against its own history up to that date, so the percentile of a crossing in the past only uses the values known at that time:

\[\text{Percentile} = \text{share of the values up to and including the date that are at most the value on that date}\] \[\text{Rank} = \text{number of values up to and including the date that are at most the value on that}\; \text{date:} 1 \;\text{is the lowest value so far},\;\; \text{the number of observations the highest}\] \[\text{Forward Return} (n \;\text{periods}) = \operatorname{Price}(t + n) / \operatorname{Price}(t) - 1,\;\; \text{from the close of the crossing to the close n trading periods later},\;\; \text{on the dividend and split adjusted close}\]

A crossing below below is the period the indicator falls below the line, entering the zone, and a crossing above above the period it rises above the line (the same crossings as get_signals). The average forward return after the crossings is shown next to the average forward return over every period, so the effect of the signal can be read against the drift of the share itself.

For more information, see the following books:

  • Wilder, J.W. Jr. (1978). “New Concepts in Technical Trading Systems.” Trend Research.
  • Murphy, J.J. (1999). “Technical Analysis of the Financial Markets.” New York Institute of Finance.

Also known as: indicator statistics, indicator percentile, oversold history, event study, forward returns after a signal, RSI below 30.

Indicator Summary in Python

Install the Finance Toolkit with:

pip install financetoolkit -U

Then call get_indicator_summary as shown below.

from financetoolkit import Toolkit

toolkit = Toolkit(
    ["NVDA"],
    api_key="FINANCIAL_MODELING_PREP_KEY",
    start_date="2021-11-01",
    end_date="2026-11-05",
)

toolkit.technicals.get_indicator_summary(
    "get_relative_strength_index", below=30, forward_periods=[5, 21, 63]
).T

Which returns:

  NVDA
Latest 25.3948
Latest Date 2026-11-05
Percentile 0.0008
Rank 1
Observations 1245
Mean 54.5091
Minimum 25.3948
Minimum Date 2026-11-05
Maximum 85.2808
Maximum Date 2024-02-05
Average 5-Period Return 0.0098
Average 21-Period Return 0.0442
Average 63-Period Return 0.153
Periods Below 12
Crossings Below 6
Last Crossing Below 2026-11-05
Average 5-Period Return After Crossing Below 0.0625
Average 21-Period Return After Crossing Below 0.0313
Average 63-Period Return After Crossing Below 0.1968

Parameters

get_indicator_summary accepts the following parameters.

ParameterTypeDescriptionExample
metricstrThe indicator method name, e.g. “get_stochastic_oscillator” or “get_rate_of_change”. Defaults to “get_relative_strength_index”."get_relative_strength_index"
belowfloat | NoneThe line the indicator falls below, e.g. 30 for an oversold RSI. Defaults to None.None
abovefloat | NoneThe line the indicator rises above, e.g. 70 for an overbought RSI. Defaults to None.None
forward_periodslist[int] | int | NoneThe numbers of trading periods after each date to measure the return over, e.g. [5, 21, 63] for about a week, a month and a quarter of daily data. Defaults to None, which measures no returns.None, which measures no returns
show_crossingsboolWhether to return a row per crossing (ticker and date) with its zone, the indicator value, its percentile at the time and the forward returns instead of the summary. Defaults to False.False
columnstr | NoneThe output to use of an indicator with several, e.g. “Signal Line” of the MACD. Defaults to None, which uses the first output other than a price, e.g. “MACD Line”."Return"
roundingint | NoneThe number of decimals to round the results to. Defaults to None, which uses the Toolkit’s rounding. **kwargs: Parameters passed to the indicator, e.g. window=14 or period=”weekly”.2
Share