Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor ·

Wann Gleichgewichtung die Optimierung schlägt

Eine gesetzte Python-Simulation zeigt: Bei kurzen Stichproben schlägt Gleichgewichtung die optimierte Positionsgröße. Mit wachsender Stichprobe schließt sich der Abstand.

Eine Gleichgewichtung ist einer optimierten Positionsgröße immer dann überlegen, wenn die Stichprobe zu klein ist, um erwartete Renditen verlässlich zu bestimmen. Kurze Stichproben sind eher die Regel als die Ausnahme. Ein Optimierer ist zwar mathematisch korrekt, wendet seine Berechnungen aber auf eine Eingangsgröße an, die niemand zuverlässig misst. Das 1/N-Portfolio mit Gleichgewichtung schätzt überhaupt nichts. Deshalb bewährt es sich auch dann, wenn die Schätzungen schlecht sind.

Schlägt die Gleichgewichtung die Optimierung tatsächlich?

Unter einer bestimmten Bedingung lautet die Antwort: ja. Betrachten wir die Begriffe nacheinander. Bei der Gleichgewichtung, geschrieben als 1/N, wird das Kapital gleichmäßig auf N Positionen verteilt. Eine Prognose ist nicht erforderlich. Die Mean-Variance-Optimierung ermittelt die Gewichte mit der besten erwarteten Rendite je Einheit geschätzter Varianz. Das Kelly-Kriterium ermittelt die Gewichte, die das langfristige exponentielle Wachstum maximieren. Bei unkorrelierten Vermögenswerten ergibt sich daraus ein Gewicht, das proportional zur erwarteten Überschussrendite des jeweiligen Vermögenswerts geteilt durch dessen Varianz ist. Unser Leitfaden zur Positionsgrößenbestimmung nach dem Kelly-Kriterium erläutert diese Formel ausführlich.

Beide Optimierungsverfahren benötigen dieselbe Eingabe: eine erwartete Rendite je Vermögenswert. Genau diese Größe wird von einer Stichprobe am unzuverlässigsten geschätzt. Die Volatilität lässt sich aus einem kurzen Zeitfenster mit brauchbarer Präzision bestimmen. Für den Mittelwert gilt das nicht. Der Unterschied ist in jeder Kursreihe groß genug, um sichtbar zu werden. Die nachstehende Übersicht umfasst sechs stark gehaltene Titel. Für jeden Titel wird jedes Kalenderjahr von 2015 bis 2024 separat ausgewertet. Ausgewiesen wird, wie weit die höchste und die niedrigste Jahresschätzung auseinanderliegen. Dies geschieht für jeden Titel zweimal: einmal für die annualisierte durchschnittliche Tagesrendite und einmal für die annualisierte Volatilität.

AbfrageZehn Jahre jährliche Schätzungen: Der Mittelwert bewegt sich deutlich stärker als die Volatilität
Das exakte SQL hinter jeder Zahl
WITH prices AS
(
    SELECT
        ticker,
        date,
        toFloat64(max(close)) AS c
    FROM global_markets.stocks_daily_aggs
    WHERE ticker IN ('AAPL', 'MSFT', 'NVDA', 'SPY', 'KO', 'JNJ')
      AND date >= '2015-01-01'
      AND date <  '2025-01-01'
    GROUP BY ticker, date
),
rets AS
(
    SELECT
        ticker,
        date,
        c / lagInFrame(c, 1) OVER (PARTITION BY ticker ORDER BY date ASC ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) - 1 AS ret
    FROM prices
),
yearly AS
(
    SELECT
        ticker,
        toYear(date)                     AS yr,
        avg(ret) * 252 * 100             AS mean_pct,
        stddevPop(ret) * sqrt(252) * 100 AS vol_pct
    FROM rets
    WHERE isFinite(ret)
    GROUP BY ticker, yr
    HAVING count() >= 200
)
SELECT
    ticker,
    round(max(mean_pct) - min(mean_pct), 1) AS mean_estimate_range_pct,
    round(max(vol_pct) - min(vol_pct), 1)   AS vol_estimate_range_pct
