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:
dschlueter 2026-09-10 17:40:29 +02:00
commit e8abb66d75
52 changed files with 4316 additions and 1921 deletions

View file

@ -105,7 +105,7 @@
<p><strong>📌 Kapitel auf einen Blick</strong></p>
<p><strong>Worum geht es?</strong> Um die Eingangsdaten der Portfoliooptimierung — und darum, warum sie trügerisch sind. Wer historische Kovarianzen ungefiltert in einen Optimierer gibt, optimiert Rauschen.</p>
<p><strong>Voraussetzungen:</strong> <a href="qp-nlp.html#kap-qp-nlp">Kapitel 11</a> (Eigenwerte, positive Definitheit), Grundlagen der Statistik.</p>
<p><strong>Danach können Sie:</strong> Kursdaten korrekt laden, diskrete und logarithmische Renditen unterscheiden, das Schätzfehlerproblem erklären, Ledoit-Wolf-Shrinkage anwenden — und erkennen, wann eine Kovarianzmatrix aus zu wenigen Beobachtungen stammt.</p>
<p><strong>Danach können Sie:</strong> Kursdaten korrekt laden, diskrete und logarithmische Renditen unterscheiden, das Schätzfehlerproblem erklären, <a href="anhang-glossar.md#gloss:ledoit-wolf-shrinkage" class="glossar-link">Ledoit-Wolf-Shrinkage</a> anwenden — und erkennen, wann eine <a href="anhang-glossar.md#gloss:kovarianzmatrix" class="glossar-link">Kovarianzmatrix</a> aus zu wenigen Beobachtungen stammt.</p>
<p><strong>Zeitbedarf:</strong> ca. 5 Stunden.</p>
<p><strong>Programme:</strong><br />
<code>Renditen_Vergleich.py</code><br />
@ -176,7 +176,7 @@ Mittelwert log 4.56 % -&gt; hochgerechnet 120.00</code></pre>
<tr class="even">
<td>Wofür also</td>
<td>Portfoliogewichtung, Kennzahlen je Periode</td>
<td>Zeitreihenanalyse, Volatilität, Modelle</td>
<td>Zeitreihenanalyse, <a href="anhang-glossar.md#gloss:volatilitaet" class="glossar-link">Volatilität</a>, Modelle</td>
</tr>
</tbody>
</table>
@ -189,9 +189,9 @@ Mittelwert log 4.56 % -&gt; hochgerechnet 120.00</code></pre>
<p>Nach diesem Kapitel können Sie …</p>
<ol type="1">
<li>… erklären, wann man diskrete und wann logarithmische Renditen verwendet.</li>
<li>… beschreiben, warum die Stichproben-Kovarianzmatrix bei vielen Titeln unbrauchbar wird.</li>
<li>… den <strong>Error-Maximizer-Effekt</strong> an einem Experiment nachweisen.</li>
<li>… Ledoit-Wolf-Shrinkage anwenden und ihre Wirkung an Eigenwerten und Konditionszahl messen.</li>
<li>… beschreiben, warum die <a href="anhang-glossar.md#gloss:stichproben-kovarianzmatrix" class="glossar-link">Stichproben-Kovarianzmatrix</a> bei vielen Titeln unbrauchbar wird.</li>
<li>… den <strong><a href="anhang-glossar.md#gloss:error-maximizer-effekt" class="glossar-link">Error-Maximizer-Effekt</a></strong> an einem Experiment nachweisen.</li>
<li>… Ledoit-Wolf-Shrinkage anwenden und ihre Wirkung an Eigenwerten und <a href="anhang-glossar.md#gloss:konditionszahl" class="glossar-link">Konditionszahl</a> messen.</li>
<li>… Kursdaten so laden, dass die Spaltenreihenfolge garantiert stimmt.</li>
<li>… begründen, warum eine Schätzung aus <span class="math inline">T &lt; N</span> Beobachtungen dem Optimierer risikofreie Richtungen vorgaukelt — und welche drei Gegenmittel es gibt.</li>
<li>… ein Portfolio <strong>außerhalb</strong> des Schätzzeitraums bewerten statt darin.</li>
@ -333,7 +333,7 @@ r_{i,0\to T} = \sum_{t=1}^T r_{i,t}
<p><span class="math display">
\mathbf{S} = \frac{1}{T-1}\mathbf{X}^\top\mathbf{X}
</span></p>
<p>Das Problem: <span class="math inline">\mathbf{S}</span> hat <span class="math inline">\frac{N(N+1)}{2}</span> zu schätzende Parameter, aber nur <span class="math inline">T \cdot N</span> Datenpunkte. Bei <span class="math inline">N = 50</span> Titeln sind das <strong>1275 Parameter</strong> — geschätzt aus einem Jahr Daten (<span class="math inline">T = 252</span>).</p>
<p>Das Problem: <span class="math inline">\mathbf{S}</span> hat <span class="math inline">\frac{N(N+1)}{2}</span> zu schätzende <a href="anhang-glossar.md#gloss:parameter" class="glossar-link">Parameter</a>, aber nur <span class="math inline">T \cdot N</span> Datenpunkte. Bei <span class="math inline">N = 50</span> Titeln sind das <strong>1275 Parameter</strong> — geschätzt aus einem Jahr Daten (<span class="math inline">T = 252</span>).</p>
<figure>
<img src="bilder_04/kap11_ledoit_wolf_shrinkage.svg" alt="Abb. 18.1: Ledoit-Wolf-Kovarianz-Shrinkage" />
<figcaption aria-hidden="true">Abb. 18.1: Ledoit-Wolf-Kovarianz-Shrinkage</figcaption>
@ -364,7 +364,7 @@ r_{i,0\to T} = \sum_{t=1}^T r_{i,t}
</tr>
</tbody>
</table>
<p>Die <strong>Zufallsmatrizentheorie</strong> (<em>Random Matrix Theory</em>, Marchenko-Pastur-Gesetz) zeigt: Die kleinsten Eigenwerte von <span class="math inline">\mathbf{S}</span> werden <strong>systematisch unterschätzt</strong>, die größten überschätzt. Und genau das ist fatal, denn:</p>
<p>Die <strong><a href="anhang-glossar.md#gloss:zufallsmatrizentheorie" class="glossar-link">Zufallsmatrizentheorie</a></strong> (<em>Random Matrix Theory</em>, <a href="anhang-glossar.md#gloss:marchenko-pastur-gesetz" class="glossar-link">Marchenko-Pastur-Gesetz</a>) zeigt: Die kleinsten Eigenwerte von <span class="math inline">\mathbf{S}</span> werden <strong>systematisch unterschätzt</strong>, die größten überschätzt. Und genau das ist fatal, denn:</p>
<blockquote>
<p><strong>🎯 Der Error-Maximizer-Effekt</strong> Ein Risikominimierer sucht die Richtungen mit der <strong>kleinsten</strong> Varianz — also genau jene Eigenrichtungen, deren Eigenwerte am stärksten <strong>nach unten verzerrt</strong> sind. Die Optimierung greift damit zielsicher in das Schätzrauschen hinein. Markowitz-Optimierung ist deshalb kein Fehlerdämpfer, sondern ein <strong>Fehlerverstärker</strong>.</p>
</blockquote>
@ -481,7 +481,7 @@ Bestmoegliche Volatilitaet bei perfektem Wissen: 11.84 % p.a.
504 | 12.6 | 12.33 % +4.1 % | 12.30 % +3.9 % | 0.012
1260 | 31.5 | 12.03 % +1.6 % | 12.02 % +1.6 % | 0.005
--------------------------------------------------------------------------------------------</code></pre>
<p><strong>Diese Tabelle ist das Kernargument des ganzen Kapitels.</strong> Lesen Sie die erste Zeile: Bei nur 60 Beobachtungen für 40 Titel trägt das „risikominimale“ Portfolio in Wahrheit <strong>75,5 % mehr Risiko</strong> als nötig. Der Optimierer hat nicht das Risiko minimiert, sondern das <strong>geschätzte</strong> Risiko — und die Differenz ist der Schätzfehler, in den er hineinoptimiert hat.</p>
<p><strong>Diese Tabelle ist das Kernargument des ganzen Kapitels.</strong> Lesen Sie die erste Zeile: Bei nur 60 Beobachtungen für 40 Titel trägt das „risikominimale“ Portfolio in Wahrheit <strong>75,5 % mehr Risiko</strong> als nötig. Der Optimierer hat nicht das Risiko minimiert, sondern das <strong>geschätzte</strong> Risiko — und die Differenz ist der <a href="anhang-glossar.md#gloss:schaetzfehler" class="glossar-link">Schätzfehler</a>, in den er hineinoptimiert hat.</p>
<p>Drei Beobachtungen:</p>
<ol type="1">
<li><strong>Der Schaden wächst dramatisch, je knapper die Daten.</strong> Von <span class="math inline">T/N = 31{,}5</span> (+1,6 %) bis <span class="math inline">T/N = 1{,}5</span> (+75,5 %) ist es kein gleitender Übergang, sondern eine Explosion.</li>
@ -713,7 +713,7 @@ prices.columns: [&#39;AAPL&#39;, &#39;AMZN&#39;, &#39;CVX&#39;, &#39;GS&#39;, &
<p><strong>Aufgabe 18.2 ⭐ — Mittelwertfalle.</strong> Ein Fonds meldet Jahresrenditen von <span class="math inline">+60\,\%</span>, <span class="math inline">-40\,\%</span>, <span class="math inline">+60\,\%</span>, <span class="math inline">-40\,\%</span>. (a) Wie hoch ist das arithmetische Mittel? (b) Wie viel Kapital hat ein Anleger nach 4 Jahren aus 10 000 €? (c) Welche jährliche Rendite entspricht dem tatsächlich?</p>
<p><strong>Aufgabe 18.3 ⭐⭐ — Konditionszahl verstehen.</strong> Erzeugen Sie eine Kovarianzmatrix für <span class="math inline">N = 30</span> Titel aus <span class="math inline">T = 40</span>, <span class="math inline">T = 100</span> und <span class="math inline">T = 1000</span> simulierten Beobachtungen. Berechnen Sie jeweils kleinsten Eigenwert und Konditionszahl. Ab welchem <span class="math inline">T</span> wird die Matrix brauchbar?</p>
<p><strong>Aufgabe 18.4 ⭐⭐ — Spaltenreihenfolge prüfen.</strong> Laden Sie fünf Ticker in einer bewusst unsortierten Reihenfolge. Zeigen Sie, dass <code>raw["Close"].columns</code> abweicht, und dass <code>raw["Close"][tickers]</code> das behebt. Was passiert, wenn ein Ticker nicht existiert?</p>
<p><strong>Aufgabe 18.5 ⭐⭐⭐ — Beide Shrinkage-Ziele vergleichen.</strong> Implementieren Sie das Konstant-Korrelations-Ziel vollständig (inklusive eigener Berechnung von <span class="math inline">\delta</span> nach Ledoit/Wolf 2003 oder per Kreuzvalidierung). Vergleichen Sie mit <code>sklearn</code> anhand: (a) der Konditionszahl, (b) der Out-of-Sample-Volatilität eines GMV-Portfolios (nach dem Muster von <code>Schaetzrauschen_Demo.py</code>), (c) der Stabilität der Gewichte über rollierende Fenster.</p>
<p><strong>Aufgabe 18.5 ⭐⭐⭐ — Beide Shrinkage-Ziele vergleichen.</strong> Implementieren Sie das Konstant-Korrelations-Ziel vollständig (inklusive eigener Berechnung von <span class="math inline">\delta</span> nach Ledoit/Wolf 2003 oder per Kreuzvalidierung). Vergleichen Sie mit <code>sklearn</code> anhand: (a) der Konditionszahl, (b) der Out-of-Sample-Volatilität eines <a href="anhang-glossar.md#gloss:global-minimum-variance-portfolio-gmv" class="glossar-link">GMV</a>-Portfolios (nach dem Muster von <code>Schaetzrauschen_Demo.py</code>), (c) der Stabilität der Gewichte über rollierende Fenster.</p>
<p><strong>Aufgabe 18.6 ⭐⭐⭐ — Error-Maximizer selbst messen.</strong> Erweitern Sie <code>Schaetzrauschen_Demo.py</code> um eine dritte Variante: die <strong>Gleichgewichtung</strong> (<span class="math inline">w_i = 1/N</span>), die überhaupt keine Schätzung benötigt. (a) Ab welchem <span class="math inline">T/N</span> schlägt die Stichproben-Optimierung die Gleichgewichtung? (b) Ab welchem <span class="math inline">T/N</span> schlägt Ledoit-Wolf sie? (c) Was folgt daraus für die Praxis?</p>
<hr />
<h2 id="sec:finanzdaten-denkfehler">18.8 Finde den Denkfehler</h2>