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
26
OR_HTML_04/markowitz.html
generated
26
OR_HTML_04/markowitz.html
generated
|
|
@ -104,8 +104,8 @@
|
|||
<blockquote>
|
||||
<p><strong>📌 Kapitel auf einen Blick</strong></p>
|
||||
<p><strong>Worum geht es?</strong> Um das Modell, das 1952 die quantitative Finanzwirtschaft begründete — und um die Restriktionen, ohne die es in der Praxis unbrauchbar bleibt.</p>
|
||||
<p><strong>Voraussetzungen:</strong> <a href="qp-nlp.html#kap-qp-nlp">Kapitel 11</a> (QP, KKT), <a href="finanzdaten.html#kap-finanzdaten">Kapitel 18</a> (Kovarianz, Shrinkage).</p>
|
||||
<p><strong>Danach können Sie:</strong> Die Effizienzgrenze berechnen, das Maximum-Sharpe-Portfolio über die Korn-Transformation bestimmen, institutionelle Nebenbedingungen einbauen — und beurteilen, wann eine Renditeschätzung das Ergebnis wertlos macht.</p>
|
||||
<p><strong>Voraussetzungen:</strong> <a href="qp-nlp.html#kap-qp-nlp">Kapitel 11</a> (<a href="anhang-glossar.md#gloss:quadratische-programmierung-qp" class="glossar-link">QP</a>, <a href="anhang-glossar.md#gloss:karush-kuhn-tucker-bedingungen-kkt" class="glossar-link">KKT</a>), <a href="finanzdaten.html#kap-finanzdaten">Kapitel 18</a> (Kovarianz, Shrinkage).</p>
|
||||
<p><strong>Danach können Sie:</strong> Die Effizienzgrenze berechnen, das Maximum-Sharpe-Portfolio über die <a href="anhang-glossar.md#gloss:korn-transformation" class="glossar-link">Korn-Transformation</a> bestimmen, institutionelle Nebenbedingungen einbauen — und beurteilen, wann eine Renditeschätzung das Ergebnis wertlos macht.</p>
|
||||
<p><strong>Zeitbedarf:</strong> ca. 6 Stunden.</p>
|
||||
<p><strong>Programme:</strong><br />
|
||||
<code>Diversifikation_Demo.py</code><br />
|
||||
|
|
@ -153,9 +153,9 @@
|
|||
<span id="cb1-4"><a href="#cb1-4" aria-hidden="true" tabindex="-1"></a>mu <span class="op">=</span> np.array([<span class="fl">0.03</span>, <span class="fl">0.08</span>, <span class="fl">0.055</span>]) <span class="co"># erwartete Rendite</span></span>
|
||||
<span id="cb1-5"><a href="#cb1-5" aria-hidden="true" tabindex="-1"></a>sig <span class="op">=</span> np.array([<span class="fl">0.05</span>, <span class="fl">0.18</span>, <span class="fl">0.11</span>]) <span class="co"># Schwankung</span></span>
|
||||
<span id="cb1-6"><a href="#cb1-6" aria-hidden="true" tabindex="-1"></a>R <span class="op">=</span> np.array([[<span class="fl">1.0</span>, <span class="fl">0.1</span>, <span class="fl">0.2</span>], [<span class="fl">0.1</span>, <span class="fl">1.0</span>, <span class="fl">0.5</span>], [<span class="fl">0.2</span>, <span class="fl">0.5</span>, <span class="fl">1.0</span>]])</span>
|
||||
<span id="cb1-7"><a href="#cb1-7" aria-hidden="true" tabindex="-1"></a>S <span class="op">=</span> np.outer(sig, sig) <span class="op">*</span> R <span class="co"># Kovarianzmatrix</span></span>
|
||||
<span id="cb1-7"><a href="#cb1-7" aria-hidden="true" tabindex="-1"></a>S <span class="op">=</span> np.outer(sig, sig) <span class="op">*</span> R <span class="co"># [Kovarianzmatrix](anhang-glossar.md#gloss:kovarianzmatrix){.glossar-link}</span></span>
|
||||
<span id="cb1-8"><a href="#cb1-8" aria-hidden="true" tabindex="-1"></a></span>
|
||||
<span id="cb1-9"><a href="#cb1-9" aria-hidden="true" tabindex="-1"></a>w, ziel <span class="op">=</span> cp.Variable(<span class="dv">3</span>, nonneg<span class="op">=</span><span class="va">True</span>), cp.Parameter(nonneg<span class="op">=</span><span class="va">True</span>)</span>
|
||||
<span id="cb1-9"><a href="#cb1-9" aria-hidden="true" tabindex="-1"></a>w, ziel <span class="op">=</span> cp.Variable(<span class="dv">3</span>, nonneg<span class="op">=</span><span class="va">True</span>), cp.[Parameter](anhang<span class="op">-</span>glossar.md<span class="co">#gloss:parameter){.glossar-link}(nonneg=True)</span></span>
|
||||
<span id="cb1-10"><a href="#cb1-10" aria-hidden="true" tabindex="-1"></a>problem <span class="op">=</span> cp.Problem(cp.Minimize(cp.quad_form(w, S)),</span>
|
||||
<span id="cb1-11"><a href="#cb1-11" aria-hidden="true" tabindex="-1"></a> [cp.<span class="bu">sum</span>(w) <span class="op">==</span> <span class="dv">1</span>, mu <span class="op">@</span> w <span class="op">>=</span> ziel])</span>
|
||||
<span id="cb1-12"><a href="#cb1-12" aria-hidden="true" tabindex="-1"></a></span>
|
||||
|
|
@ -179,13 +179,13 @@
|
|||
<ul>
|
||||
<li>Bei 3 % Zielrendite: 0,69 — das Portfolio ist sicher, aber lässt Ertrag liegen.</li>
|
||||
<li>Bei <strong>4 %</strong>: <strong>0,75</strong> — das beste Verhältnis.</li>
|
||||
<li>Bei 8 %: 0,44 — das renditestärkste Portfolio ist das <strong>schlechteste</strong> je Risikoeinheit. Und es besteht zu 100 % aus Aktien: Wer die höchste Rendite fordert, bekommt zwangsläufig gar keine Diversifikation mehr.</li>
|
||||
<li>Bei 8 %: 0,44 — das renditestärkste Portfolio ist das <strong>schlechteste</strong> je Risikoeinheit. Und es besteht zu 100 % aus Aktien: Wer die höchste Rendite fordert, bekommt zwangsläufig gar keine <a href="anhang-glossar.md#gloss:diversifikation" class="glossar-link">Diversifikation</a> mehr.</li>
|
||||
</ul>
|
||||
<p>Von 3 % auf 8 % Rendite ist ein Zuwachs um Faktor 2,7 — das Risiko steigt dabei um Faktor 3,7. Die letzten Prozentpunkte Rendite sind die teuersten.</p>
|
||||
<blockquote>
|
||||
<p><strong>🎯 Merksatz</strong> Ein Optimierer beantwortet nicht die Frage „was soll ich tun?“, sondern „was ist erreichbar?“. Die Effizienzlinie ist eine <strong>Speisekarte</strong>, keine Empfehlung. Welche Zeile die richtige ist, hängt von der Risikotragfähigkeit ab — und das ist keine mathematische, sondern eine unternehmerische Frage.</p>
|
||||
</blockquote>
|
||||
<p><strong>Warum funktioniert das?</strong> Weil <code>cp.Parameter</code> das Modell nur <strong>einmal</strong> aufbaut und dann sechsmal mit verschiedenen Zielwerten löst. Genau dafür gibt es Parameter in CVXPY: Bei 200 Punkten auf der Linie spart das den 200-fachen Kompilierungsaufwand (<a href="oekosystem.html#sec:oekosystem-vektorisierung">Abschnitt 3.8</a>). Der Rest dieses Kapitels führt die Effizienzlinie sauber aus, zeigt, wie man das beste Verhältnis direkt berechnet statt es abzulesen — und warum das Ganze mit geschätzten Renditen gefährlicher ist, als es hier aussieht.</p>
|
||||
<p><strong>Warum funktioniert das?</strong> Weil <code>cp.Parameter</code> das Modell nur <strong>einmal</strong> aufbaut und dann sechsmal mit verschiedenen Zielwerten löst. Genau dafür gibt es Parameter in <a href="anhang-glossar.md#gloss:cvxpy" class="glossar-link">CVXPY</a>: Bei 200 Punkten auf der Linie spart das den 200-fachen Kompilierungsaufwand (<a href="oekosystem.html#sec:oekosystem-vektorisierung">Abschnitt 3.8</a>). Der Rest dieses Kapitels führt die Effizienzlinie sauber aus, zeigt, wie man das beste Verhältnis direkt berechnet statt es abzulesen — und warum das Ganze mit geschätzten Renditen gefährlicher ist, als es hier aussieht.</p>
|
||||
<hr />
|
||||
<h2 id="sec:markowitz-lernziele">19.2 Lernziele</h2>
|
||||
<p>Nach diesem Kapitel können Sie …</p>
|
||||
|
|
@ -345,7 +345,7 @@ obwohl Formel und Simulation nichts voneinander wissen.</code></pre>
|
|||
<tr class="odd">
|
||||
<td><span class="math inline">0</span></td>
|
||||
<td>Risiko zählt allein</td>
|
||||
<td><strong>GMV</strong> — Global Minimum Variance Portfolio</td>
|
||||
<td><strong><a href="anhang-glossar.md#gloss:global-minimum-variance-portfolio-gmv" class="glossar-link">GMV</a></strong> — Global Minimum Variance Portfolio</td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<td>mittel</td>
|
||||
|
|
@ -440,12 +440,12 @@ obwohl Formel und Simulation nichts voneinander wissen.</code></pre>
|
|||
<img src="bilder_04/kap12_efficient_frontier.svg" alt="Abb. 19.1: Efficient Frontier und Tangential-Portfolio" />
|
||||
<figcaption aria-hidden="true">Abb. 19.1: Efficient Frontier und Tangential-Portfolio</figcaption>
|
||||
</figure>
|
||||
<p>Das <strong>Tangentialportfolio</strong> maximiert die <strong>Sharpe Ratio</strong>:</p>
|
||||
<p>Das <strong><a href="anhang-glossar.md#gloss:tangentialportfolio" class="glossar-link">Tangentialportfolio</a></strong> maximiert die <strong><a href="anhang-glossar.md#gloss:sharpe-ratio" class="glossar-link">Sharpe Ratio</a></strong>:</p>
|
||||
<p><span class="math display">
|
||||
\text{SR}(\mathbf{w}) = \frac{\mathbf{w}^\top\boldsymbol{\mu} - r_f}{\sqrt{\mathbf{w}^\top\boldsymbol{\Sigma}\mathbf{w}}}
|
||||
</span></p>
|
||||
<blockquote>
|
||||
<p><strong>📐 Formel-Lesehilfe</strong> Zähler: <strong>Überrendite</strong> über den risikolosen Zins <span class="math inline">r_f</span>. Nenner: die Volatilität.</p>
|
||||
<p><strong>📐 Formel-Lesehilfe</strong> Zähler: <strong>Überrendite</strong> über den risikolosen Zins <span class="math inline">r_f</span>. Nenner: die <a href="anhang-glossar.md#gloss:volatilitaet" class="glossar-link">Volatilität</a>.</p>
|
||||
<p><strong>Ohne Formel gesagt:</strong> „Wie viel Mehrertrag bekomme ich je Einheit Risiko, die ich eingehe?“ Eine Sharpe Ratio von 0,8 heißt: Für jeden Prozentpunkt Volatilität gibt es 0,8 Prozentpunkte Überrendite.</p>
|
||||
</blockquote>
|
||||
<h3 id="die-korn-transformation">Die Korn-Transformation</h3>
|
||||
|
|
@ -504,7 +504,7 @@ obwohl Formel und Simulation nichts voneinander wissen.</code></pre>
|
|||
<tr class="odd">
|
||||
<td><strong>Turnover-Grenze</strong></td>
|
||||
<td><span class="math inline">\|\mathbf{w}-\mathbf{w}_{\text{alt}}\|_1 \le \tau</span></td>
|
||||
<td>Transaktionskosten dämpfen</td>
|
||||
<td><a href="anhang-glossar.md#gloss:transaktionskosten" class="glossar-link">Transaktionskosten</a> dämpfen</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
|
@ -841,7 +841,7 @@ obwohl Formel und Simulation nichts voneinander wissen.</code></pre>
|
|||
<p><strong>⚠️ Zur Reproduzierbarkeit</strong> Dieses Programm lädt Live-Daten. <strong>Ihre Zahlen werden abweichen.</strong> Prüfen Sie stattdessen die <strong>Struktur</strong> des Ergebnisses: Hält die Sektorgrenze? Summieren sich die Gewichte auf 100 %? Liegt die Sharpe Ratio des Max-Sharpe-Portfolios über der des GMV? Genau dafür sind die <code>assert</code>-Prüfungen da.</p>
|
||||
</blockquote>
|
||||
<blockquote>
|
||||
<p><strong>🎯 Der Realitätscheck: Gleichgewichtung</strong> Das Programm vergleicht immer mit dem <strong>1/N-Portfolio</strong>. Das ist kein Scherz: DeMiguel, Garlappi und Uppal zeigten 2009 in einer viel beachteten Studie, dass die naive Gleichgewichtung viele optimierte Strategien out of sample schlägt — weil sie keinerlei Schätzung benötigt und damit auch keinen Schätzfehler enthält. <strong>Wenn Ihre Optimierung 1/N nicht schlägt, ist sie ihren Aufwand nicht wert.</strong> Diese Messlatte sollte in jedem Portfolioprojekt stehen.</p>
|
||||
<p><strong>🎯 Der Realitätscheck: Gleichgewichtung</strong> Das Programm vergleicht immer mit dem <strong>1/N-Portfolio</strong>. Das ist kein Scherz: DeMiguel, Garlappi und Uppal zeigten 2009 in einer viel beachteten Studie, dass die naive Gleichgewichtung viele optimierte Strategien out of sample schlägt — weil sie keinerlei Schätzung benötigt und damit auch keinen <a href="anhang-glossar.md#gloss:schaetzfehler" class="glossar-link">Schätzfehler</a> enthält. <strong>Wenn Ihre Optimierung 1/N nicht schlägt, ist sie ihren Aufwand nicht wert.</strong> Diese Messlatte sollte in jedem Portfolioprojekt stehen.</p>
|
||||
</blockquote>
|
||||
<hr />
|
||||
<h2 id="sec:markowitz-uebungsaufgaben">19.7 Übungsaufgaben</h2>
|
||||
|
|
@ -853,11 +853,11 @@ obwohl Formel und Simulation nichts voneinander wissen.</code></pre>
|
|||
<p><strong>Aufgabe 19.3 ⭐⭐ — Korn-Transformation nachvollziehen.</strong> Zeigen Sie rechnerisch, dass die Sharpe Ratio invariant gegenüber positiver Skalierung ist: <span class="math inline">\text{SR}(c\,\mathbf{w}) = \text{SR}(\mathbf{w})</span> für <span class="math inline">c > 0</span>. Warum gilt das <strong>nicht</strong>, wenn die Nebenbedingung <span class="math inline">\sum w_i = 1</span> mitgeführt wird — und wie löst die Transformation dieses Problem?</p>
|
||||
<p><strong>Aufgabe 19.4 ⭐⭐ — Restriktionen kosten Rendite.</strong> Lassen Sie <code>Markowitz_CVXPY.py</code> mit <code>MAX_GEWICHT</code> von 1,0 (keine Grenze) bis 0,10 in Schritten von 0,05 laufen. Tabellieren Sie Sharpe Ratio und maximal erreichbare Rendite. (a) Was kostet die 20-%-Grenze an Sharpe Ratio? (b) Ab welcher Grenze wird das Problem unlösbar? Warum?</p>
|
||||
<p><strong>Aufgabe 19.5 ⭐⭐ — Den Sektorfehler nachstellen.</strong> Bauen Sie den Fehler bewusst nach: Verwenden Sie <code>tech_indices = [0,1,2,3]</code> auf den alphabetisch sortierten Spalten. Vergleichen Sie das Ergebnis mit der korrekten Version. (a) Welche Titel werden tatsächlich beschränkt? (b) Wie stark unterscheiden sich die Portfoliogewichte? (c) Fällt der Fehler in den ausgegebenen Kennzahlen auf?</p>
|
||||
<p><strong>Aufgabe 19.6 ⭐⭐⭐ — Kardinalität ergänzen.</strong> Erweitern Sie das Modell um „höchstens <span class="math inline">K = 5</span> Titel“ mit Binärvariablen. CVXPY braucht dafür <code>cp.Variable(n, boolean=True)</code> und einen MIQP-fähigen Solver (z. B. <code>SCIP</code> über <code>cp.SCIP</code> oder <code>ECOS_BB</code>). Vergleichen Sie Sharpe Ratio und Rechenzeit mit dem unbeschränkten Fall.</p>
|
||||
<p><strong>Aufgabe 19.6 ⭐⭐⭐ — Kardinalität ergänzen.</strong> Erweitern Sie das Modell um „höchstens <span class="math inline">K = 5</span> Titel“ mit Binärvariablen. CVXPY braucht dafür <code>cp.Variable(n, boolean=True)</code> und einen <a href="anhang-glossar.md#gloss:miqp" class="glossar-link">MIQP</a>-fähigen <a href="anhang-glossar.md#gloss:solver" class="glossar-link">Solver</a> (z. B. <code>SCIP</code> über <code>cp.SCIP</code> oder <code>ECOS_BB</code>). Vergleichen Sie Sharpe Ratio und Rechenzeit mit dem unbeschränkten Fall.</p>
|
||||
<p><strong>Aufgabe 19.7 ⭐⭐⭐ — Out-of-Sample-Test.</strong> Teilen Sie die Historie in zwei Hälften. Optimieren Sie auf der ersten, bewerten Sie auf der zweiten. Vergleichen Sie GMV, Max Sharpe und 1/N. (a) Welches Portfolio gewinnt out of sample? (b) Wie ändert sich das Bild mit Ledoit-Wolf gegenüber der Stichprobenkovarianz? (c) Welche Schlussfolgerung ziehen Sie für die Praxis?</p>
|
||||
<hr />
|
||||
<h2 id="sec:markowitz-denkfehler">19.8 Finde den Denkfehler</h2>
|
||||
<p><a href="finanzdaten.html#kap-finanzdaten">Kapitel 18</a> hat gezeigt, was eine schlecht geschätzte <strong>Kovarianzmatrix</strong> anrichtet. Bei den erwarteten <strong>Renditen</strong> ist es schlimmer — und weil sie in der Zielfunktion stehen statt in der Nebenbedingung, fällt es schwerer auf.</p>
|
||||
<p><a href="finanzdaten.html#kap-finanzdaten">Kapitel 18</a> hat gezeigt, was eine schlecht geschätzte <strong>Kovarianzmatrix</strong> anrichtet. Bei den erwarteten <strong>Renditen</strong> ist es schlimmer — und weil sie in der <a href="anhang-glossar.md#gloss:zielfunktion" class="glossar-link">Zielfunktion</a> stehen statt in der Nebenbedingung, fällt es schwerer auf.</p>
|
||||
<div class="card card-denkfehler">
|
||||
<blockquote>
|
||||
<p><strong>🐛 Finde den Denkfehler: Zwölf gleiche Anlagen, ein sehr ungleiches Portfolio</strong></p>
|
||||
|
|
|
|||
Loading…
Reference in a new issue