FROM yearly
GROUP BY ticker
ORDER BY mean_estimate_range_pct DESC
Run this yourself

Für NVDA umfasst die jährliche Schätzung des Mittelwerts über diese zehn Jahre eine Spanne von 184.7 Prozentpunkten. Bei der Volatilitätsschätzung desselben Titels über dieselben Jahre beträgt die Spanne dagegen 28.6 Prozentpunkte. Der Titel mit den stabilsten Werten in der Übersicht, KO, verzeichnete bei der jährlichen Mittelwertschätzung immer noch eine Spanne von 23.9 Prozentpunkten. Jedes Verfahren, das den Durchschnitt der Rendite des vergangenen Jahres als erwartete Rendite des laufenden Jahres an einen Optimierer übergibt, speist somit eine Größe mit einer derart großen Schwankungsbreite ein.

Wie lange muss eine Stichprobe sein, um eine erwartete Rendite zu schätzen?

Der Standardfehler einer geschätzten durchschnittlichen Rendite entspricht der Volatilität des Vermögenswerts geteilt durch die Quadratwurzel der Stichprobenlänge in Jahren. Maßgeblich sind Jahre, nicht die Zahl der Beobachtungen: Wer dieselben zwölf Monate stündlich statt täglich erfasst, gewinnt dadurch nichts. Setzt man einen Vermögenswert mit einer Volatilität von 20 Prozent in diese Formel ein, ergibt ein Jahr Historie einen Standardfehler von 20 Prozentpunkten pro Jahr. Vier Jahre halbieren ihn auf 10 Prozentpunkte. Um ihn auf einen Prozentpunkt zu senken – eine Präzision, die Sie benötigen würden, bevor Sie zwei Vermögenswerte mit einem tatsächlichen Mittelwertunterschied von zwei Prozentpunkten rangieren –, wären vier Jahrhunderte an Daten erforderlich.

Bei der Volatilität ist die Situation anders. Ihre Präzision verbessert sich mit der Zahl der Beobachtungen und nicht mit der Kalenderdauer. Deshalb liegt ihre Schätzung bereits bei einigen Monaten täglicher Daten bis auf wenige Prozentpunkte am tatsächlichen Wert. Die folgende Grafik teilt die täglichen Renditen eines Indexfonds über zwanzig Jahre in nicht überlappende Blöcke fester Länge auf. Für jeden Block werden beide Schätzungen berechnet. Anschließend wird ausgewiesen, wie stark die Schätzungen von Block zu Block streuen.

AbfrageStreuung der Mittelwert- und Volatilitätsschätzungen nach Stichprobenlänge
Das exakte SQL hinter jeder Zahl
WITH prices AS
(
    SELECT
        date,
        toFloat64(max(close)) AS c
    FROM global_markets.stocks_daily_aggs
    WHERE ticker = 'SPY'
      AND date >= '2005-01-01'
      AND date <  '2025-01-01'
    GROUP BY date
),
rets AS
(
    SELECT
        date,
        c / lagInFrame(c, 1) OVER (ORDER BY date ASC ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) - 1 AS ret
    FROM prices
),
numbered AS
(
    SELECT
        ret,
        row_number() OVER (ORDER BY date ASC) AS i
    FROM rets
    WHERE isFinite(ret)
),
sweep AS
(
    SELECT
        arrayJoin([21, 63, 126, 252, 504]) AS n,
        i,
        ret
    FROM numbered
),
blocks AS
(
    SELECT
        n,
        intDiv(i - 1, n)                 AS blk,
        avg(ret) * 252 * 100             AS mean_pct,
        stddevPop(ret) * sqrt(252) * 100 AS vol_pct
    FROM sweep
    GROUP BY n, blk
    HAVING count() = n
)
SELECT
    concat(toString(n), ' sessions') AS sample_length,
    round(stddevPop(mean_pct), 1)    AS mean_estimate_spread_pct,
    round(stddevPop(vol_pct), 1)     AS vol_estimate_spread_pct,
    count()                          AS window_count
