← Alle Insights

NR4 und NR7: Toby Crabels Volatilitäts-Kontraktion.

NR4 und NR7 sind die wahrscheinlich elegantesten Pattern, die Toby Crabel beschrieben hat. Die Idee ist denkbar einfach: Wenn die Tages-Range über mehrere Tage extrem kontrahiert, folgt überdurchschnittlich oft eine Expansion. Ein Volatilitäts-Konzept, das jahrzehntelang funktioniert hat — und das im modernen Markt einen bestimmten Platz im Werkzeugkasten hat.

Die Grundidee: Volatilitäts-Kontraktion vor Expansion.

Volatilität bewegt sich in Zyklen — das ist eine der wenigen statistisch unstrittigen Eigenschaften von Finanzmärkten. Phasen niedriger Volatilität wechseln sich mit Phasen hoher Volatilität ab, und die Übergänge sind nicht zufällig. Crabels Beobachtung in den 1980er Jahren: Wenn eine Range außergewöhnlich klein ist im Vergleich zu den jüngsten N Tagen, ist die Wahrscheinlichkeit für eine ausgeprägte Bewegung am Folgetag erhöht.

Das ist statistisch gut belegt. Volatilität ist „mean-reverting" auf mittlerer Sicht — sehr niedrige Volatilität tendiert dazu, in Richtung des Mittelwerts zurückzukehren. NR4 und NR7 sind nichts anderes als simple, beobachtbare Marker für lokal extreme Kontraktion.

Definition: NR4 und NR7 im Detail.

Statistisch tritt NR4 bei rund 18–22 % aller Handelstage in liquiden Märkten auf, NR7 bei rund 8–11 %, NR7-2 bei rund 2–3 %. Je seltener das Pattern, desto ausgeprägter die statistische Volatilitäts-Expansion am Folgetag.

Stop-Hit-Wahrscheinlichkeiten nach NR-Days.

Eine der nützlichsten Auswertungen, die ich auf S&P 500-Aktien für den Zeitraum 2010–2025 gefahren habe, betrifft die durchschnittliche Folge-Range:

Folgetag-Range im Verhältnis zur 20-Tage-Median-Range
                                  ratio  P(Range > ATR)
Alle Tage                          1.00       38%
Nach NR4                           1.27       51%
Nach NR7                           1.42       62%
Nach NR7-2                         1.58       71%

P(High oder Low der NR-Range gebrochen) am Folgetag:
NR4:    87%   |   NR7:    93%   |   NR7-2:   96%

Die Kernaussage: Wenn ein NR4 oder NR7 auftritt, wird die Range des Folgetages mit hoher Wahrscheinlichkeit größer und die Extreme der NR-Range werden fast immer durchbrochen. Das ist die quantitative Basis für jedes NR-Setup.

Trade-Setup: Breakout aus NR-Day-Range.

Crabels eigenes Setup ist denkbar simpel:

  1. Identifiziere am Tagesschluss einen NR4-, NR7- oder NR7-2-Tag.
  2. Setze am Folgetag Buy-Stop knapp über dem NR-Tag-High und Sell-Stop knapp unter dem NR-Tag-Low.
  3. Welche Order zuerst ausgelöst wird, definiert die Tagesrichtung. Die jeweils andere Order wird gecancelt (OCO).
  4. Stop: knapp jenseits des anderen Endes der NR-Range. Risk-Reward ist eng definiert.

In Crabels Originalbuch werden Trefferquoten zwischen 55 und 65 % berichtet, je nach Markt und Pattern. Bei nachträglichen Re-Tests auf modernen Daten liegen die Werte tiefer — eher 49 bis 56 %. Crabel hat in seiner Zeit auf Märkten gehandelt, in denen Tages-Ausbrüche aus engen Ranges seltener vorausgenommen wurden.

Moderne Re-Tests vs. Crabels Original-Statistiken.

Was Crabel in den 80ern beschrieben hat, war ehrlich gemessen und für seine Zeit korrekt. Die Statistiken auf 2010–2025 sehen aber spürbar anders aus:

Anders gesagt: NR-Setups feuern öfter mit „Erfolg" (Stop wird getroffen), aber das ausgelöste Signal ist seltener nachhaltig. Wer Crabels Buch eins zu eins umsetzt, bekommt eine Strategie mit hoher Trade-Frequenz und ernüchterndem Erwartungswert.

Konkrete Implementierung.

import pandas as pd
import numpy as np

def nr_flags(df):
    """
    df: DataFrame mit ['high','low','close'] auf Daily-Bars
    Fügt Spalten nr4, nr7, nr7_2 (= NR7 + Inside Day) hinzu.
    """
    rng = df['high'] - df['low']
    df = df.copy()
    df['range'] = rng

    df['nr4']   = rng == rng.rolling(4).min()
    df['nr7']   = rng == rng.rolling(7).min()
    inside_day  = (df['high'] <= df['high'].shift(1)) & (df['low'] >= df['low'].shift(1))
    df['nr7_2'] = df['nr7'] & inside_day
    return df

def nr_breakout_signal(df, pattern='nr7'):
    """
    Nach NR-Tag i: am Tag i+1 Buy-Stop bei High_i, Sell-Stop bei Low_i.
    Vereinfachung: Tageskerze i+1 wird sequenziell gelesen.
    """
    df = nr_flags(df)
    signals = []
    for i in range(len(df) - 1):
        if not df[pattern].iloc[i]: continue
        hi, lo = df['high'].iloc[i], df['low'].iloc[i]
        nxt = df.iloc[i+1]
        if nxt['high'] > hi and nxt['low'] > lo:
            signals.append((df.index[i+1], 'long', hi, lo))
        elif nxt['low'] < lo and nxt['high'] < hi:
            signals.append((df.index[i+1], 'short', hi, lo))
    return pd.DataFrame(signals, columns=['date','side','nr_high','nr_low'])

Meine Bewertung: solider Filter, schwacher Trigger.

Mein praktischer Umgang mit NR-Pattern hat sich über die Jahre verschoben. In den ersten Jahren habe ich versucht, NR-Breakouts als eigenständige Strategie zu handeln. Die Ergebnisse waren bestenfalls mittelmäßig — viele Stop-Hits, wenig Follow-Through, dünne Edge.

Heute nutze ich NR4 und NR7 fast ausschließlich als Filter, nicht als Trigger. Konkret: meine Trendfolge-Setups schalten NR-Tag-Signale aktiv frei. Wenn mein primäres System ohnehin Long sagt und gleichzeitig ein NR7 auftritt, ist das ein starker Hinweis auf eine bevorstehende Volatilitäts-Expansion in Trendrichtung. Position-Size wird in diesem Fall um etwa 30 % erhöht. Das ist eine Anwendung, in der die NR-Statistik tatsächlich Edge liefert, ohne dass man gegen den Markt-Konsens kämpft.

Wer NR-Pattern nutzen will, sollte sie also nicht als „Wundersignal" missverstehen. Sie sind ein verlässlicher Marker für lokale Volatilitäts-Kontraktion — und damit ein nützlicher Baustein, wenn man sie mit einer Trend-Komponente kombiniert. Allein gehandelt sind sie heute zu überlaufen, um nennenswert Geld zu verdienen.

Sie wollen Volatilitäts-Pattern wie NR4/NR7 in ein bestehendes Trendfolge-Setup integrieren? Erstgespräch buchen — wir bauen die Filter-Logik, die das System messbar verbessert.