<aclass="brand"href="index.html"><svgclass="icon"aria-hidden="true"><usehref="#icon-book"></use></svg><span>Optimierte Entscheidungsfindung mit Python</span></a>
<navclass="sidebar"id="sidebar"aria-label="Kapitelnavigation"><divclass="sidebar-inhalt"><detailsclass="sidebar-gruppe"><summary>Einstieg</summary><ul><lidata-kapitel="vorwort.html"><ahref="vorwort.html"><spanclass="fortschritt-haken"><svgclass="icon"aria-hidden="true"><usehref="#icon-check"></use></svg></span><span>Vorwort & Lesehilfe</span></a></li><lidata-kapitel="notation.html"><ahref="notation.html"><spanclass="fortschritt-haken"><svgclass="icon"aria-hidden="true"><usehref="#icon-check"></use></svg></span><span>Notation & Abkürzungen</span></a></li></ul></details><detailsclass="sidebar-gruppe"><summary>Teil I: Grundlagen des Operations Research</summary><ul><lidata-kapitel="einfuehrung.html"><ahref="einfuehrung.html"><spanclass="fortschritt-haken"><svgclass="icon"aria-hidden="true"><usehref="#icon-check"></use></svg></span><span>Kapitel 1: Einführung in Operations Research — Vom Ursprung zur mathematischen Entscheidungsfindung</span></a></li><lidata-kapitel="fundament.html"><ahref="fundament.html"><spanclass="fortschritt-haken"><svgclass="icon"aria-hidden="true"><usehref="#icon-check"></use></svg></span><span>Kapitel 2: Das mathematische Fundament — Vektoren, Matrizen, Konvexität</span></a></li><lidata-kapitel="oekosystem.html"><ahref="oekosystem.html"><spanclass="fortschritt-haken"><svgclass="icon"aria-hidden="true"><usehref="#icon-check"></use></svg></span><span>Kapitel 3: Das Python-Ökosystem für OR — Solver, Bindings und Modellierungsschichten</span></a></li><lidata-kapitel="modellierung.html"><ahref="modellierung.html"><spanclass="fortschritt-haken"><svgclass="icon"aria-hidden="true"><usehref="#icon-check"></use></svg></span><span>Kapitel 4: Vom Management-Wunsch zum Modell</span></a></li><lidata-kapitel="synthese-grundlagen.html"><ahref="synthese-grundlagen.html"><spanclass="fortschritt-haken"><svgclass="icon"aria-hidden="true"><usehref="#icon-check"></use></svg></span><span>Synthese Teil I</span></a></li></ul></details><detailsclass="sidebar-gruppe"><summary>Teil II: Die Kernverfahren der deterministischen Optimierung</summary><ul><lidata-kapitel="lp.html"><ahref="lp.html"><spanclass="fortschritt-haken"><svgclass="icon"aria-hidden="true"><usehref="#icon-check"></use></svg></span><span>Kapitel 5: Lineare Programmierung — Simplex, Dualität und Schattenpreise</span></a></li><lidata-kapitel="milp.html"><ahref="milp.html"><spanclass="fortschritt-haken"><svgclass="icon"aria-hidden="true"><usehref="#icon-check"></use></svg></span><span>Kapitel 6: Gemischt-ganzzahlige Optimierung — Diskrete Entscheidungen und Branch-and-Bound</span></a></li><lidata-kapitel="cpsat.html"><ahref="cpsat.html"><spanclass="fortschritt-haken"><svgclass="icon"aria-hidden="true"><usehref="#icon-check"></use></svg></span><span>Kapitel 7: Constraint Programming mit CP-SAT — Logik, Scheduling und Zuweisung</span></a></li><lidata-kapitel="graphen.html"><ahref="graphen.html"><spanclass="fortschritt-haken"><svgclass="icon"aria-hidden="true"><usehref="#icon-check"></use></svg></span><span>Kapitel 8: Graphen, Flüsse und Touren — Min-Cost-Flow, Matching und VRP</span></a></li><lidata-kapitel="metaheuristiken.html"><ahref="metaheuristiken.html"><spanclass="fortschritt-haken"><svgclass="icon"aria-hidden="true"><usehref="#icon-check"></use></svg></span><span>Kapitel 9: Metaheuristiken — wenn der exakte Solver aussteigt</span></a></li><lidata-kapitel="dekomposition.html"><ahref="dekomposition.html"><spanclass="fortschritt-haken"><svgclass="icon"aria-hidden="true"><usehref="#icon-check"></use></svg></span><span>Kapitel 10: Spaltengenerierung — das Modell umbauen statt die Lösung raten</span></a></li><lidata-kapitel="synthese-kernverfahren.html"><ahref="synthese-kernverfahren.html"><spanclass="fortschritt-haken"><svgclass="icon"aria-hidden="true"><usehref="#icon-check"></use></svg></span><span>Synthese Teil II</span></a></li></ul></details><detailsclass="sidebar-gruppe"><summary>Teil III: Nichtlinearität, Unsicherheit und mehrperiodige D
<navclass="breadcrumb"aria-label="Breadcrumb"><ahref="index.html">Start</a>›<span>Teil IV</span>›<span>Kapitel 20: Tail-Risiko, CVaR und Transaktionskosten</span></nav>
<navclass="prev-next"><aclass="prev-next-knopf prev-next-prev"href="markowitz.html"><svgclass="icon"aria-hidden="true"><usehref="#icon-chevron-left"></use></svg><span><small>Zurück</small>Kapitel 19: Die moderne Portfoliotheorie nach Markowitz</span></a><aclass="prev-next-knopf prev-next-next"href="handelsmaschine.html"><span><small>Weiter</small>Kapitel 21: Die vollständige quantitative Handelsmaschine</span><svgclass="icon"aria-hidden="true"><usehref="#icon-chevron-right"></use></svg></a></nav>
<article>
<h1id="kap-cvar">Kapitel 20: Tail-Risiko, CVaR und Transaktionskosten</h1>
<divclass="card card-blick">
<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>Danach können Sie:</strong> VaR und CVaR unterscheiden, den CVaR nach Rockafellar/Uryasev als lineares Programm formulieren, Turnover über die <spanclass="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>Notebook:</strong><ahref="Notebooks_04/cvar.ipynb">cvar.ipynb</a> — herunterladen und in Jupyter öffnen, in Colab hochladen oder mit dem Kurs-Image starten</p>
<h2id="sec:cvar-schnellstart">20.1 In 5 Minuten gelöst</h2>
<divclass="card card-schnellstart">
<blockquote>
<p><strong>🚀 In 5 Minuten gelöst: Zwei Anlagen, dasselbe Risiko?</strong></p>
<p>Zwei Anlagen wurden über 100 Tage beobachtet. An 94 Tagen legten <strong>beide</strong> um 0,5 % zu. Sie unterscheiden sich nur in den sechs schlechten Tagen:</p>
<spanid="cb1-9"><ahref="#cb1-9"aria-hidden="true"tabindex="-1"></a> var <spanclass="op">=</span><spanclass="op">-</span>schwelle <spanclass="co"># Value at Risk</span></span>
<p><strong>Der Value at Risk ist für beide Anlagen exakt gleich: 3,00 %.</strong> Ein Risikobericht, der nur den VaR ausweist, würde die beiden als gleich riskant einstufen.</p>
<p>Dabei kann Anlage B an einem einzigen Tag <strong>40 %</strong> verlieren. Das ist kein Randfall, den man übersehen darf — es ist der Fall, wegen dessen es Risikomanagement gibt.</p>
<p>Der Grund für diese Blindheit steckt in der Definition:</p>
<table>
<colgroup>
<colstyle="width: 33%"/>
<colstyle="width: 33%"/>
<colstyle="width: 33%"/>
</colgroup>
<thead>
<trclass="header">
<th>Maß</th>
<th>Was es beantwortet</th>
<th>Was es dabei übersieht</th>
</tr>
</thead>
<tbody>
<trclass="odd">
<td><strong>VaR (95 %)</strong></td>
<td>„Welchen Verlust überschreite ich an höchstens 5 % der Tage?“</td>
<td><strong>Alles</strong>, was jenseits dieser Schwelle passiert</td>
</tr>
<trclass="even">
<td><strong>CVaR (95 %)</strong></td>
<td>„Wie hoch ist der Verlust <em>im Mittel</em>, <strong>wenn</strong> es schiefgeht?“</td>
<td>nichts im Schwanz</td>
</tr>
</tbody>
</table>
<p>Der VaR ist ein <strong>Quantil</strong> — er markiert eine Grenze und schaut nicht dahinter. Ob hinter der Grenze −3 % oder −40 % liegen, ändert ihn nicht. Der CVaR mittelt genau über diesen Bereich und macht den Unterschied sichtbar: 3,00 % gegen 9,17 %.</p>
<blockquote>
<p><strong>🎯 Merksatz</strong> Der VaR sagt Ihnen, <strong>wie oft</strong> es schiefgeht. Der CVaR sagt Ihnen, <strong>wie schlimm</strong> es dann ist. Für die Frage, ob ein Unternehmen einen Verlust überlebt, zählt ausschließlich die zweite.</p>
</blockquote>
<p><strong>Und es kommt noch besser.</strong> Der CVaR ist nicht nur aussagekräftiger, er ist auch mathematisch handlicher: Er lässt sich als <strong>lineares Programm</strong> minimieren, während die Minimierung des VaR ein nicht-konvexes Problem mit vielen lokalen Optima ist (<ahref="qp-nlp.html#kap-qp-nlp">Kapitel 11</a>). Das ist ein seltener Glücksfall — das bessere Maß ist hier zugleich das leichter optimierbare. Wie das geht, zeigt <ahref="#sec:cvar-value-at-risk-und-conditional-value">Abschnitt 20.4</a>.</p>
<hr/>
<h2id="sec:cvar-lernziele">20.2 Lernziele</h2>
<p>Nach diesem Kapitel können Sie …</p>
<oltype="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 <spanclass="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>
</ol>
<hr/>
<h2id="sec:cvar-die-zwei-schwaechen-des-markowitz-modells">20.3 Die zwei Schwächen des Markowitz-Modells</h2>
<p><strong>Erstens: die Normalverteilungs-Illusion.</strong> Die Varianz behandelt Aufwärts- und Abwärtsschwankungen gleich und unterstellt implizit symmetrische, dünn auslaufende Verteilungen. Reale Marktrenditen haben aber <strong>fette Ränder</strong> (<em>fat tails</em>) und <strong>negative Schiefe</strong>: Extreme Verluste treten deutlich häufiger auf, als eine Normalverteilung vorhersagt.</p>
<p><strong>Zweitens: Reibungsblindheit.</strong> Ein ungedämpftes Mean-Variance-Modell schichtet bei minimalen Schätzänderungen das gesamte Portfolio um. Ohne Berücksichtigung von Gebühren, Spreads und Steuern frisst der Umschlag (<em>turnover</em>) den theoretischen Mehrertrag auf.</p>
<spanid="cb3-7"><ahref="#cb3-7"aria-hidden="true"tabindex="-1"></a><spanclass="co">Teil 1: Wie oft treten "unmoegliche" Tage wirklich auf?</span></span>
<spanid="cb3-8"><ahref="#cb3-8"aria-hidden="true"tabindex="-1"></a><spanclass="co">Teil 2: Warum ist der VaR nicht subadditiv - ein Gegenbeispiel zum Nachrechnen.</span></span>
<spanid="cb3-25"><ahref="#cb3-25"aria-hidden="true"tabindex="-1"></a><spanclass="co"> WICHTIG: Der naheliegende Weg "Mittelwert aller Werte >= VaR" ist FALSCH,</span></span>
<spanid="cb3-26"><ahref="#cb3-26"aria-hidden="true"tabindex="-1"></a><spanclass="co"> sobald die Verteilung Atome hat (z. B. genau zwei moegliche Verluste).</span></span>
<spanid="cb3-27"><ahref="#cb3-27"aria-hidden="true"tabindex="-1"></a><spanclass="co"> Dann liegt der VaR selbst auf einem Atom, und der Vergleich '>=' erfasst</span></span>
<spanid="cb3-28"><ahref="#cb3-28"aria-hidden="true"tabindex="-1"></a><spanclass="co"> zu viel Wahrscheinlichkeitsmasse. Die Formel unten behandelt das korrekt -</span></span>
<spanid="cb3-29"><ahref="#cb3-29"aria-hidden="true"tabindex="-1"></a><spanclass="co"> und ist zugleich genau der Ausdruck, den wir im Abschnitt 'Value at Risk</span></span>
<spanid="cb3-30"><ahref="#cb3-30"aria-hidden="true"tabindex="-1"></a><spanclass="co"> und Conditional Value at Risk' optimieren.</span></span>
<spanid="cb3-32"><ahref="#cb3-32"aria-hidden="true"tabindex="-1"></a> kandidaten <spanclass="op">=</span> np.unique(verluste) <spanclass="co"># Optimum liegt immer auf einem Datenpunkt</span></span>
<spanid="cb3-40"><ahref="#cb3-40"aria-hidden="true"tabindex="-1"></a><spanclass="co"># --- Teil 1: Fat Tails (analytisch, nicht simuliert) ------------------</span></span>
<spanid="cb3-42"><ahref="#cb3-42"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="st">" TEIL 1: WIE OFT TRITT DAS 'UNMOEGLICHE' EIN?"</span>)</span>
<spanid="cb3-44"><ahref="#cb3-44"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="st">"Vergleich: Normalverteilung gegen t-Verteilung mit 3 Freiheitsgraden"</span>)</span>
<spanid="cb3-45"><ahref="#cb3-45"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="st">"(beide auf Standardabweichung 1 normiert).</span><spanclass="ch">\n</span><spanclass="st">"</span>)</span>
<spanid="cb3-51"><ahref="#cb3-51"aria-hidden="true"tabindex="-1"></a><spanclass="ss">f"</span><spanclass="sc">{</span><spanclass="st">'Normal: 1 Tag in'</span><spanclass="sc">:>18}</span><spanclass="ss">"</span>)</span>
<spanid="cb3-59"><ahref="#cb3-59"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="st">"</span><spanclass="ch">\n</span><spanclass="st">Deutung: Ein 5-Sigma-Tag ist unter Normalverteilung ein Ereignis von"</span>)</span>
<spanid="cb3-60"><ahref="#cb3-60"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="st">"etwa einmal in 6.900 Jahren. Reale Aktienmaerkte liefern solche Tage"</span>)</span>
<spanid="cb3-61"><ahref="#cb3-61"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="st">"mehrfach pro Jahrzehnt. Wer allein mit Varianz steuert, plant fuer"</span>)</span>
<spanid="cb3-62"><ahref="#cb3-62"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="st">"eine Welt, in der Crashs praktisch nicht vorkommen."</span>)</span>
<spanid="cb3-64"><ahref="#cb3-64"aria-hidden="true"tabindex="-1"></a><spanclass="co"># --- Teil 2: VaR ist nicht subadditiv ---------------------------------</span></span>
<spanid="cb3-66"><ahref="#cb3-66"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="st">" TEIL 2: WARUM DER VaR KEIN KOHAERENTES RISIKOMASS IST"</span>)</span>
<spanid="cb3-68"><ahref="#cb3-68"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="st">"Zwei unabhaengige Anleihen, je 100 EUR Nominal."</span>)</span>
<spanid="cb3-69"><ahref="#cb3-69"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="st">"Jede faellt mit 4 % Wahrscheinlichkeit aus (Verlust 100),"</span>)</span>
<spanid="cb3-70"><ahref="#cb3-70"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="st">"sonst zahlt sie 2 EUR Kupon (Verlust -2).</span><spanclass="ch">\n</span><spanclass="st">"</span>)</span>
<spanid="cb3-80"><ahref="#cb3-80"aria-hidden="true"tabindex="-1"></a><spanclass="cf">for</span> name, v <spanclass="kw">in</span> [(<spanclass="st">"Anleihe A allein"</span>, verlust_a),</span>
<spanid="cb3-81"><ahref="#cb3-81"aria-hidden="true"tabindex="-1"></a> (<spanclass="st">"Anleihe B allein"</span>, verlust_b),</span>
<spanid="cb3-86"><ahref="#cb3-86"aria-hidden="true"tabindex="-1"></a> var_summe <spanclass="op">=</span> werte[<spanclass="st">"Anleihe A allein"</span>][<spanclass="dv">0</span>] <spanclass="op">+</span> werte[<spanclass="st">"Anleihe B allein"</span>][<spanclass="dv">0</span>]</span>
<spanid="cb3-87"><ahref="#cb3-87"aria-hidden="true"tabindex="-1"></a> cvar_summe <spanclass="op">=</span> werte[<spanclass="st">"Anleihe A allein"</span>][<spanclass="dv">1</span>] <spanclass="op">+</span> werte[<spanclass="st">"Anleihe B allein"</span>][<spanclass="dv">1</span>]</span>
<spanid="cb3-88"><ahref="#cb3-88"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="ss">f"</span><spanclass="sc">{</span><spanclass="st">'Summe der Einzelwerte'</span><spanclass="sc">:<28}</span><spanclass="ss"></span><spanclass="sc">{</span>var_summe<spanclass="sc">:>12.2f}</span><spanclass="ss"></span><spanclass="sc">{</span>cvar_summe<spanclass="sc">:>12.2f}</span><spanclass="ss">"</span>)</span>
<spanid="cb3-97"><ahref="#cb3-97"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="st">"</span><spanclass="ch">\n</span><spanclass="st">Deutung: Einzeln betrachtet meldet der VaR fuer jede Anleihe einen"</span>)</span>
<spanid="cb3-98"><ahref="#cb3-98"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="st">"GEWINN von 2 EUR - denn mit 96 % Wahrscheinlichkeit passiert nichts,"</span>)</span>
<spanid="cb3-99"><ahref="#cb3-99"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="st">"und 4 </span><spanclass="sc">% li</span><spanclass="st">egen unterhalb der 5-%-Schwelle. Im Portfolio steigt die"</span>)</span>
<spanid="cb3-100"><ahref="#cb3-100"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="st">"Wahrscheinlichkeit mindestens eines Ausfalls auf 7,8 </span><spanclass="sc">% u</span><spanclass="st">nd damit UEBER"</span>)</span>
<spanid="cb3-101"><ahref="#cb3-101"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="st">"die Schwelle - der VaR springt auf 98. Er behauptet also, Streuung"</span>)</span>
<spanid="cb3-102"><ahref="#cb3-102"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="st">"habe das Risiko erhoeht. Das ist oekonomisch unsinnig und der Grund,"</span>)</span>
<spanid="cb3-103"><ahref="#cb3-103"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="st">"warum die Bankenaufsicht mit Basel III auf den Expected Shortfall"</span>)</span>
<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>
<blockquote>
<p><strong>⚠️ Eine Falle bei der CVaR-Berechnung</strong> Der naheliegende Weg — „Mittelwert aller Verluste <spanclass="math inline">\ge</span> VaR“ — ist <strong>falsch</strong>, sobald die Verteilung <strong>Atome</strong> hat (also einzelne Werte mit positiver Wahrscheinlichkeit, wie hier die zwei möglichen Ausgänge). Der VaR liegt dann selbst auf einem Atom, und der Vergleich <code>>=</code> erfasst zu viel Wahrscheinlichkeitsmasse. Im Beispiel oben liefert dieser naive Schätzer für Anleihe A den Wert 2,08 statt der korrekten 79,59 — ein Fehler um Faktor 38.</p>
<p>Die Rockafellar-Uryasev-Formel behandelt Atome von sich aus korrekt. Verwenden Sie sie auch dann, wenn Sie „nur schnell“ einen CVaR ausrechnen wollen.</p>
</blockquote>
<hr/>
<h2id="sec:cvar-value-at-risk-und-conditional-value">20.4 Value at Risk und Conditional Value at Risk</h2>
<figure>
<imgsrc="bilder_04/kap_cvar_var_vergleich.svg"alt="Abb. 20.1: Der VaR ist eine Schwelle, der CVaR ein Mittelwert. 20 000 simulierte Tagesrenditen aus dem Fat-Tail-Modell dieses Kapitels (t-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 bilder_04/erzeuge_var_cvar.py."/>
<figcaptionaria-hidden="true">Abb. 20.1: Der VaR ist eine Schwelle, der CVaR ein Mittelwert. 20 000 simulierte Tagesrenditen aus dem Fat-Tail-Modell dieses Kapitels (<spanclass="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 (<spanclass="math inline">\text{VaR}_\alpha</span>):</strong> Der Verlust, der mit Wahrscheinlichkeit <spanclass="math inline">\alpha</span> nicht überschritten wird.</p>
<p><strong>Conditional Value at Risk (<spanclass="math inline">\text{CVaR}_\alpha</span>, auch <em>Expected Shortfall</em>):</strong> Der <strong>durchschnittliche Verlust in den schlimmsten <spanclass="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>
<p>Der VaR ist eine <strong>Schwelle</strong>, der CVaR ein <strong>Mittelwert dahinter</strong>. Der VaR sagt nichts darüber, wie schlimm es hinter der Schwelle wird — ob dort 2,4 % oder 40 % stehen, ist ihm gleich. In der Stichprobe oben liegt der schlechteste Tag bei <strong>−23,0 %</strong>; am VaR von 1,86 % ändert dieser eine Tag <strong>nichts</strong>, am CVaR sehr wohl.</p>
<p><strong>⚠️ Eine verbreitete Ungenauigkeit</strong> Der CVaR wird manchmal „<strong>streng</strong> konvex“ genannt. Das ist zu stark: Der CVaR ist konvex, in der Szenario-Darstellung sogar <strong>stückweise linear</strong> — und damit gerade <strong>nicht</strong> streng konvex. Genau das ist sein praktischer Vorteil: Stückweise linear heißt, er lässt sich als <strong>lineares Programm</strong> lösen.</p>
<p>Rockafellar und Uryasev zeigten, dass sich der CVaR über <spanclass="math inline">S</span> Szenarien exakt als lineares Programm formulieren lässt:</p>
<p><strong>📐 Formel-Lesehilfe — der Trick in drei Schritten</strong> * <spanclass="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. * <spanclass="math inline">-\mathbf{R}_s^\top\mathbf{w}</span> ist der <strong>Verlust</strong> im Szenario <spanclass="math inline">s</span> (Rendite mit negativem Vorzeichen). * <spanclass="math inline">u_s \ge \text{Verlust}_s - \gamma</span> zusammen mit <spanclass="math inline">u_s \ge 0</span> bedeutet: <spanclass="math inline">u_s = \max(\text{Verlust}_s - \gamma,\ 0)</span> — der <strong>Überschuss über die Schwelle</strong>. Liegt der Verlust unter <spanclass="math inline">\gamma</span>, ist <spanclass="math inline">u_s = 0</span> und das Szenario zählt nicht.</p>
<p><strong>Ohne Formel gesagt:</strong> „Wähle eine Schwelle <spanclass="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 <spanclass="math inline">u_s</span> automatisch das Maximum wird:</strong> Die Zielfunktion minimiert die Summe der <spanclass="math inline">u_s</span>. Jedes <spanclass="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>
<divclass="card card-formel">
<blockquote>
<p><strong>🔤 Formel-Übersetzer: jedes Zeichen der Zielfunktion</strong></p>
<p>Die Lesehilfe oben erklärt den <em>Trick</em>. Hier steht, was die einzelnen Zeichen <strong>bedeuten</strong> — vor allem der Bruch, an dem die meisten Leser hängen bleiben:</p>
<table>
<colgroup>
<colstyle="width: 50%"/>
<colstyle="width: 50%"/>
</colgroup>
<thead>
<trclass="header">
<th>Mathematik</th>
<th>Alltagssprache</th>
</tr>
</thead>
<tbody>
<trclass="odd">
<td><spanclass="math inline">\alpha</span></td>
<td>Das <strong>Konfidenzniveau</strong>, üblich <spanclass="math inline">0{,}95</span> oder <spanclass="math inline">0{,}99</span>. <em>Nicht</em> der Randanteil.</td>
</tr>
<trclass="even">
<td><spanclass="math inline">1-\alpha</span></td>
<td>Der <strong>Randanteil</strong>: die schlechtesten 5 % (bzw. 1 %) der Fälle. Das ist der Teil, um den es geht.</td>
</tr>
<trclass="odd">
<td><spanclass="math inline">S</span></td>
<td>Die Anzahl der durchgerechneten Szenarien — Handelstage, Simulationsläufe, historische Perioden.</td>
<td><strong>Wie viele Szenarien im Rand liegen.</strong> Bei <spanclass="math inline">S = 2\,000</span> und <spanclass="math inline">\alpha = 0{,}95</span>: genau 100.</td>
<td>Kein Mittelwert über <em>alle</em> Szenarien, sondern über die <strong>Randszenarien allein</strong>. Genau deshalb steht dort nicht <spanclass="math inline">\frac1S</span>.</td>
</tr>
<trclass="even">
<td><spanclass="math inline">\gamma</span></td>
<td>Die Schwelle, ab der ein Verlust zum Randfall wird — im Optimum der VaR.</td>
<td>„Schwelle <strong>plus</strong> durchschnittlicher Überschuss darüber“ — und das ist der CVaR.</td>
</tr>
</tbody>
</table>
<p><strong>In einem Satz:</strong><em>Der CVaR ist der Mittelwert der schlimmsten <spanclass="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>><spanclass="math inline">\alpha</span> und <spanclass="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 (<spanclass="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 <spanclass="math inline">\alpha</span> nicht.</p>
</blockquote>
</blockquote>
</div>
<hr/>
<h2id="sec:cvar-transaktionskosten-ueber-die-l-1-norm">20.5 Transaktionskosten über die <spanclass="math inline">L_1</span>-Norm</h2>
<p>Sei <spanclass="math inline">\mathbf{w}_{\text{alt}}</span> das bestehende Portfolio und <spanclass="math inline">\mathbf{w}</span> das neue Ziel. Der <strong>Umschlag</strong> (<em>turnover</em>) ist:</p>
<imgsrc="bilder_04/kap13_cvar_zielfunktion.svg"alt="Abb. 20.2: CVaR-Zielfunktion mit Reibungs-Penalty"/>
<figcaptionaria-hidden="true">Abb. 20.2: CVaR-Zielfunktion mit Reibungs-Penalty</figcaption>
</figure>
<blockquote>
<p><strong>📐 Formel-Lesehilfe</strong> Die <spanclass="math inline">L_1</span>-Norm ist die Summe der <strong>Beträge</strong>. Sie misst, wie viel Prozent des Portfolios insgesamt bewegt werden — Käufe und Verkäufe zusammen.</p>
<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 <spanclass="math inline">L_1</span> und nicht <spanclass="math inline">L_2</span>?</strong> Die <spanclass="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>
<hr/>
<h2id="sec:cvar-implementierung-cvar-portfolio-mit-reibung">20.6 Implementierung: CVaR-Portfolio mit Reibung</h2>
<p>Der Risikoterm ist dadurch faktisch um Faktor 252 zu schwach gewichtet: <code>lambda_risk = 1.5</code> bedeutet dann effektiv eine Risikoaversion von <spanclass="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><strong>Dieses Programm rechnet deshalb durchgehend auf Tagesbasis</strong> und annualisiert erst in der Ausgabe.</p>
<spanid="cb6-5"><ahref="#cb6-5"aria-hidden="true"tabindex="-1"></a><spanclass="co">Kapitel CVaR: CVaR-Optimierung mit L1-Transaktionskosten via CVXPY.</span></span>
<spanid="cb6-9"><ahref="#cb6-9"aria-hidden="true"tabindex="-1"></a><spanclass="co"> * Einheiten konsistent (alles taeglich, Annualisierung nur in der Ausgabe)</span></span>
<spanid="cb6-10"><ahref="#cb6-10"aria-hidden="true"tabindex="-1"></a><spanclass="co"> * Szenario-Nebenbedingungen VEKTORISIERT statt in einer Python-Schleife</span></span>
<spanid="cb6-11"><ahref="#cb6-11"aria-hidden="true"tabindex="-1"></a><spanclass="co"> (eine Matrixbedingung statt S einzelner Constraints - deutlich schneller)</span></span>
<spanid="cb6-12"><ahref="#cb6-12"aria-hidden="true"tabindex="-1"></a><spanclass="co"> * Vergleich CVaR- gegen Varianz-Optimierung</span></span>
<spanid="cb6-13"><ahref="#cb6-13"aria-hidden="true"tabindex="-1"></a><spanclass="co"> * Nachrechnung von VaR/CVaR aus den realisierten Szenarien</span></span>
<spanid="cb6-39"><ahref="#cb6-39"aria-hidden="true"tabindex="-1"></a> kurse <spanclass="op">=</span> roh[<spanclass="st">"Close"</span>][TICKER].dropna() <spanclass="co"># erzwingt eigene Spaltenreihenfolge</span></span>
<spanid="cb6-41"><ahref="#cb6-41"aria-hidden="true"tabindex="-1"></a> kurse <spanclass="op">=</span> roh[[<spanclass="st">"Close"</span>]].dropna()</span>
<spanid="cb6-55"><ahref="#cb6-55"aria-hidden="true"tabindex="-1"></a> w <spanclass="op">=</span> cp.Variable(N, nonneg<spanclass="op">=</span><spanclass="va">True</span>)</span>
<spanid="cb6-56"><ahref="#cb6-56"aria-hidden="true"tabindex="-1"></a> gamma <spanclass="op">=</span> cp.Variable() <spanclass="co"># wird im Optimum zum VaR</span></span>
<spanid="cb6-57"><ahref="#cb6-57"aria-hidden="true"tabindex="-1"></a> u <spanclass="op">=</span> cp.Variable(S, nonneg<spanclass="op">=</span><spanclass="va">True</span>) <spanclass="co"># Ueberschuss ueber die Schwelle</span></span>
<spanid="cb6-67"><ahref="#cb6-67"aria-hidden="true"tabindex="-1"></a><spanclass="co"># EINE Matrixbedingung statt S einzelner - deutlich schneller</span></span>
<spanid="cb6-70"><ahref="#cb6-70"aria-hidden="true"tabindex="-1"></a><spanclass="cf">for</span> s <spanclass="kw">in</span><spanclass="bu">range</span>(S): <spanclass="co"># Alternative: S einzelne Constraints (langsamer)</span></span>
<spanid="cb6-71"><ahref="#cb6-71"aria-hidden="true"tabindex="-1"></a> bedingungen.append(u[s] <spanclass="op">>=</span><spanclass="op">-</span>R[s] <spanclass="op">@</span> w <spanclass="op">-</span> gamma)</span>
<spanid="cb6-76"><ahref="#cb6-76"aria-hidden="true"tabindex="-1"></a><spanclass="cf">raise</span><spanclass="pp">SystemExit</span>(<spanclass="ss">f"CVaR-Problem nicht loesbar: </span><spanclass="sc">{</span>problem<spanclass="sc">.</span>status<spanclass="sc">}</span><spanclass="ss">"</span>)</span>
<spanid="cb6-81"><ahref="#cb6-81"aria-hidden="true"tabindex="-1"></a><spanclass="co">"""Klassisches Mean-Variance zum Vergleich - ebenfalls taeglich gerechnet.</span></span>
<spanid="cb6-83"><ahref="#cb6-83"aria-hidden="true"tabindex="-1"></a><spanclass="co"> ACHTUNG, DCP-Falle: Die Standardabweichung ist hier NICHT als</span></span>
<spanid="cb6-84"><ahref="#cb6-84"aria-hidden="true"tabindex="-1"></a><spanclass="co"> cp.sqrt(cp.quad_form(w, sigma)) formulierbar. cp.sqrt ist konkav und</span></span>
<spanid="cb6-85"><ahref="#cb6-85"aria-hidden="true"tabindex="-1"></a><spanclass="co"> verlangt ein konkaves Argument; quad_form ist konvex - CVXPY lehnt den</span></span>
<spanid="cb6-86"><ahref="#cb6-86"aria-hidden="true"tabindex="-1"></a><spanclass="co"> Ausdruck mit einem DCPError ab, und zwar voellig zu Recht (Anhang</span></span>
<spanid="cb6-87"><ahref="#cb6-87"aria-hidden="true"tabindex="-1"></a><spanclass="co"> Fehlerdiagnose). cp.psd_wrap() hilft dagegen nicht: Es behebt eine</span></span>
<spanid="cb6-88"><ahref="#cb6-88"aria-hidden="true"tabindex="-1"></a><spanclass="co"> NUMERISCHE Beanstandung an sigma, keine Regelverletzung im Aufbau.</span></span>
<spanid="cb6-90"><ahref="#cb6-90"aria-hidden="true"tabindex="-1"></a><spanclass="co"> Der Standardweg ist die Cholesky-Zerlegung sigma = L L^T. Damit gilt</span></span>
<spanid="cb6-91"><ahref="#cb6-91"aria-hidden="true"tabindex="-1"></a><spanclass="co"> w' sigma w = ||L^T w||^2, also ist die Standardabweichung die 2-Norm</span></span>
<spanid="cb6-92"><ahref="#cb6-92"aria-hidden="true"tabindex="-1"></a><spanclass="co"> eines AFFINEN Ausdrucks - konvex und damit regelkonform.</span></span>
<spanid="cb6-97"><ahref="#cb6-97"aria-hidden="true"tabindex="-1"></a><spanclass="co"># Der winzige Diagonalzuschlag faengt den Fall ab, dass sigma numerisch</span></span>
<spanid="cb6-98"><ahref="#cb6-98"aria-hidden="true"tabindex="-1"></a><spanclass="co"># nur halbdefinit ist (mehr Titel als Handelstage, doppelte Spalten).</span></span>
<spanid="cb6-99"><ahref="#cb6-99"aria-hidden="true"tabindex="-1"></a> L <spanclass="op">=</span> np.linalg.cholesky(sigma <spanclass="op">+</span><spanclass="fl">1e-12</span><spanclass="op">*</span> np.eye(N))</span>
<spanid="cb6-101"><ahref="#cb6-101"aria-hidden="true"tabindex="-1"></a> w <spanclass="op">=</span> cp.Variable(N, nonneg<spanclass="op">=</span><spanclass="va">True</span>)</span>
<spanid="cb6-102"><ahref="#cb6-102"aria-hidden="true"tabindex="-1"></a> ziel <spanclass="op">=</span> cp.Maximize(mu_taeglich <spanclass="op">@</span> w</span>
<spanid="cb6-105"><ahref="#cb6-105"aria-hidden="true"tabindex="-1"></a> problem <spanclass="op">=</span> cp.Problem(ziel, [cp.<spanclass="bu">sum</span>(w) <spanclass="op">==</span><spanclass="dv">1</span>, w <spanclass="op"><=</span> MAX_GEWICHT])</span>
<spanid="cb6-108"><ahref="#cb6-108"aria-hidden="true"tabindex="-1"></a><spanclass="cf">raise</span><spanclass="pp">SystemExit</span>(<spanclass="ss">f"Varianz-Problem nicht loesbar: </span><spanclass="sc">{</span>problem<spanclass="sc">.</span>status<spanclass="sc">}</span><spanclass="ss">"</span>)</span>
<spanid="cb6-113"><ahref="#cb6-113"aria-hidden="true"tabindex="-1"></a><spanclass="co">"""VaR und CVaR direkt aus den Szenarien - unabhaengige Gegenprobe."""</span></span>
<spanid="cb6-114"><ahref="#cb6-114"aria-hidden="true"tabindex="-1"></a> portfoliorenditen <spanclass="op">=</span> R <spanclass="op">@</span> w</span>
<spanid="cb6-116"><ahref="#cb6-116"aria-hidden="true"tabindex="-1"></a> var <spanclass="op">=</span><spanclass="bu">float</span>(np.quantile(verluste, ALPHA))</span>
<spanid="cb6-118"><ahref="#cb6-118"aria-hidden="true"tabindex="-1"></a><spanclass="cf">return</span> var, cvar, <spanclass="bu">float</span>(portfoliorenditen.mean()), <spanclass="bu">float</span>(portfoliorenditen.std(ddof<spanclass="op">=</span><spanclass="dv">1</span>))</span>
<spanid="cb6-134"><ahref="#cb6-134"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="st">" CVaR-PORTFOLIO-OPTIMIERUNG MIT TRANSAKTIONSKOSTEN"</span>)</span>
<spanid="cb6-141"><ahref="#cb6-141"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="st">"--- Gegenprobe: stimmen Modell und Szenarien ueberein? ---"</span>)</span>
<spanid="cb6-142"><ahref="#cb6-142"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="ss">f" VaR aus dem Modell (gamma): </span><spanclass="sc">{</span>var_modell<spanclass="op">*</span><spanclass="dv">100</span><spanclass="sc">:7.4f}</span><spanclass="ss"> % | "</span></span>
<spanid="cb6-143"><ahref="#cb6-143"aria-hidden="true"tabindex="-1"></a><spanclass="ss">f"aus den Szenarien: </span><spanclass="sc">{</span>var_real<spanclass="op">*</span><spanclass="dv">100</span><spanclass="sc">:7.4f}</span><spanclass="ss"> %"</span>)</span>
<spanid="cb6-144"><ahref="#cb6-144"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="ss">f" CVaR aus dem Modell: </span><spanclass="sc">{</span>cvar_modell<spanclass="op">*</span><spanclass="dv">100</span><spanclass="sc">:7.4f}</span><spanclass="ss"> % | "</span></span>
<spanid="cb6-145"><ahref="#cb6-145"aria-hidden="true"tabindex="-1"></a><spanclass="ss">f"aus den Szenarien: </span><spanclass="sc">{</span>cvar_real<spanclass="op">*</span><spanclass="dv">100</span><spanclass="sc">:7.4f}</span><spanclass="ss"> %"</span>)</span>
<spanid="cb6-146"><ahref="#cb6-146"aria-hidden="true"tabindex="-1"></a><spanclass="cf">assert</span><spanclass="bu">abs</span>(cvar_modell <spanclass="op">-</span> cvar_real) <spanclass="op"><</span><spanclass="fl">1e-4</span>, <spanclass="st">"CVaR stimmt nicht mit den Szenarien!"</span></span>
<spanid="cb6-147"><ahref="#cb6-147"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="st">" -> Der Rockafellar-Uryasev-Trick liefert exakt den empirischen CVaR."</span>)</span>
<spanid="cb6-155"><ahref="#cb6-155"aria-hidden="true"tabindex="-1"></a> v, c, m, s <spanclass="op">=</span> realisierte_kennzahlen(w, R)</span>
<spanid="cb6-156"><ahref="#cb6-156"aria-hidden="true"tabindex="-1"></a> to <spanclass="op">=</span><spanclass="bu">float</span>(np.<spanclass="bu">abs</span>(w <spanclass="op">-</span> w_alt).<spanclass="bu">sum</span>())</span>
<spanid="cb6-161"><ahref="#cb6-161"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="st">"</span><spanclass="ch">\n</span><spanclass="st">Hinweis zur Annualisierung: Renditen werden mit 252 skaliert,"</span>)</span>
<spanid="cb6-162"><ahref="#cb6-162"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="st">"Volatilitaeten mit sqrt(252). Fuer VaR/CVaR ist eine solche Skalierung"</span>)</span>
<spanid="cb6-163"><ahref="#cb6-163"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="st">"nur unter starken Annahmen (Unabhaengigkeit, kein Drift) zulaessig -"</span>)</span>
<spanid="cb6-164"><ahref="#cb6-164"aria-hidden="true"tabindex="-1"></a><spanclass="bu">print</span>(<spanclass="st">"sie werden hier deshalb bewusst als TAGESwerte ausgewiesen."</span>)</span>
<spanid="cb6-170"><ahref="#cb6-170"aria-hidden="true"tabindex="-1"></a><spanclass="st">"vorher"</span>: [<spanclass="ss">f"</span><spanclass="sc">{</span>v<spanclass="op">*</span><spanclass="dv">100</span><spanclass="sc">:5.1f}</span><spanclass="ss"> %"</span><spanclass="cf">for</span> v <spanclass="kw">in</span> w_alt],</span>
<spanid="cb6-171"><ahref="#cb6-171"aria-hidden="true"tabindex="-1"></a><spanclass="st">"CVaR-opt."</span>: [<spanclass="ss">f"</span><spanclass="sc">{</span>v<spanclass="op">*</span><spanclass="dv">100</span><spanclass="sc">:5.1f}</span><spanclass="ss"> %"</span><spanclass="cf">for</span> v <spanclass="kw">in</span> w_cvar],</span>
<spanid="cb6-172"><ahref="#cb6-172"aria-hidden="true"tabindex="-1"></a><spanclass="st">"Handel"</span>: [<spanclass="ss">f"</span><spanclass="sc">{</span>(w_cvar[i]<spanclass="op">-</span>w_alt[i])<spanclass="op">*</span><spanclass="dv">100</span><spanclass="sc">:+6.1f}</span><spanclass="ss"> %"</span><spanclass="cf">for</span> i <spanclass="kw">in</span><spanclass="bu">range</span>(N)],</span>
<spanid="cb6-173"><ahref="#cb6-173"aria-hidden="true"tabindex="-1"></a><spanclass="st">"Varianz-opt."</span>: [<spanclass="ss">f"</span><spanclass="sc">{</span>v<spanclass="op">*</span><spanclass="dv">100</span><spanclass="sc">:5.1f}</span><spanclass="ss"> %"</span><spanclass="cf">for</span> v <spanclass="kw">in</span> w_var],</span>
<spanid="cb6-177"><ahref="#cb6-177"aria-hidden="true"tabindex="-1"></a><spanclass="ss">f"</span><spanclass="sc">{</span>GEBUEHRENSATZ<spanclass="op">*</span>turnover<spanclass="op">*</span><spanclass="dv">100</span><spanclass="sc">:.3f}</span><spanclass="ss"> % des Portfoliowerts"</span>)</span>
<spanid="cb6-179"><ahref="#cb6-179"aria-hidden="true"tabindex="-1"></a><spanclass="co"># --- Laufzeitvergleich vektorisiert vs. Schleife ----------------------</span></span>
<spanid="cb6-180"><ahref="#cb6-180"aria-hidden="true"tabindex="-1"></a><spanclass="cf">if</span> S <spanclass="op"><=</span><spanclass="dv">600</span>: <spanclass="co"># bei sehr vielen Szenarien zu langsam</span></span>
<divclass="sourceCode"id="cb8"><preclass="sourceCode python"><codeclass="sourceCode python"><spanid="cb8-1"><ahref="#cb8-1"aria-hidden="true"tabindex="-1"></a><spanclass="cf">for</span> s <spanclass="kw">in</span><spanclass="bu">range</span>(S):</span>
<spanid="cb8-2"><ahref="#cb8-2"aria-hidden="true"tabindex="-1"></a> bedingungen.append(u[s] <spanclass="op">>=</span><spanclass="op">-</span>R[s] <spanclass="op">@</span> w <spanclass="op">-</span> gamma) <spanclass="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 (<ahref="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>
</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>
<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 — <spanclass="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 <spanclass="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 <spanclass="math inline">\Sigma = LL^\top</span> (Cholesky). Dann ist <spanclass="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 <spanclass="math inline">10^{-12}</span> fängt den Fall ab, dass <spanclass="math inline">\Sigma</span> numerisch nur halbdefinit ist (mehr Titel als Handelstage, duplizierte Spalten). Die vollständige Fehlertabelle steht in <ahref="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 <spanclass="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>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 <ahref="unsicherheit.html#kap-unsicherheit">Kapitel 12</a>) statt zu skalieren.</p>
<p><strong>Aufgabe 20.1 ⭐ — VaR und CVaR ablesen.</strong> Zehn Tagesverluste (in %): <spanclass="math inline">-1{,}2</span>, <spanclass="math inline">0{,}3</span>, <spanclass="math inline">2{,}1</span>, <spanclass="math inline">-0{,}8</span>, <spanclass="math inline">5{,}4</span>, <spanclass="math inline">1{,}1</span>, <spanclass="math inline">-2{,}0</span>, <spanclass="math inline">0{,}6</span>, <spanclass="math inline">8{,}9</span>, <spanclass="math inline">-0{,}4</span> (positiv = Verlust). Bestimmen Sie <spanclass="math inline">\text{VaR}_{80\%}</span> und <spanclass="math inline">\text{CVaR}_{80\%}</span> von Hand.</p>
<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 <spanclass="math inline">(1, 4, 9)</span> und <spanclass="math inline">\alpha = 2/3</span>: (a) Was ist der empirische CVaR? (b) Werten Sie <spanclass="math inline">\gamma + \frac{1}{S(1-\alpha)}\sum_s \max(\text{Verlust}_s-\gamma, 0)</span> für <spanclass="math inline">\gamma \in \{0, 1, 4, 5, 9\}</span> aus. (c) Bei welchem <spanclass="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 <ahref="#sec:cvar-implementierung-cvar-portfolio-mit-reibung">Abschnitt 20.6</a>). Berechnen Sie: Welchem „effektiven“ täglichen <spanclass="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.6 ⭐⭐⭐ — Turnover-Grenze statt Strafe.</strong> Ersetzen Sie den Kostenterm durch eine <strong>harte Grenze</strong><spanclass="math inline">\lVert\mathbf{w}-\mathbf{w}_{\text{alt}}\rVert_1 \le \tau</span> und variieren Sie <spanclass="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/>
<h2id="sec:cvar-denkfehler">20.8 Finde den Denkfehler</h2>
<p>Eine Bank vergibt Risikobudgets je Abteilung. Zwei Kreditabteilungen halten je eine Unternehmensanleihe über 100 € Nominal mit <strong>4 % Ausfallwahrscheinlichkeit</strong> (bei Ausfall Totalverlust, sonst 2 € Kupon). Der Risikocontroller misst für jede einzeln:</p>
<p>Ein <em>negativer</em> Verlust, also ein Gewinn. Auf dem 95-%-Niveau erscheint jede Anleihe risikolos, beide Abteilungen bekommen grünes Licht. Der Controller notiert als Gesamtrisiko die Summe: <spanclass="math inline">-4{,}00\,€</span>.</p>
<p>Dann werden die Positionen in einem gemeinsamen Buch zusammengelegt. Der VaR des Gesamtbuchs beträgt <strong>+98,00 €</strong>.</p>
<p><strong>Ihre Aufgabe:</strong></p>
<oltype="a">
<li><p>Wie kann die Zusammenlegung zweier <strong>unabhängiger</strong> Positionen das gemessene Risiko von <spanclass="math inline">-4\,€</span> auf <spanclass="math inline">+98\,€</span> treiben? Rechnen Sie die entscheidende Wahrscheinlichkeit aus.</p></li>
<li><p>Warum meldet der VaR für eine einzelne Anleihe einen Gewinn, obwohl sie mit 4 % Wahrscheinlichkeit vollständig ausfällt?</p></li>
<li><p>Welche Eigenschaft eines Risikomaßes wird hier verletzt? Was bedeutet das konkret für ein Unternehmen, das Risikobudgets auf Abteilungen verteilt und wieder zusammenzählt?</p></li>
<li><p>Der CVaR liefert 79,59 € und 79,66 € einzeln, aber nur 101,33 € zusammen — statt der Summe von 159,24 €. Warum kann ihm das Verhalten des VaR nicht passieren?</p></li>
</ol>
<p><em>Die Zahlen stammen aus Teil 2 von <code>VaR_CVaR_Demo.py</code> oben. Auflösung:</em><em><ahref="anhang-loesungen.html#sec:loesungen-cvar">Abschnitt A.20</a>.</em></p>
</blockquote>
</div>
<blockquote>
<p><strong>⚠️ Eine Falle beim Nachrechnen</strong></p>
<p>Wenn Sie den CVaR selbst nachrechnen wollen: Der naheliegende Weg <code>verluste[verluste >= var].mean()</code> ist <strong>falsch</strong>, sobald die Verteilung Atome hat — und hier hat sie genau zwei mögliche Werte. Der VaR liegt dann selbst auf einem Atom, und der Vergleich <code>>=</code> erfasst weit mehr Wahrscheinlichkeitsmasse als die vorgesehenen 5 %.</p>
<p>Deshalb verwendet <code>cvar_rockafellar()</code> oben die Optimierungsformel statt der naiven Mittelung. Wer stattdessen exakt abzählt, muss die schlechtesten <spanclass="math inline">\lceil (1-\alpha)\,N \rceil</span> Szenarien nehmen — nicht alle, die eine Schwelle überschreiten.</p>
<p>Diese Falle ist besonders unangenehm, weil das falsche Ergebnis plausibel aussieht. Sie fällt nur auf, wenn man wie hier eine <strong>unabhängige Gegenprobe</strong> hat: Ein CVaR, der die Subadditivität verletzt, kann nicht stimmen.</p>
</blockquote>
<blockquote>
<p><strong>🎯 Merksatz</strong> Ein Risikomaß, dessen Werte man nicht addieren darf, ist als Steuerungsgröße unbrauchbar — denn genau das tut jede Organisation mit Kennzahlen: Sie verteilt sie auf Einheiten und zählt sie wieder zusammen. Der CVaR ist <strong>kohärent</strong> und erlaubt das; der VaR nicht. Aus diesem Grund hat die Bankenaufsicht mit Basel III vom VaR auf den <em>Expected Shortfall</em> umgestellt — dieselbe Größe, die hier CVaR heißt.</p>
<p>Genau eine Antwort ist jeweils richtig. Auflösung in <ahref="anhang-loesungen.html#quiz-loesung-cvar">Anhang A</a>.</p>
<p><strong>1. Zwei Anlagen haben denselben VaR(95) von 3 %. Was wissen Sie über ihre Extremverluste?</strong> (a) Sie sind gleich hoch — der VaR misst genau das. (b) <strong>Nichts.</strong> Der VaR ist ein Quantil: Er markiert die Schwelle und sagt nichts darüber, was dahinter liegt. Die eine kann dort −3 %, die andere −40 % haben. (c) Die Anlage mit der höheren Schwankung hat auch die höheren Extremverluste.</p>
<p><strong>2. Warum lässt sich der CVaR als lineares Programm minimieren, der VaR aber nicht?</strong> (a) Der VaR ist nicht differenzierbar. (b) Der CVaR lässt sich nach Rockafellar/Uryasev über eine Hilfsvariable und Schlupfterme als konvexes — sogar lineares — Problem schreiben. Die VaR-Minimierung ist dagegen nicht konvex und hat viele lokale Optima. (c) Der CVaR ist immer größer als der VaR.</p>
<p><strong>3. Sie sollen das Risiko von drei Handelsbüchern zu einer Gesamtkennzahl zusammenfassen. Welches Maß nehmen Sie?</strong> (a) VaR — er ist in der Praxis verbreiteter und leichter zu erklären. (b) CVaR, weil er <strong>subadditiv</strong> ist: Die Gesamtkennzahl kann nie größer werden als die Summe der Einzelkennzahlen, Diversifikation wird also korrekt belohnt. (c) Beide liefern dasselbe, solange die Bücher unabhängig sind.</p>
<li><strong>Reale Renditen haben fette Ränder.</strong> Ein 5-Sigma-Tag ist unter Normalverteilung ein Jahrtausendereignis — an echten Märkten passiert er alle paar Jahre.</li>
<li><strong>Der VaR ist ein Quantil und schaut nicht dahinter.</strong> Zwei Anlagen mit identischem VaR können Extremverluste von −3 % und −40 % haben. Der VaR sagt, <strong>wie oft</strong> es schiefgeht; der CVaR, <strong>wie schlimm</strong> es dann ist.</li>
<li><strong>Der VaR ist nicht kohärent:</strong> Er kann Diversifikation als Risikoerhöhung ausweisen. Deshalb die regulatorische Umstellung auf den Expected Shortfall. Praktische Folge: Man darf VaR-Kennzahlen <strong>nicht über Einheiten addieren</strong> — und genau das tut jede Organisation mit Kennzahlen.</li>
<li><strong>Das bessere Maß ist hier zugleich das leichter optimierbare</strong> — ein seltener Glücksfall. Der CVaR wird zum LP, die VaR-Minimierung bleibt nicht-konvex.</li>
<li><strong>Rockafellar/Uryasev</strong> machen den CVaR über eine Hilfsvariable <spanclass="math inline">\gamma</span> linear optimierbar, ohne den VaR vorher zu kennen.</li>
<li><strong>Transaktionskosten gehören ins Modell</strong>, nicht in eine nachgelagerte Rechnung — sonst schichtet der Optimierer bei jedem Rauschen um.</li>
<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><ahref="handelsmaschine.html#kap-handelsmaschine">Kapitel 21</a> fügt alles zusammen: Datenpipeline, Signal, Optimierung, Rebalancing und ein Walk-Forward-Backtest ohne Lookahead-Bias.</p>
<navclass="prev-next"><aclass="prev-next-knopf prev-next-prev"href="markowitz.html"><svgclass="icon"aria-hidden="true"><usehref="#icon-chevron-left"></use></svg><span><small>Zurück</small>Kapitel 19: Die moderne Portfoliotheorie nach Markowitz</span></a><aclass="prev-next-knopf prev-next-next"href="handelsmaschine.html"><span><small>Weiter</small>Kapitel 21: Die vollständige quantitative Handelsmaschine</span><svgclass="icon"aria-hidden="true"><usehref="#icon-chevron-right"></use></svg></a></nav>