FROM blocks
GROUP BY n
ORDER BY n ASC
Run this yourself

Bei Blöcken von 21 sessions streut die Schätzung des Mittelwerts über 53.7 Prozentpunkte. Bei der Volatilitätsschätzung auf denselben Blöcken sind es 10.9 Prozentpunkte. Verlängert man den Block auf 504 sessions, verringert sich die Streuung des Mittelwerts auf 10.6 Prozentpunkte. Die Streuung sinkt proportional zur Quadratwurzel: Jede Halbierung des Fehlers erfordert die vierfache Datenmenge.

Eine Simulation mit festgelegtem Zufallsstartwert zum eigenen Ausführen

Nichts davon belegt, dass der Schätzfehler groß genug ist, um 1/N den Sieg zu verschaffen. Diese Simulation tut es. Dafür benötigen Sie eine Python-Installation und sonst nichts: keine Datendateien, keine Downloads und keine Pakete von Drittanbietern. Die Renditen werden anhand von Parametern erzeugt, die Sie selbst festlegen. Die tatsächliche Lösung ist daher bekannt, und beide Allokationen können daran gemessen werden.

  1. Importieren Sie zwei Module, import random und import statistics, sowie from math import log. Setzen Sie in der nächsten Zeile mit random.seed(20260816) den Zufallsstartwert.
  2. Definieren Sie fünf Assets mit tatsächlichen erwarteten Jahresrenditen von fünf, sechs, sieben, acht und neun Prozent. Die tatsächliche annualisierte Volatilität beträgt für jedes Asset 20 Prozent; die Assets sind unkorreliert. Wandeln Sie die Werte mit mu_d = mu_a / 252 und sd_d = sd_a / (252 ** 0.5) in tägliche Größen um.
  3. Wählen Sie eine Stichprobenlänge T aus dem Raster [60, 125, 250, 500, 1000, 2500, 5000].
  4. Erzeugen Sie mit random.gauss(mu_d, sd_d) für jedes Asset T tägliche Renditen. Diese Stichprobe ist die gesamte Historie, die dem Manager zur Verfügung steht.
  5. Schätzen Sie den Mittelwert jedes Assets mit statistics.mean und dessen Volatilität mit statistics.stdev. Diese beiden Schätzungen sind die einzigen Informationen, die der Optimierer verwendet.
  6. Erstellen Sie das gleichgewichtete Portfolio, indem Sie jedem der fünf Assets ein Gewicht von 0,2 zuweisen. Es verwendet keine der Schätzungen.
  7. Erstellen Sie das optimierte Portfolio, indem Sie zunächst jedes Rohgewicht auf mu_hat / (sd_hat ** 2) setzen. Teilen Sie anschließend jedes Gewicht durch die Summe der absoluten Rohgewichte. Damit haben beide Portfolios dasselbe Bruttoengagement.
  8. Erzeugen Sie für jedes Asset einen neuen Out-of-Sample-Pfad mit 2520 täglichen Renditen aus den tatsächlichen Parametern. Keine der beiden Allokationen hat diese Daten gesehen.
  9. Bewerten Sie beide Portfolios anhand dieses Pfads mit dem Durchschnitt von log(1 + r). Dabei ist r die gewichtete Summe der Renditen der fünf Assets an diesem Tag.
  10. Wiederholen Sie die Schritte 4 bis 9 für 2000 unabhängige Durchläufe bei jedem T. Halten Sie fest, in welchem Anteil der Durchläufe das gleichgewichtete Portfolio besser abschneidet als das Portfolio mit optimierten Gewichten.

