Glossar-Links: Fachbegriffe im Fließtext automatisch verlinken
Auto-Linking im Build: Glossar-Begriffe werden im Fließtext automatisch
erkannt und als Link auf den Glossar-Eintrag gesetzt — erste Nennung je
Begriff je Datei, dezent gestrichelte Unterstreichung im HTML, hyperref
im PDF. Kein manuelles Markieren bei Textänderungen nötig.
Neue Infrastruktur:
- glossar_eintraege_04.py: glossar_slug() + LINK_TEXTE-Map (automatisch
generiert aus EINTRAEGEN + Abkürzungs-Extraktion)
- erzeuge_glossar_04.py: jeder Eintrag bekommt {#gloss:<slug>}-Anchor
- build_version_04.py: resolve_glossar() — Auto-Linking + {gl:}-Marke
- web_04/site.css: .glossar-link (dezent, nicht wie Navigationslink)
5 neue Glossar-Einträge (waren als Begriff im Text, aber nicht im Glossar):
Solver, Scheduling, Graphen, Backtest, DCP (Disciplined Convex Programming)
Schutzmechanismen:
- Code-Blöcke, Inline-Code, {idx:}/{ref:}-Marken, Markdown-Links und
Überschriften werden nicht verlinkt
- Verschachtelung verhindert: 'CP-SAT-Solver' als Ganzes, nicht 'CP'+[
-'SAT'+[-'Solver'
- 'OR' als 2-Zeichen-Abkürzung nicht auto-verlinkt (False Positive in
'OR-Tools'); {gl:OR} als manuelle Marke
- Glossar selbst nicht auto-verlinkt (sonst Self-Links)
- reflow_markdown(): ::: als Block-Grenze (sonst kollabiert fenced div)
619 Glossar-Links im Gesamtdokument, 239 Anchor im Glossar, 34 im Vorwort.
This commit is contained in:
parent
81ddb02d5c
commit
e8abb66d75
52 changed files with 4316 additions and 1921 deletions
36
OR_HTML_04/cvar.html
generated
36
OR_HTML_04/cvar.html
generated
|
|
@ -104,8 +104,8 @@
|
|||
<blockquote>
|
||||
<p><strong>📌 Kapitel auf einen Blick</strong></p>
|
||||
<p><strong>Worum geht es?</strong> Um zwei Schwächen des Markowitz-Modells: Es unterschätzt Extremverluste und ignoriert die Kosten des Umschichtens. Beide lassen sich mit konvexen Mitteln beheben.</p>
|
||||
<p><strong>Voraussetzungen:</strong> <a href="markowitz.html#kap-markowitz">Kapitel 19</a>, <a href="lp.html#kap-lp">Kapitel 5</a> (LP-Formulierungen).</p>
|
||||
<p><strong>Danach können Sie:</strong> VaR und CVaR unterscheiden, den CVaR nach Rockafellar/Uryasev als lineares Programm formulieren, Turnover über die <span class="math inline">L_1</span>-Norm bestrafen — und begründen, warum VaR-Kennzahlen nicht über Einheiten addiert werden dürfen.</p>
|
||||
<p><strong>Voraussetzungen:</strong> <a href="markowitz.html#kap-markowitz">Kapitel 19</a>, <a href="lp.html#kap-lp">Kapitel 5</a> (<a href="anhang-glossar.md#gloss:lineare-programmierung-lp" class="glossar-link">LP</a>-Formulierungen).</p>
|
||||
<p><strong>Danach können Sie:</strong> <a href="anhang-glossar.md#gloss:value-at-risk-var" class="glossar-link">VaR</a> und <a href="anhang-glossar.md#gloss:conditional-value-at-risk-cvar" class="glossar-link">CVaR</a> unterscheiden, den CVaR nach Rockafellar/Uryasev als lineares Programm formulieren, Turnover über die <span class="math inline">L_1</span>-Norm bestrafen — und begründen, warum VaR-Kennzahlen nicht über Einheiten addiert werden dürfen.</p>
|
||||
<p><strong>Zeitbedarf:</strong> ca. 5 Stunden.</p>
|
||||
<p><strong>Programme:</strong><br />
|
||||
<code>VaR_CVaR_Demo.py</code><br />
|
||||
|
|
@ -179,11 +179,11 @@ Anlage B: VaR(95) 3.00 % CVaR(95) 9.17 %</code></pre>
|
|||
<ol type="1">
|
||||
<li>… erklären, warum Marktrenditen keine Normalverteilung haben und was daraus folgt.</li>
|
||||
<li>… VaR und CVaR definieren und begründen, warum nur der CVaR kohärent ist.</li>
|
||||
<li>… das Rockafellar-Uryasev-Theorem anwenden, um den CVaR linear zu formulieren.</li>
|
||||
<li>… Transaktionskosten über die <span class="math inline">L_1</span>-Norm modellieren.</li>
|
||||
<li>… das <a href="anhang-glossar.md#gloss:rockafellar-uryasev-theorem" class="glossar-link">Rockafellar-Uryasev-Theorem</a> anwenden, um den CVaR linear zu formulieren.</li>
|
||||
<li>… <a href="anhang-glossar.md#gloss:transaktionskosten" class="glossar-link">Transaktionskosten</a> über die <span class="math inline">L_1</span>-Norm modellieren.</li>
|
||||
<li>… Einheiten konsistent halten und Nebenbedingungen vektorisieren.</li>
|
||||
<li>… erklären, warum zwei Anlagen mit identischem VaR völlig verschiedene Extremverluste haben können.</li>
|
||||
<li>… die Folgen fehlender Subadditivität für die Verteilung von Risikobudgets benennen.</li>
|
||||
<li>… die Folgen fehlender <a href="anhang-glossar.md#gloss:subadditivitaet" class="glossar-link">Subadditivität</a> für die Verteilung von Risikobudgets benennen.</li>
|
||||
</ol>
|
||||
<hr />
|
||||
<h2 id="sec:cvar-die-zwei-schwaechen-des-markowitz-modells">20.3 Die zwei Schwächen des Markowitz-Modells</h2>
|
||||
|
|
@ -319,7 +319,7 @@ VaR: Portfolio 98.00 vs. Summe -4.00 -> VERLETZT die Subadditivitaet!
|
|||
CVaR: Portfolio 101.33 vs. Summe 159.24 -> subadditiv (kohaerent)
|
||||
========================================================================================</code></pre>
|
||||
<p><strong>Die 6-Sigma-Zeile setzt die Sache ins Verhältnis:</strong> Unter Normalverteilung wäre ein solcher Tag ein Ereignis von einmal in <strong>zwei Millionen Jahren</strong>. Unter der t-Verteilung mit drei Freiheitsgraden — die realen Aktienrenditen deutlich näher kommt — passiert er etwa alle <strong>zwei Jahre</strong>. Der Faktor beträgt fast <strong>eine Million</strong>.</p>
|
||||
<p>Und Teil 2 zeigt das Grundproblem des VaR an einem Beispiel, das Sie von Hand nachrechnen können: Einzeln meldet er für jede Anleihe einen <em>Gewinn</em> von 2 €, im Portfolio einen <em>Verlust</em> von 98 €. Diversifikation hätte demnach das Risiko um 102 € erhöht. Der CVaR dagegen verhält sich korrekt: 101,33 € im Portfolio gegenüber 159,24 € bei getrennter Betrachtung — die Streuung <strong>senkt</strong> das Risiko, wie es sein muss.</p>
|
||||
<p>Und Teil 2 zeigt das Grundproblem des VaR an einem Beispiel, das Sie von Hand nachrechnen können: Einzeln meldet er für jede Anleihe einen <em>Gewinn</em> von 2 €, im Portfolio einen <em>Verlust</em> von 98 €. <a href="anhang-glossar.md#gloss:diversifikation" class="glossar-link">Diversifikation</a> hätte demnach das Risiko um 102 € erhöht. Der CVaR dagegen verhält sich korrekt: 101,33 € im Portfolio gegenüber 159,24 € bei getrennter Betrachtung — die Streuung <strong>senkt</strong> das Risiko, wie es sein muss.</p>
|
||||
<figure>
|
||||
<img src="bilder_04/kap_cvar_subadditivitaet.svg" alt="Abb. 20.1: Dieselbe Tabelle als Bild, gerechnet mit denselben Ziehungen wie VaR_CVaR_Demo.py. Erzeugt von bilder_04/erzeuge_var_vs_cvar.py." />
|
||||
<figcaption aria-hidden="true">Abb. 20.1: Dieselbe Tabelle als Bild, gerechnet mit denselben Ziehungen wie <code>VaR_CVaR_Demo.py</code>. Erzeugt von <code>bilder_04/erzeuge_var_vs_cvar.py</code>.</figcaption>
|
||||
|
|
@ -336,7 +336,7 @@ CVaR: Portfolio 101.33 vs. Summe 159.24 -> subadditiv (kohaerent)
|
|||
<figcaption aria-hidden="true">Abb. 20.2: Der VaR ist eine Schwelle, der CVaR ein Mittelwert. 20 000 simulierte Tagesrenditen aus dem Fat-Tail-Modell dieses Kapitels (<span class="math inline">t</span>-Verteilung mit drei Freiheitsgraden). Der schraffierte Bereich sind die schlechtesten 5 % der Tage; der VaR markiert nur ihren Rand, der CVaR ihren Mittelwert. Erzeugt von <code>bilder_04/erzeuge_var_cvar.py</code>.</figcaption>
|
||||
</figure>
|
||||
<p><strong>Value at Risk (<span class="math inline">\text{VaR}_\alpha</span>):</strong> Der Verlust, der mit Wahrscheinlichkeit <span class="math inline">\alpha</span> nicht überschritten wird.</p>
|
||||
<p><strong>Conditional Value at Risk (<span class="math inline">\text{CVaR}_\alpha</span>, auch <em>Expected Shortfall</em>):</strong> Der <strong>durchschnittliche Verlust in den schlimmsten <span class="math inline">(1-\alpha)</span> Prozent</strong> der Fälle.</p>
|
||||
<p><strong>Conditional Value at Risk (<span class="math inline">\text{CVaR}_\alpha</span>, auch <em><a href="anhang-glossar.md#gloss:expected-shortfall" class="glossar-link">Expected Shortfall</a></em>):</strong> Der <strong>durchschnittliche Verlust in den schlimmsten <span class="math inline">(1-\alpha)</span> Prozent</strong> der Fälle.</p>
|
||||
<blockquote>
|
||||
<p><strong>📐 Der Unterschied in einem Satz</strong> Der VaR sagt: <em>„In 95 % der Tage verlieren Sie höchstens 1,86 %.“</em> Der CVaR sagt: <em>„Und wenn es doch schiefgeht, verlieren Sie im Mittel 2,99 %.“</em></p>
|
||||
<p>Beide Zahlen stammen aus der Verteilung oben — nachzurechnen mit <code>bilder_04/erzeuge_var_cvar.py</code>.</p>
|
||||
|
|
@ -367,7 +367,7 @@ CVaR: Portfolio 101.33 vs. Summe 159.24 -> subadditiv (kohaerent)
|
|||
<td>✓ ja</td>
|
||||
</tr>
|
||||
<tr class="odd">
|
||||
<td>Kohärentes Risikomaß</td>
|
||||
<td><a href="anhang-glossar.md#gloss:kohaerentes-risikomass" class="glossar-link">Kohärentes Risikomaß</a></td>
|
||||
<td>✗ nein</td>
|
||||
<td>✓ ja</td>
|
||||
</tr>
|
||||
|
|
@ -399,7 +399,7 @@ CVaR: Portfolio 101.33 vs. Summe 159.24 -> subadditiv (kohaerent)
|
|||
<blockquote>
|
||||
<p><strong>📐 Formel-Lesehilfe — der Trick in drei Schritten</strong> * <span class="math inline">\gamma</span> ist eine <strong>Hilfsvariable</strong>, die im Optimum automatisch den VaR annimmt. Man muss ihn also <strong>nicht vorher kennen</strong> — das ist der eigentliche Durchbruch. * <span class="math inline">-\mathbf{R}_s^\top\mathbf{w}</span> ist der <strong>Verlust</strong> im Szenario <span class="math inline">s</span> (Rendite mit negativem Vorzeichen). * <span class="math inline">u_s \ge \text{Verlust}_s - \gamma</span> zusammen mit <span class="math inline">u_s \ge 0</span> bedeutet: <span class="math inline">u_s = \max(\text{Verlust}_s - \gamma,\ 0)</span> — der <strong>Überschuss über die Schwelle</strong>. Liegt der Verlust unter <span class="math inline">\gamma</span>, ist <span class="math inline">u_s = 0</span> und das Szenario zählt nicht.</p>
|
||||
<p><strong>Ohne Formel gesagt:</strong> „Wähle eine Schwelle <span class="math inline">\gamma</span>. Zähle für jedes Szenario, wie weit der Verlust darüber hinausgeht. Der CVaR ist die Schwelle plus der gemittelte Überschuss — und zwar für diejenige Schwelle, bei der diese Summe minimal wird.“</p>
|
||||
<p><strong>Warum <span class="math inline">u_s</span> automatisch das Maximum wird:</strong> Die Zielfunktion minimiert die Summe der <span class="math inline">u_s</span>. Jedes <span class="math inline">u_s</span> wird also so klein wie möglich gedrückt — bis an die Grenze, die die beiden Ungleichungen erlauben. Das ist genau das Maximum der beiden Untergrenzen.</p>
|
||||
<p><strong>Warum <span class="math inline">u_s</span> automatisch das Maximum wird:</strong> Die <a href="anhang-glossar.md#gloss:zielfunktion" class="glossar-link">Zielfunktion</a> minimiert die Summe der <span class="math inline">u_s</span>. Jedes <span class="math inline">u_s</span> wird also so klein wie möglich gedrückt — bis an die Grenze, die die beiden Ungleichungen erlauben. Das ist genau das Maximum der beiden Untergrenzen.</p>
|
||||
</blockquote>
|
||||
<div class="card card-formel">
|
||||
<blockquote>
|
||||
|
|
@ -449,7 +449,7 @@ CVaR: Portfolio 101.33 vs. Summe 159.24 -> subadditiv (kohaerent)
|
|||
</table>
|
||||
<p><strong>In einem Satz:</strong> <em>Der CVaR ist der Mittelwert der schlimmsten <span class="math inline">1-\alpha</span> Prozent — der Bruch vor der Summe sorgt allein dafür, dass durch die richtige Anzahl geteilt wird.</em></p>
|
||||
<blockquote>
|
||||
<p><strong>⚠️ Die teuerste Verwechslung des Kapitels</strong> > <span class="math inline">\alpha</span> und <span class="math inline">1-\alpha</span> zu vertauschen führt zu <strong>keiner Fehlermeldung</strong>. Das Modell > rechnet weiter, nur eben über die falsche Menge. An 2 000 simulierten Tagesrenditen mit > Fat Tails gemessen: > > | Rechnung | gemittelt über | CVaR | > | — | — | — | > | richtig (<span class="math inline">\alpha = 0{,}95</span>, Rand 5 %) | 100 von 2 000 Szenarien | <strong>3,43 %</strong> | > | vertauscht (Rand 95 %) | 1 900 von 2 000 Szenarien | <strong>0,18 %</strong> | > > Ein Faktor <strong>19</strong> — und die zweite Zahl ist kein schlecht geschätztes Randrisiko, sondern > überhaupt kein Randmaß mehr: Sie mittelt über fast alle Tage und schließt die schlimmen > gerade nicht ein. Der größte Einzelverlust der Stichprobe beträgt 21,4 %. > > <strong>Die Gegenprobe kostet eine Zeile:</strong> Ist der berechnete CVaR nicht deutlich größer als > der mittlere Verlust, stimmt <span class="math inline">\alpha</span> nicht.</p>
|
||||
<p><strong>⚠️ Die teuerste Verwechslung des Kapitels</strong> > <span class="math inline">\alpha</span> und <span class="math inline">1-\alpha</span> zu vertauschen führt zu <strong>keiner Fehlermeldung</strong>. Das Modell > rechnet weiter, nur eben über die falsche Menge. An 2 000 simulierten Tagesrenditen mit > <a href="anhang-glossar.md#gloss:fat-tails" class="glossar-link">Fat Tails</a> gemessen: > > | Rechnung | gemittelt über | CVaR | > | — | — | — | > | richtig (<span class="math inline">\alpha = 0{,}95</span>, Rand 5 %) | 100 von 2 000 Szenarien | <strong>3,43 %</strong> | > | vertauscht (Rand 95 %) | 1 900 von 2 000 Szenarien | <strong>0,18 %</strong> | > > Ein Faktor <strong>19</strong> — und die zweite Zahl ist kein schlecht geschätztes Randrisiko, sondern > überhaupt kein Randmaß mehr: Sie mittelt über fast alle Tage und schließt die schlimmen > gerade nicht ein. Der größte Einzelverlust der Stichprobe beträgt 21,4 %. > > <strong>Die Gegenprobe kostet eine Zeile:</strong> Ist der berechnete CVaR nicht deutlich größer als > der mittlere Verlust, stimmt <span class="math inline">\alpha</span> nicht.</p>
|
||||
</blockquote>
|
||||
</blockquote>
|
||||
</div>
|
||||
|
|
@ -469,7 +469,7 @@ CVaR: Portfolio 101.33 vs. Summe 159.24 -> subadditiv (kohaerent)
|
|||
<p><strong>Ohne Formel gesagt:</strong> „Wenn du 5 % von A verkaufst und 5 % von B kaufst, hast du 10 % Umschlag und zahlst darauf Gebühren.“</p>
|
||||
<p><strong>Warum <span class="math inline">L_1</span> und nicht <span class="math inline">L_2</span>?</strong> Die <span class="math inline">L_1</span>-Norm ist konvex (also optimierbar) und erzeugt zusätzlich <strong>dünn besetzte Änderungen</strong>: Sie bevorzugt wenige große Umschichtungen gegenüber vielen kleinen. Das entspricht genau dem, was man in der Praxis will — nicht 50 Kleinstorders mit je 3 € Mindestgebühr.</p>
|
||||
</blockquote>
|
||||
<p>In CVXPY schreibt man einfach <code>cp.norm1(w - w_alt)</code>; intern wird das in lineare Hilfsvariablen zerlegt.</p>
|
||||
<p>In <a href="anhang-glossar.md#gloss:cvxpy" class="glossar-link">CVXPY</a> schreibt man einfach <code>cp.norm1(w - w_alt)</code>; intern wird das in lineare Hilfsvariablen zerlegt.</p>
|
||||
<hr />
|
||||
<h2 id="sec:cvar-implementierung-cvar-portfolio-mit-reibung">20.6 Implementierung: CVaR-Portfolio mit Reibung</h2>
|
||||
<blockquote>
|
||||
|
|
@ -478,7 +478,7 @@ CVaR: Portfolio 101.33 vs. Summe 159.24 -> subadditiv (kohaerent)
|
|||
<div class="sourceCode" id="cb5"><pre class="sourceCode python"><code class="sourceCode python"><span id="cb5-1"><a href="#cb5-1" aria-hidden="true" tabindex="-1"></a>mu <span class="op">=</span> returns_df.mean().values <span class="op">*</span> <span class="dv">252</span> <span class="co"># ANNUALISIERT</span></span>
|
||||
<span id="cb5-2"><a href="#cb5-2" aria-hidden="true" tabindex="-1"></a>cvar <span class="op">=</span> gamma <span class="op">+</span> (<span class="dv">1</span><span class="op">/</span>(S<span class="op">*</span>(<span class="dv">1</span><span class="op">-</span>alpha))) <span class="op">*</span> cp.<span class="bu">sum</span>(u) <span class="co"># TAEGLICH</span></span>
|
||||
<span id="cb5-3"><a href="#cb5-3" aria-hidden="true" tabindex="-1"></a>objective <span class="op">=</span> cp.Maximize(mu <span class="op">@</span> w <span class="op">-</span> lambda_risk <span class="op">*</span> cvar <span class="op">-</span> trans_costs)</span></code></pre></div>
|
||||
<p>Der Risikoterm ist dadurch faktisch um Faktor 252 zu schwach gewichtet: <code>lambda_risk = 1.5</code> bedeutet dann effektiv eine Risikoaversion von <span class="math inline">1{,}5/252 \approx 0{,}006</span>. Das Modell ist nicht falsch im Sinne von unlösbar — aber der Parameter bedeutet nicht, was er zu bedeuten scheint, und lässt sich daher nicht sinnvoll einstellen.</p>
|
||||
<p>Der Risikoterm ist dadurch faktisch um Faktor 252 zu schwach gewichtet: <code>lambda_risk = 1.5</code> bedeutet dann effektiv eine Risikoaversion von <span class="math inline">1{,}5/252 \approx 0{,}006</span>. Das Modell ist nicht falsch im Sinne von unlösbar — aber der <a href="anhang-glossar.md#gloss:parameter" class="glossar-link">Parameter</a> bedeutet nicht, was er zu bedeuten scheint, und lässt sich daher nicht sinnvoll einstellen.</p>
|
||||
<p><strong>Dieses Programm rechnet deshalb durchgehend auf Tagesbasis</strong> und annualisiert erst in der Ausgabe.</p>
|
||||
</blockquote>
|
||||
<div class="sourceCode" id="cb6"><pre class="sourceCode python"><code class="sourceCode python"><span id="cb6-1"><a href="#cb6-1" aria-hidden="true" tabindex="-1"></a><span class="co">#!/usr/bin/env python3</span></span>
|
||||
|
|
@ -676,20 +676,20 @@ CVaR: Portfolio 101.33 vs. Summe 159.24 -> subadditiv (kohaerent)
|
|||
<p>statt</p>
|
||||
<div class="sourceCode" id="cb8"><pre class="sourceCode python"><code class="sourceCode python"><span id="cb8-1"><a href="#cb8-1" aria-hidden="true" tabindex="-1"></a><span class="cf">for</span> s <span class="kw">in</span> <span class="bu">range</span>(S):</span>
|
||||
<span id="cb8-2"><a href="#cb8-2" aria-hidden="true" tabindex="-1"></a> bedingungen.append(u[s] <span class="op">>=</span> <span class="op">-</span>R[s] <span class="op">@</span> w <span class="op">-</span> gamma) <span class="co"># S einzelne Bedingungen</span></span></code></pre></div>
|
||||
<p>Beide beschreiben <strong>dasselbe Modell</strong>. Der Unterschied liegt im Aufbau: CVXPY muss im zweiten Fall 500 einzelne Ausdrucksbäume erzeugen, prüfen und zusammensetzen. Bei einem Backtest mit 60 Rebalancings (<a href="handelsmaschine.html#kap-handelsmaschine">Kapitel 21</a>) summiert sich das erheblich.</p>
|
||||
<p><strong>Die allgemeine Regel:</strong> Wenn Sie in einer Modellierungssprache eine Python-Schleife über Datenzeilen schreiben, prüfen Sie, ob sich dasselbe als Matrixoperation ausdrücken lässt. Der Solver rechnet ohnehin mit Matrizen — der Umweg über einzelne Ausdrücke kostet nur Aufbauzeit.</p>
|
||||
<p>Beide beschreiben <strong>dasselbe Modell</strong>. Der Unterschied liegt im Aufbau: CVXPY muss im zweiten Fall 500 einzelne Ausdrucksbäume erzeugen, prüfen und zusammensetzen. Bei einem <a href="anhang-glossar.md#gloss:backtest" class="glossar-link">Backtest</a> mit 60 Rebalancings (<a href="handelsmaschine.html#kap-handelsmaschine">Kapitel 21</a>) summiert sich das erheblich.</p>
|
||||
<p><strong>Die allgemeine Regel:</strong> Wenn Sie in einer Modellierungssprache eine Python-Schleife über Datenzeilen schreiben, prüfen Sie, ob sich dasselbe als Matrixoperation ausdrücken lässt. Der <a href="anhang-glossar.md#gloss:solver" class="glossar-link">Solver</a> rechnet ohnehin mit Matrizen — der Umweg über einzelne Ausdrücke kostet nur Aufbauzeit.</p>
|
||||
</blockquote>
|
||||
<blockquote>
|
||||
<p><strong>⚠️ Die Standardabweichung ist in CVXPY keine Wurzel</strong></p>
|
||||
<p>Im Vergleichsmodell <code>optimiere_varianz()</code> steht die Standardabweichung als</p>
|
||||
<div class="sourceCode" id="cb9"><pre class="sourceCode python"><code class="sourceCode python"><span id="cb9-1"><a href="#cb9-1" aria-hidden="true" tabindex="-1"></a>L <span class="op">=</span> np.linalg.cholesky(sigma <span class="op">+</span> <span class="fl">1e-12</span> <span class="op">*</span> np.eye(N))</span>
|
||||
<span id="cb9-2"><a href="#cb9-2" aria-hidden="true" tabindex="-1"></a>risiko <span class="op">=</span> cp.norm2(L.T <span class="op">@</span> w) <span class="co"># = sqrt(w' sigma w)</span></span></code></pre></div>
|
||||
<p>und <strong>nicht</strong> als das Naheliegende, <code>cp.sqrt(cp.quad_form(w, sigma))</code>. Der naheliegende Ausdruck ist nicht DCP und wird von CVXPY mit einem <code>DCPError</code> abgelehnt: <code>cp.sqrt</code> ist konkav und verlangt deshalb ein <strong>konkaves</strong> Argument, <code>quad_form</code> ist aber konvex. Die Regel wird verletzt, obwohl die Funktion als ganze mathematisch völlig harmlos ist — <span class="math inline">\sqrt{w^\top \Sigma w}</span> ist konvex, DCP kann es nur nicht <em>sehen</em>.</p>
|
||||
<p>und <strong>nicht</strong> als das Naheliegende, <code>cp.sqrt(cp.quad_form(w, sigma))</code>. Der naheliegende Ausdruck ist nicht <a href="anhang-glossar.md#gloss:dcp-disciplined-convex-programming" class="glossar-link">DCP</a> und wird von CVXPY mit einem <code>DCPError</code> abgelehnt: <code>cp.sqrt</code> ist konkav und verlangt deshalb ein <strong>konkaves</strong> Argument, <code>quad_form</code> ist aber konvex. Die Regel wird verletzt, obwohl die Funktion als ganze mathematisch völlig harmlos ist — <span class="math inline">\sqrt{w^\top \Sigma w}</span> ist konvex, DCP kann es nur nicht <em>sehen</em>.</p>
|
||||
<p>Wichtig ist die Fehlerdiagnose dahinter, weil sie leicht in die Irre geht: <code>cp.psd_wrap(sigma)</code> sieht nach der Lösung aus und ist keine. Es unterdrückt die <strong>numerische</strong> Beanstandung, dass <span class="math inline">\Sigma</span> nicht als positiv semidefinit erkannt wird — gegen die <strong>strukturelle</strong> Regelverletzung im Aufbau hilft es nicht.</p>
|
||||
<p>Der Ausweg ist immer derselbe: Zerlegen Sie <span class="math inline">\Sigma = LL^\top</span> (Cholesky). Dann ist <span class="math inline">w^\top \Sigma w = \lVert L^\top w\rVert_2^2</span>, und die Standardabweichung wird zur 2-Norm eines <strong>affinen</strong> Ausdrucks — konvex, regelkonform und für den Solver sogar die bessere Formulierung, weil sie direkt ein Kegelproblem ist. Der winzige Diagonalzuschlag <span class="math inline">10^{-12}</span> fängt den Fall ab, dass <span class="math inline">\Sigma</span> numerisch nur halbdefinit ist (mehr Titel als Handelstage, duplizierte Spalten). Die vollständige Fehlertabelle steht in <a href="anhang-fehlerdiagnose.html#anhang-fehlerdiagnose">Anhang C</a>.</p>
|
||||
</blockquote>
|
||||
<blockquote>
|
||||
<p><strong>💡 Zur Annualisierung von VaR und CVaR</strong> Ein häufiger Fehler skaliert den täglichen CVaR mit <span class="math inline">\sqrt{252}</span>. Diese <strong>Wurzel-Zeit-Regel</strong> gilt streng nur für <strong>Standardabweichungen</strong> unabhängig identisch verteilter Größen ohne Drift. Der CVaR ist ein Erwartungswert über einen Verteilungsrand — für ihn ist die Regel eine grobe Näherung, die bei fetten Rändern und Autokorrelation systematisch danebenliegt.</p>
|
||||
<p><strong>💡 Zur Annualisierung von VaR und CVaR</strong> Ein häufiger Fehler skaliert den täglichen CVaR mit <span class="math inline">\sqrt{252}</span>. Diese <strong><a href="anhang-glossar.md#gloss:wurzel-zeit-regel" class="glossar-link">Wurzel-Zeit-Regel</a></strong> gilt streng nur für <strong>Standardabweichungen</strong> unabhängig identisch verteilter Größen ohne Drift. Der CVaR ist ein Erwartungswert über einen Verteilungsrand — für ihn ist die Regel eine grobe Näherung, die bei fetten Rändern und Autokorrelation systematisch danebenliegt.</p>
|
||||
<p><strong>Dieses Buch weist VaR und CVaR deshalb als Tageswerte aus</strong> und benennt die Skalierungsproblematik ausdrücklich. Wer Mehrtageshorizonte braucht, simuliert sie (Monte-Carlo aus <a href="unsicherheit.html#kap-unsicherheit">Kapitel 12</a>) statt zu skalieren.</p>
|
||||
</blockquote>
|
||||
<hr />
|
||||
|
|
@ -701,7 +701,7 @@ CVaR: Portfolio 101.33 vs. Summe 159.24 -> subadditiv (kohaerent)
|
|||
<p><strong>Aufgabe 20.2 ⭐ — Warum kohärent?</strong> Erklären Sie in eigenen Worten, warum ein Risikomaß subadditiv sein sollte. Was bedeutet es wirtschaftlich, wenn diese Eigenschaft verletzt ist?</p>
|
||||
<p><strong>Aufgabe 20.3 ⭐⭐ — Rockafellar-Uryasev nachvollziehen.</strong> Zeigen Sie für die drei Szenarien mit Verlusten <span class="math inline">(1, 4, 9)</span> und <span class="math inline">\alpha = 2/3</span>: (a) Was ist der empirische CVaR? (b) Werten Sie <span class="math inline">\gamma + \frac{1}{S(1-\alpha)}\sum_s \max(\text{Verlust}_s-\gamma, 0)</span> für <span class="math inline">\gamma \in \{0, 1, 4, 5, 9\}</span> aus. (c) Bei welchem <span class="math inline">\gamma</span> ist der Ausdruck minimal, und stimmt das Minimum mit (a) überein?</p>
|
||||
<p><strong>Aufgabe 20.4 ⭐⭐ — Einheiten prüfen.</strong> Angenommen, ein Modell verrechnet Jahresrendite gegen Tages-CVaR (siehe die Warnung in <a href="#sec:cvar-implementierung-cvar-portfolio-mit-reibung">Abschnitt 20.6</a>). Berechnen Sie: Welchem „effektiven“ täglichen <span class="math inline">\lambda</span> entspräche <code>lambda_risk = 1.5</code> dadurch? Welchen Wert müsste man stattdessen setzen, um dieselbe Wirkung wie <code>RISIKOAVERSION = 1.5</code> im konsistenten Tagesmodell zu erzielen?</p>
|
||||
<p><strong>Aufgabe 20.5 ⭐⭐⭐ — Risikoaversion kalibrieren.</strong> Variieren Sie <code>RISIKOAVERSION</code> von 0 bis 20 und tragen Sie Rendite, Volatilität, CVaR und Turnover gegeneinander auf. (a) Wie sieht die „Effizienzgrenze“ im Rendite-CVaR-Raum aus? (b) Bei welchem Wert entspricht das CVaR-Portfolio ungefähr dem Varianz-Portfolio? (c) Welchen Wert würden Sie einem konservativen Stiftungsfonds empfehlen — und wie begründen Sie ihn ohne Fachjargon?</p>
|
||||
<p><strong>Aufgabe 20.5 ⭐⭐⭐ — Risikoaversion kalibrieren.</strong> Variieren Sie <code>RISIKOAVERSION</code> von 0 bis 20 und tragen Sie Rendite, <a href="anhang-glossar.md#gloss:volatilitaet" class="glossar-link">Volatilität</a>, CVaR und Turnover gegeneinander auf. (a) Wie sieht die „Effizienzgrenze“ im Rendite-CVaR-Raum aus? (b) Bei welchem Wert entspricht das CVaR-Portfolio ungefähr dem Varianz-Portfolio? (c) Welchen Wert würden Sie einem konservativen Stiftungsfonds empfehlen — und wie begründen Sie ihn ohne Fachjargon?</p>
|
||||
<p><strong>Aufgabe 20.6 ⭐⭐⭐ — Turnover-Grenze statt Strafe.</strong> Ersetzen Sie den Kostenterm durch eine <strong>harte Grenze</strong> <span class="math inline">\lVert\mathbf{w}-\mathbf{w}_{\text{alt}}\rVert_1 \le \tau</span> und variieren Sie <span class="math inline">\tau \in \{0{,}05;\ 0{,}1;\ 0{,}25;\ 0{,}5;\ 1{,}0\}</span>. (a) Wie verändert sich die erreichbare Rendite? (b) Was ist der Vorteil einer Grenze gegenüber einer Strafe — und was der Nachteil? (c) Wann würden Sie was einsetzen?</p>
|
||||
<hr />
|
||||
<h2 id="sec:cvar-denkfehler">20.8 Finde den Denkfehler</h2>
|
||||
|
|
@ -766,7 +766,7 @@ CVaR: Portfolio 101.33 vs. Summe 159.24 -> subadditiv (kohaerent)
|
|||
<li><strong>Einheiten konsistent halten.</strong> Tägliche Renditen zu täglichem Risiko; annualisiert wird erst in der Ausgabe.</li>
|
||||
<li><strong>Vektorisieren Sie Szenario-Bedingungen</strong> — das spart bei wiederholten Läufen erheblich Zeit.</li>
|
||||
</ul>
|
||||
<p><strong>Ausblick.</strong> <a href="handelsmaschine.html#kap-handelsmaschine">Kapitel 21</a> fügt alles zusammen: Datenpipeline, Signal, Optimierung, Rebalancing und ein Walk-Forward-Backtest ohne Lookahead-Bias.</p>
|
||||
<p><strong>Ausblick.</strong> <a href="handelsmaschine.html#kap-handelsmaschine">Kapitel 21</a> fügt alles zusammen: Datenpipeline, Signal, Optimierung, <a href="anhang-glossar.md#gloss:rebalancing" class="glossar-link">Rebalancing</a> und ein <a href="anhang-glossar.md#gloss:walk-forward-backtest" class="glossar-link">Walk-Forward-Backtest</a> ohne <a href="anhang-glossar.md#gloss:lookahead-bias" class="glossar-link">Lookahead-Bias</a>.</p>
|
||||
|
||||
</article>
|
||||
<button type="button" class="fortschritt-knopf" data-kapitel="cvar.html"><svg class="icon" aria-hidden="true"><use href="#icon-check"></use></svg> <span>Als gelesen markieren</span></button>
|
||||
|
|
|
|||
Loading…
Reference in a new issue