Lesen Sie das Raster von kleinen zu großen T-Werten. Am unteren Ende gewinnt das gleichgewichtete Portfolio in der deutlichen Mehrheit der Durchläufe. Dieser Anteil sinkt mit zunehmendem T kontinuierlich. Am oberen Ende gewinnen die optimierten Gewichte in den meisten Durchläufen. Dazwischen kreuzen sich die beiden Ergebnisse. Der Kreuzungspunkt verschiebt sich mit dem Zufallsstartwert und mit der Differenz zwischen den tatsächlichen Mittelwerten. Die Richtung bleibt gleich: Mehr Daten begünstigen den Optimierer, weniger Daten begünstigen 1/N. Um die Simulation zu reproduzieren, ändern Sie die Ganzzahl innerhalb von random.seed(20260816) und führen Sie das Raster erneut aus.

Warum der Optimierer eine fehlerhafte Mittelwertschätzung verstärkt

Sehen Sie sich an, an welcher Stelle die Schätzungen in das Gewicht eingehen. Der geschätzte Mittelwert steht im Zähler, die geschätzte Varianz im Nenner. Verdoppelt sich die Mittelwertschätzung, verdoppelt sich das Gewicht. Wird die Varianzschätzung um ein Viertel reduziert, steigt das Gewicht um ein Drittel. In einer günstigen Stichprobe weisen beide Fehler in dieselbe Richtung: Eine Serie guter Renditen erhöht den gemessenen Mittelwert und senkt häufig zugleich die gemessene Varianz über denselben Zeitraum. Der Optimierer stuft diesen Vermögenswert als herausragend in der Gruppe ein und gewichtet ihn entsprechend. Außerhalb der Stichprobe ist er wieder ein gewöhnliches Mitglied der Gruppe. Eine Gleichgewichtung hat die günstige Stichprobe nie gesehen.

Die Simulation zeigt die harmlosere Variante dieses Problems. Fünf unkorrelierte Vermögenswerte ergeben eine diagonale Kovarianzmatrix, die nicht invertiert werden muss. In realen Portfolios bestehen jedoch Korrelationen. Eine Stichproben-Kovarianzmatrix, die aus kaum mehr Beobachtungen als Vermögenswerten geschätzt wird, liegt nahe an der Singularität. Ihre Invertierung verstärkt kleine Eingabefehler zu sehr großen Gewichten. So kann ein Optimierer in einem Titel eine Position von mehreren Malen des eingesetzten Kapitals aufbauen und gleichzeitig eine gegenläufige Short-Position in seinem engen Ersatzwert eingehen. Unser Hinweis zum Konzentrationsrisiko in einem Portfolio erläutert, welche Auswirkungen ein solches Gewicht auf einen Drawdown hat.

Auch die Eingabedaten bleiben nicht konstant. Die folgende Grafik zeigt für einen breiten Indexfonds und einen großen Konsumgüterkonzern den gleitenden Durchschnitt der täglichen Rendite über ein Jahr, annualisiert und monatlich ermittelt.

AbfrageRollierender Jahresmittelwert der Rendite, die Zahl für den Optimierer
Das exakte SQL hinter jeder Zahl
WITH prices AS
(
    SELECT
        ticker,
        date,
        toFloat64(max(close)) AS c
    FROM global_markets.stocks_daily_aggs
    WHERE ticker IN ('SPY', 'KO')
      AND date >= '2015-10-01'
      AND date <  '2025-01-01'
    GROUP BY ticker, date
),
rets AS
(
    SELECT
        ticker,
        date,
        c / lagInFrame(c, 1) OVER (PARTITION BY ticker ORDER BY date ASC ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) - 1 AS ret
    FROM prices
),
trailing AS
(
    SELECT
        ticker,
        date,
        avg(ret) OVER (PARTITION BY ticker ORDER BY date ASC ROWS BETWEEN 251 PRECEDING AND CURRENT ROW) * 252 * 100 AS trailing_mean_pct,
        row_number() OVER (PARTITION BY ticker ORDER BY date ASC) AS i
    FROM rets
    WHERE isFinite(ret)
)
SELECT
    toString(toStartOfMonth(date))                     AS month,
    round(avgIf(trailing_mean_pct, ticker = 'SPY'), 1) AS spy_trailing_mean_pct,
    round(avgIf(trailing_mean_pct, ticker = 'KO'), 1)  AS ko_trailing_mean_pct
FROM trailing
WHERE i >= 252
  AND date >= '2017-01-01'
GROUP BY month
ORDER BY month ASC
Run this yourself

Jeder Punkt auf diesen beiden Linien ist eine Zahl, die ein Optimierer an diesem Datum als erwartete Rendite akzeptiert hätte. Der erste Monatswert für SPY beträgt 17.7%, der letzte 25.8%; dazwischen liegen 96 Werte. KO beginnt denselben Zeitraum bei -0.4%. Ein Gewichtungsschema, das diese Zeitreihe Monat für Monat verarbeitet, übernimmt jede ihrer Schwankungen.

Beheben Half Kelly und Shrinkage das Problem?

Sie mildern es. In der Praxis kommen vier Korrekturen zum Einsatz. Jede gibt einen Teil des theoretischen Optimums auf und macht das Ergebnis dadurch weniger empfindlich gegenüber Schätzfehlern.

  • Half Kelly halbiert jedes Gewicht. Die Kelly-Wachstumskurve ist nahe ihrem Maximum flach und fällt unterhalb davon steil ab. Eine halbe Position gibt daher nur einen kleinen Teil der theoretischen Wachstumsrate auf, reduziert den Schaden einer überschätzten Mehrrendite aber deutlich stärker. Volatilitätssteuerung folgt demselben Prinzip beim Nenner. Die Positionsgröße wird aus dem einzigen Parameter abgeleitet, den eine kurze Stichprobe verlässlich liefern kann.
  • Shrinkage zieht jeden geschätzten Mittelwert umso stärker zum Querschnittsmittel der Schätzungen, je kleiner die Stichprobe ist. Im Grenzfall wird für jedes Asset dieselbe erwartete Rendite angenommen. Bei gleicher Volatilität liefert der Optimierer dann von selbst eine Gleichgewichtung. Gleichgewichtung ist das vollständig geschrumpfte Portfolio.
  • Restriktionen, also ein Leerverkaufsverbot und eine Obergrenze je Position, begrenzen den Einfluss eines einzelnen zufällig günstigen Schätzwerts auf ein Gewicht. Sie dienen der Schadensbegrenzung und verbessern den Schätzwert nicht.
  • Werden erwartete Renditen vollständig weggelassen, bleiben Minimum-Varianz- und Risk-Parity-Ansätze. Sie verwenden nur die Kovarianz. Das ist der Input, den die Stichprobe tatsächlich liefern kann.

Keine dieser vier Maßnahmen erzeugt Informationen, die in der Stichprobe nicht enthalten sind. Sie verändern nur, wie stark das Portfolio von Informationen abhängt, über die Sie möglicherweise nicht verfügen.

Wenn Optimierung ihren Aufwand rechtfertigt

Der Umschlagpunkt funktioniert in beide Richtungen. Sobald T im Verhältnis zum Abstand zwischen den tatsächlichen Mittelwerten groß wird, setzt sich die optimierte Allokation durch und bleibt vorn. Je größer dieser Abstand ist, desto früher geschieht das. Optimierung ist außerdem immer dann das richtige Instrument, wenn die Daten den Input liefern: Kovarianzen und Hedge Ratios lassen sich deutlich besser schätzen als erwartete Renditen.

Die Gleichgewichtung hat ihren eigenen Preis. Sie ignoriert Informationen, die tatsächlich vorliegen. In einem kleinen Anlageuniversum konzentriert sie sich zudem genauso stark wie jeder Optimierer. Betrachten Sie sie als Baseline, die jede alternative Gewichtung mit Daten schlagen muss, die bei der Bestimmung der Gewichte nicht verwendet wurden. Gewichte anzupassen und sie in derselben Stichprobe zu bewerten, ist Look-ahead-Bias im Backtesting unter einem anderen Namen. Es lässt den Optimierer jedes Mal besser aussehen, als er ist. Für eine belastbare Bandbreite um einen gemessenen Vorteil statt um eine einzelne Punktschätzung sind Bootstrap-Konfidenzintervalle das Standardinstrument.

FAQ

Übertrifft Gleichgewichtung tatsächlich die Mean-Variance-Optimierung?

Bei kurzen Stichproben ist das häufig der Fall. Ein Optimierer benötigt eine Schätzung der erwarteten Rendite jedes Vermögenswerts. Diese Schätzung hat einen Standardfehler von ungefähr der Volatilität des Vermögenswerts geteilt durch die Quadratwurzel der Stichprobenlänge in Jahren. Solange dieser Fehler größer bleibt als die tatsächlichen Unterschiede zwischen den Vermögenswerten, sortiert der Optimierer Zufallsrauschen. Bei der Gleichgewichtung gibt es keine Renditeschätzung, die falsch sein kann.

Wie viele Beobachtungen benötigt man für die Schätzung einer erwarteten Rendite?

Mehr, als fast jeder zur Verfügung hat. Bei einem Vermögenswert mit einer Volatilität von 20 Prozent führt ein Jahr mit Tagesdaten zu einem Standardfehler von nahezu 20 Prozentpunkten pro Jahr. Um diesen Fehler zu halbieren, ist ein viermal so langer Kalenderzeitraum erforderlich. Zusätzliche Intraday-Beobachtungen innerhalb desselben Jahres helfen nicht. Die Volatilität lässt sich dagegen bereits anhand einiger Monate an Daten sinnvoll schätzen.

Ist Half Kelly einfach ein kleinerer Einsatz?

Es ist ein kleinerer Einsatz zu günstigen Bedingungen. Die Kelly-Wachstumskurve ist in der Nähe ihres Maximums flach. Eine Halbierung des Einsatzes kostet daher nur einen kleinen Teil der theoretischen Wachstumsrate. Gleichzeitig wird die Volatilität des Verlaufs ungefähr halbiert und der Verlust durch eine überschätzte Überrendite verringert.

Was ist das 1/N-Portfolio?

Es ist ein Portfolio, das einen gleich großen Kapitalanteil in jede von N Positionen investiert und nach einem festen Zeitplan rebalanciert. Es benötigt weder eine Renditeprognose noch eine Kovarianzschätzung. Deshalb ist es der Standardbenchmark für alle Gewichtungsschemata, die solche Schätzungen benötigen.

Aufbau der Panels

Alle drei Panels verwenden Tagesschlusskurse und berechnen einfache Renditen von Schlusskurs zu Schlusskurs. Doppelte Zeilen werden auf einen Schlusskurs je Ticker und Datum reduziert. Die Mittelwerte werden annualisiert, indem die durchschnittliche Tagesrendite mit 252 Handelstagen multipliziert wird. Die Volatilitäten werden annualisiert, indem die tägliche Standardabweichung mit der Quadratwurzel von 252 multipliziert wird. Das Jahres-Panel berücksichtigt ein Kalenderjahr nur, wenn mindestens 200 Handelstage vorliegen. Das Block-Panel verwendet nicht überlappende Blöcke und verwirft den letzten unvollständigen Block bei jeder Länge. Die Spalte zur Anzahl der Fenster zeigt, wie viele Blöcke bei der jeweiligen Länge entstanden sind. Dividenden werden an keiner Stelle berücksichtigt. Es handelt sich daher um Kursrenditen, und das Niveau eines Mittelwerts ist bei Dividendenzahlern zu niedrig. Entscheidend ist die Streuung der Schätzungen, nicht deren Niveau.


Jedes Panel enthält unterhalb der Grafik den exakten SQL-Code. Die Simulation enthält außerdem ihren Seed. Wenn Sie dieselbe Prüfung der Schätzstabilität für Ihre eigene Titelliste durchführen möchten, können Sie sie auf dem Strasmore-Terminal in normaler Sprache anfordern.

#quant#position sizing#portfolio construction#estimation error#kelly