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

40
OR_HTML_04/qp-nlp.html generated
View file

@ -107,7 +107,7 @@
<figcaption aria-hidden="true">Entscheidungsdiagramm: Welches Werkzeug passt zu meinem Problem? (Teil III)</figcaption>
</figure>
<blockquote>
<p><strong>🎯 Merksatz zum Diagramm</strong> Die erste Frage trennt zwei Welten, die man nicht vermischen darf. Ist die <strong>Nichtlinearität</strong> das Problem, geht es um Konvexität — und damit darum, ob Sie eine Optimalitätsgarantie bekommen oder nur ein lokales Optimum. Ist die <strong>Unsicherheit</strong> das Problem, geht es um etwas ganz anderes: Nicht der Solver ist die Schwierigkeit, sondern die Frage, was „optimal“ überhaupt heißen soll, wenn man die Daten nicht kennt.</p>
<p><strong>🎯 Merksatz zum Diagramm</strong> Die erste Frage trennt zwei Welten, die man nicht vermischen darf. Ist die <strong>Nichtlinearität</strong> das Problem, geht es um <a href="anhang-glossar.md#gloss:konvexitaet" class="glossar-link">Konvexität</a> — und damit darum, ob Sie eine Optimalitätsgarantie bekommen oder nur ein lokales Optimum. Ist die <strong>Unsicherheit</strong> das Problem, geht es um etwas ganz anderes: Nicht der <a href="anhang-glossar.md#gloss:solver" class="glossar-link">Solver</a> ist die Schwierigkeit, sondern die Frage, was „optimal“ überhaupt heißen soll, wenn man die Daten nicht kennt.</p>
<p>Der häufigste Fehler an dieser Stelle ist, Unsicherheit durch <strong>Mittelwerte</strong> zu ersetzen und dann deterministisch zu rechnen. Warum das systematisch danebengeht, zeigt <a href="unsicherheit.html#kap-unsicherheit">Kapitel 12</a> unter dem Namen <em>Fluch des Durchschnitts</em>.</p>
</blockquote>
<p>Zwei weitere Kapitel schließen sich an, weil sie dieselbe Voraussetzung aufgeben, nur an einer anderen Stelle: <a href="mehrziel.html#kap-mehrziel">Kapitel 14</a> gibt das <strong>eine Ziel</strong> auf, <a href="prognose.html#kap-prognose">Kapitel 15</a> die Annahme, die <strong>Eingabedaten</strong> seien gegeben statt selbst geschätzt. Was dieser Teil insgesamt leistet, fasst die Synthese an seinem Ende zusammen.</p>
@ -116,9 +116,9 @@
<div class="card card-blick">
<blockquote>
<p><strong>📌 Kapitel auf einen Blick</strong></p>
<p><strong>Worum geht es?</strong> Risiko ist quadratisch. Sobald Varianz ins Spiel kommt, verlässt man die Welt der Polyeder. Dieses Kapitel liefert das mathematische Fundament für die gesamte Portfoliooptimierung in <a href="bruecke.html#teil-anwendungen">Teil IV</a>.</p>
<p><strong>Worum geht es?</strong> Risiko ist quadratisch. Sobald Varianz ins Spiel kommt, verlässt man die Welt der <a href="anhang-glossar.md#gloss:polyeder" class="glossar-link">Polyeder</a>. Dieses Kapitel liefert das mathematische Fundament für die gesamte Portfoliooptimierung in <a href="bruecke.html#teil-anwendungen">Teil IV</a>.</p>
<p><strong>Voraussetzungen:</strong> <a href="fundament.html#kap-fundament">Kapitel 2</a> (Konvexität, Eigenwerte), <a href="lp.html#kap-lp">Kapitel 5</a> (Dualität, Schattenpreise). Gradienten werden in <a href="#sec:qp-nlp-lernziele">Abschnitt 11.2</a> wiederholt.</p>
<p><strong>Danach können Sie:</strong> Ein quadratisches Programm aufstellen, die KKT-Bedingungen anwenden, den Zusammenhang zwischen Lagrange-Multiplikator und Schattenpreis erklären, eine gültige Kovarianzmatrix konstruieren — und mit nicht-konvexen Problemen umgehen, ohne ein lokales Optimum für das Optimum zu halten.</p>
<p><strong>Danach können Sie:</strong> Ein quadratisches Programm aufstellen, die <a href="anhang-glossar.md#gloss:karush-kuhn-tucker-bedingungen-kkt" class="glossar-link">KKT</a>-Bedingungen anwenden, den Zusammenhang zwischen <a href="anhang-glossar.md#gloss:lagrange-multiplikator" class="glossar-link">Lagrange-Multiplikator</a> und <a href="anhang-glossar.md#gloss:schattenpreis" class="glossar-link">Schattenpreis</a> erklären, eine gültige <a href="anhang-glossar.md#gloss:kovarianzmatrix" class="glossar-link">Kovarianzmatrix</a> konstruieren — und mit nicht-konvexen Problemen umgehen, ohne ein lokales Optimum für das Optimum zu halten.</p>
<p><strong>Zeitbedarf:</strong> ca. 6,5 Stunden.</p>
<p><strong>Programme:</strong><br />
<code>QP_Grundlagen.py</code><br />
@ -209,7 +209,7 @@ Risiko der Mischung: 8.90 %</code></pre>
<p><span class="math display">
\sigma_p^2 = w_A^2\sigma_A^2 + w_B^2\sigma_B^2 + 2\,w_A w_B \rho\,\sigma_A\sigma_B
</span></p>
<p>Der letzte Term ist der entscheidende: Bei negativer Korrelation ist er <strong>negativ</strong> und zieht das Gesamtrisiko herunter. Deshalb verlässt man mit Risiko die Welt der Polyeder aus <a href="lp.html#teil-kernverfahren">Teil II</a> — die Zielfunktion ist kein Skalarprodukt mehr, sondern eine quadratische Form. Was das für die Lösbarkeit bedeutet und warum CVXPY das trotzdem mit Optimalitätsgarantie löst, klärt der Rest des Kapitels.</p>
<p>Der letzte Term ist der entscheidende: Bei negativer Korrelation ist er <strong>negativ</strong> und zieht das Gesamtrisiko herunter. Deshalb verlässt man mit Risiko die Welt der Polyeder aus <a href="lp.html#teil-kernverfahren">Teil II</a> — die <a href="anhang-glossar.md#gloss:zielfunktion" class="glossar-link">Zielfunktion</a> ist kein <a href="anhang-glossar.md#gloss:skalarprodukt" class="glossar-link">Skalarprodukt</a> mehr, sondern eine quadratische Form. Was das für die Lösbarkeit bedeutet und warum <a href="anhang-glossar.md#gloss:cvxpy" class="glossar-link">CVXPY</a> das trotzdem mit Optimalitätsgarantie löst, klärt der Rest des Kapitels.</p>
<blockquote>
<p><strong>🎯 Merksatz</strong> <code>cp.quad_form(w, S)</code> ist die Zeile, um die es im ganzen Kapitel geht. Sie ist genau dann harmlos, wenn <span class="math inline">\mathbf{S}</span> <strong>positiv semidefinit</strong> ist — und genau dann ein Problem, wenn nicht. CVXPY prüft das für Sie und verweigert die Arbeit im Zweifelsfall. Diese Verweigerung ist ein Schutzmechanismus, keine Schikane.</p>
</blockquote>
@ -217,13 +217,13 @@ Risiko der Mischung: 8.90 %</code></pre>
<h2 id="sec:qp-nlp-lernziele">11.2 Lernziele</h2>
<p>Nach diesem Kapitel können Sie …</p>
<ol type="1">
<li>… ein <strong>quadratisches Programm (QP)</strong> aufstellen und von einem allgemeinen nichtlinearen Programm abgrenzen.</li>
<li>… ein <strong>quadratisches Programm (<a href="anhang-glossar.md#gloss:quadratische-programmierung-qp" class="glossar-link">QP</a>)</strong> aufstellen und von einem allgemeinen nichtlinearen Programm abgrenzen.</li>
<li>… die <strong>KKT-Bedingungen</strong> herleiten und auf ein Optimierungsproblem anwenden.</li>
<li>… den Zusammenhang zwischen <strong>Lagrange-Multiplikator</strong> und <strong>Schattenpreis</strong> erklären.</li>
<li>… zwischen <strong>konvex</strong> und <strong>streng konvex</strong> unterscheiden und eine gültige, positiv semidefinite <strong>Kovarianzmatrix</strong> konstruieren.</li>
</ol>
<h3 id="auffrischung-gradient-in-einer-minute">Auffrischung: Gradient in einer Minute</h3>
<p>Der <strong>Gradient</strong> <span class="math inline">\nabla f(\mathbf{x})</span> ist der Vektor aller partiellen Ableitungen:</p>
<p>Der <strong><a href="anhang-glossar.md#gloss:gradient" class="glossar-link">Gradient</a></strong> <span class="math inline">\nabla f(\mathbf{x})</span> ist der Vektor aller partiellen Ableitungen:</p>
<p><span class="math display">
\nabla f(\mathbf{x}) = \left(\frac{\partial f}{\partial x_1},\ \frac{\partial f}{\partial x_2},\ \dots,\ \frac{\partial f}{\partial x_n}\right)^\top
</span></p>
@ -303,7 +303,7 @@ Risiko der Mischung: 8.90 %</code></pre>
</tr>
</tbody>
</table>
<p><strong>Warum das praktisch zählt:</strong> Eine Stichproben-Kovarianzmatrix mit mehr Titeln als Beobachtungen (<span class="math inline">N &gt; T</span>) ist <strong>singulär</strong> — also nur semidefinit. Dann gibt es unendlich viele Portfolios mit exakt demselben minimalen Risiko, und der Solver liefert eines davon, scheinbar willkürlich. Kleine Datenänderungen führen zu völlig anderen Gewichten. Genau dieses Problem behebt die Shrinkage aus <a href="finanzdaten.html#kap-finanzdaten">Kapitel 18</a>.</p>
<p><strong>Warum das praktisch zählt:</strong> Eine <a href="anhang-glossar.md#gloss:stichproben-kovarianzmatrix" class="glossar-link">Stichproben-Kovarianzmatrix</a> mit mehr Titeln als Beobachtungen (<span class="math inline">N &gt; T</span>) ist <strong>singulär</strong> — also nur semidefinit. Dann gibt es unendlich viele Portfolios mit exakt demselben minimalen Risiko, und der Solver liefert eines davon, scheinbar willkürlich. Kleine Datenänderungen führen zu völlig anderen Gewichten. Genau dieses Problem behebt die Shrinkage aus <a href="finanzdaten.html#kap-finanzdaten">Kapitel 18</a>.</p>
<p>Alle drei Zeilen der Tabelle lassen sich an einem winzigen Zwei-Variablen-QP direkt beobachten — inklusive der Stelle, an der CVXPY ein nicht konvexes Problem <strong>verweigert</strong>, bevor überhaupt ein Solver aufgerufen wird:</p>
<div class="sourceCode" id="cb3"><pre class="sourceCode python"><code class="sourceCode python"><span id="cb3-1"><a href="#cb3-1" aria-hidden="true" tabindex="-1"></a><span class="co">#!/usr/bin/env python3</span></span>
<span id="cb3-2"><a href="#cb3-2" aria-hidden="true" tabindex="-1"></a></span>
@ -389,7 +389,7 @@ DCP-konvex (CVXPY-Pruefung)? False
<p><strong>⚠️ Prüfen Sie jede Matrix, bevor Sie sie verwenden</strong></p>
<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>eigenwerte <span class="op">=</span> np.linalg.eigvalsh(Sigma) <span class="co"># &#39;h&#39; = fuer symmetrische Matrizen</span></span>
<span id="cb5-2"><a href="#cb5-2" aria-hidden="true" tabindex="-1"></a><span class="cf">assert</span> np.<span class="bu">all</span>(eigenwerte <span class="op">&gt;=</span> <span class="op">-</span><span class="fl">1e-10</span>), <span class="st">&quot;Sigma ist nicht positiv semidefinit!&quot;</span></span>
<span id="cb5-3"><a href="#cb5-3" aria-hidden="true" tabindex="-1"></a><span class="bu">print</span>(<span class="ss">f&quot;Konditionszahl: </span><span class="sc">{</span>eigenwerte<span class="sc">.</span><span class="bu">max</span>() <span class="op">/</span> eigenwerte<span class="sc">.</span><span class="bu">min</span>()<span class="sc">:.1f}</span><span class="ss">&quot;</span>)</span></code></pre></div>
<span id="cb5-3"><a href="#cb5-3" aria-hidden="true" tabindex="-1"></a><span class="bu">print</span>(<span class="ss">f&quot;[Konditionszahl](anhang-glossar.md#gloss:konditionszahl)</span><span class="sc">{.</span>glossar<span class="op">-</span>link<span class="sc">}</span><span class="ss">: </span><span class="sc">{</span>eigenwerte<span class="sc">.</span><span class="bu">max</span>() <span class="op">/</span> eigenwerte<span class="sc">.</span><span class="bu">min</span>()<span class="sc">:.1f}</span><span class="ss">&quot;</span>)</span></code></pre></div>
<p>Eine einzige Zeile — und sie deckt eine ungültige Kovarianzmatrix sofort auf.</p>
</blockquote>
<hr />
@ -399,7 +399,7 @@ DCP-konvex (CVXPY-Pruefung)? False
<p><span class="math display">
\min f(\mathbf{x}) \quad\text{u. d. N.}\quad g_i(\mathbf{x})\le0\ (i=1..m),\qquad h_j(\mathbf{x})=0\ (j=1..p)
</span></p>
<p>lautet die <strong>Lagrange-Funktion</strong>:</p>
<p>lautet die <strong><a href="anhang-glossar.md#gloss:lagrange-funktion" class="glossar-link">Lagrange-Funktion</a></strong>:</p>
<p><span class="math display">
\mathcal{L}(\mathbf{x},\boldsymbol{\lambda},\boldsymbol{\nu})
= f(\mathbf{x}) + \sum_{i=1}^m \lambda_i g_i(\mathbf{x}) + \sum_{j=1}^p \nu_j h_j(\mathbf{x})
@ -418,7 +418,7 @@ DCP-konvex (CVXPY-Pruefung)? False
<p><strong>2. Primale Zulässigkeit</strong> — die ursprünglichen Bedingungen gelten: <span class="math inline">g_i(\mathbf{x}^*)\le0</span>, <span class="math inline">h_j(\mathbf{x}^*)=0</span>.</p>
<p><strong>3. Duale Zulässigkeit</strong> — die Multiplikatoren der Ungleichungen sind nichtnegativ: <span class="math inline">\lambda_i^*\ge0</span>.</p>
<p><em>Warum?</em> Eine Wand kann nur <strong>drücken</strong>, nicht ziehen. Ein negatives <span class="math inline">\lambda</span> hieße, die Bedingung würde die Lösung von sich weg<strong>ziehen</strong> — dann wäre sie nicht bindend.</p>
<p><strong>4. Komplementärer Schlupf</strong><span class="math inline">\lambda_i^*\cdot g_i(\mathbf{x}^*)=0</span> für alle <span class="math inline">i</span>.</p>
<p><strong>4. <a href="anhang-glossar.md#gloss:komplementaerer-schlupf" class="glossar-link">Komplementärer Schlupf</a></strong><span class="math inline">\lambda_i^*\cdot g_i(\mathbf{x}^*)=0</span> für alle <span class="math inline">i</span>.</p>
<p><em>Bedeutung:</em> Entweder ist die Bedingung nicht bindend (<span class="math inline">g_i&lt;0</span>), <strong>dann muss</strong> <span class="math inline">\lambda_i=0</span> sein. Oder der Multiplikator ist positiv, <strong>dann muss</strong> die Bedingung mit Gleichheit binden. Das ist derselbe Satz wie in <a href="lp.html#kap-lp">Kapitel 5</a> — nur allgemeiner formuliert.</p>
<figure>
<img src="bilder_04/kap_qp_kkt.svg" alt="Abb. 11.1: Links die Handrechnung dieses Abschnitts: Das freie Minimum liegt bei x=5, die Grenze lässt nur x \le 3 zu, und \lambda^* = 4 ist genau die Steigung von f am Rand — der Preis dafür, dass es nicht weitergeht. Rechts dieselbe Aussage in zwei Dimensionen: \nabla f und \lambda^*\nabla g zeigen gegeneinander und heben sich auf. Das Skript bilder_04/erzeuge_kkt.py prüft alle vier KKT-Bedingungen numerisch, bevor es zeichnet." />
@ -458,7 +458,7 @@ DCP-konvex (CVXPY-Pruefung)? False
</tr>
<tr class="odd">
<td><span class="math inline">\lambda_i^*</span> selbst</td>
<td>Der <strong>Schattenpreis</strong> von Bedingung <span class="math inline">i</span> — dieselbe Größe wie im LP (<a href="lp.html#kap-lp">Kapitel 5</a>), nur für krumme Ränder.</td>
<td>Der <strong>Schattenpreis</strong> von Bedingung <span class="math inline">i</span> — dieselbe Größe wie im <a href="anhang-glossar.md#gloss:lineare-programmierung-lp" class="glossar-link">LP</a> (<a href="lp.html#kap-lp">Kapitel 5</a>), nur für krumme Ränder.</td>
</tr>
</tbody>
</table>
@ -589,12 +589,12 @@ DCP-konvex (CVXPY-Pruefung)? False
<span id="cb6-110"><a href="#cb6-110" aria-hidden="true" tabindex="-1"></a> <span class="bu">print</span>(<span class="st">&quot;=&quot;</span> <span class="op">*</span> <span class="dv">74</span>)</span></code></pre></div>
<hr />
<h2 id="sec:qp-nlp-nichtlineare-optimierung-mit-scipy-optimize-minimize">11.5 Nichtlineare Optimierung mit <code>scipy.optimize.minimize</code></h2>
<p>Wenn Zielfunktion oder Nebenbedingungen weder linear noch quadratisch sind — Logarithmen, Wurzeln, Exponentialfunktionen — nutzt man gradientenbasierte Verfahren wie <strong>SLSQP</strong> (<em>Sequential Least Squares Programming</em>).</p>
<p>Wenn Zielfunktion oder Nebenbedingungen weder linear noch quadratisch sind — Logarithmen, Wurzeln, Exponentialfunktionen — nutzt man gradientenbasierte Verfahren wie <strong><a href="anhang-glossar.md#gloss:slsqp" class="glossar-link">SLSQP</a></strong> (<em>Sequential Least Squares Programming</em>).</p>
<blockquote>
<p><strong>⚠️ Der entscheidende Unterschied zu CVXPY</strong> CVXPY <strong>prüft</strong> die Konvexität und garantiert bei Erfolg das globale Optimum. <code>scipy.optimize.minimize</code> prüft nichts und liefert ein <strong>lokales</strong> Optimum, das vom Startpunkt abhängt (siehe die Demonstration in <a href="fundament.html#sec:fundament-konvexitaet-die-grenze-zwischen-leicht-und">Abschnitt 2.5</a>). Wer SLSQP einsetzt, sollte <strong>immer mit mehreren Startpunkten rechnen</strong> und die Ergebnisse vergleichen.</p>
</blockquote>
<h3 id="praxisfall-entropie-maximierte-kapitalallokation">Praxisfall: Entropie-maximierte Kapitalallokation</h3>
<p>Wir optimieren ein Portfolio nicht nur nach Varianz, sondern maximieren zusätzlich die <strong>Shannon-Entropie</strong> der Gewichte, um Klumpenrisiken glatt zu bestrafen:</p>
<p>Wir optimieren ein Portfolio nicht nur nach Varianz, sondern maximieren zusätzlich die <strong><a href="anhang-glossar.md#gloss:shannon-entropie" class="glossar-link">Shannon-Entropie</a></strong> der Gewichte, um Klumpenrisiken glatt zu bestrafen:</p>
<p><span class="math display">
\min_{\mathbf{w}}\quad \underbrace{\tfrac12\mathbf{w}^\top\boldsymbol{\Sigma}\mathbf{w}}_{\text{Risiko}}
\;-\;\underbrace{\alpha\,\boldsymbol{\mu}^\top\mathbf{w}}_{\text{Ertrag}}
@ -823,7 +823,7 @@ US-Treasuries 3.0 % 7.0 % 0.45 %
<tr class="even">
<td><strong>Ja/Nein mal Menge</strong></td>
<td>Anlage läuft <em>und</em> wie stark</td>
<td>ganzzahlig + nichtlinear = MINLP</td>
<td>ganzzahlig + nichtlinear = <a href="anhang-glossar.md#gloss:minlp" class="glossar-link">MINLP</a></td>
</tr>
<tr class="odd">
<td><strong>Verhältnisse</strong></td>
@ -1163,8 +1163,8 @@ Drei Konsequenzen fuer die Praxis:
</thead>
<tbody>
<tr class="odd">
<td><strong>Ipopt</strong> (über <code>cyipopt</code> oder Pyomo)</td>
<td>lokaler NLP-Solver</td>
<td><strong>Ipopt</strong> (über <code>cyipopt</code> oder <a href="anhang-glossar.md#gloss:pyomo" class="glossar-link">Pyomo</a>)</td>
<td>lokaler <a href="anhang-glossar.md#gloss:nichtlineare-programmierung-nlp" class="glossar-link">NLP</a>-Solver</td>
<td>Innere-Punkte-Verfahren für große, glatte NLPs mit tausenden Variablen — deutlich leistungsfähiger als <code>scipy</code>, aber ebenfalls <strong>nur lokal</strong></td>
</tr>
<tr class="even">
@ -1173,7 +1173,7 @@ Drei Konsequenzen fuer die Praxis:
<td>Bonmin lokal, Couenne mit globaler Garantie für viele Klassen</td>
</tr>
<tr class="odd">
<td><strong>SCIP</strong>, <strong>BARON</strong>, <strong>Gurobi</strong></td>
<td><strong><a href="anhang-glossar.md#gloss:scip" class="glossar-link">SCIP</a></strong>, <strong>BARON</strong>, <strong><a href="anhang-glossar.md#gloss:gurobi" class="glossar-link">Gurobi</a></strong></td>
<td>global</td>
<td>Beweisbar globales Optimum, mit entsprechendem Rechenaufwand</td>
</tr>
@ -1219,7 +1219,7 @@ Drei Konsequenzen fuer die Praxis:
<p><strong>Aufgabe 11.2 ⭐ — Komplementärer Schlupf.</strong> Ein QP liefert <span class="math inline">w = (0{,}4;\ 0{,}0;\ 0{,}6)</span> mit Bedingung <span class="math inline">w \ge 0</span> und Multiplikatoren <span class="math inline">\lambda = (0{,}0;\ 0{,}03;\ 0{,}0)</span>. Ist das mit KKT verträglich? Was sagt <span class="math inline">\lambda_2 = 0{,}03</span> wirtschaftlich?</p>
<p><strong>Aufgabe 11.3 ⭐⭐ — KKT von Hand.</strong> Lösen Sie mit KKT vollständig von Hand: <span class="math display">\min\ x_1^2 + x_2^2 \qquad\text{u. d. N.}\qquad x_1 + x_2 \ge 4</span> Geben Sie <span class="math inline">x^*</span>, <span class="math inline">\lambda^*</span> und die Interpretation von <span class="math inline">\lambda^*</span> an. Prüfen Sie mit CVXPY.</p>
<p><strong>Aufgabe 11.4 ⭐⭐ — Ungültige Kovarianzmatrix erkennen.</strong> Prüfen Sie, ob folgende Korrelationsmatrix möglich ist, und begründen Sie: <span class="math display">\mathbf{C} = \begin{pmatrix}1{,}0&amp;0{,}9&amp;-0{,}9\\0{,}9&amp;1{,}0&amp;0{,}9\\-0{,}9&amp;0{,}9&amp;1{,}0\end{pmatrix}</span> (Tipp: Wenn A stark mit B korreliert und B stark mit C, kann A dann stark <strong>negativ</strong> mit C korrelieren?)</p>
<p><strong>Aufgabe 11.5 ⭐⭐⭐ — Effekt der Gewichtung untersuchen.</strong> Variieren Sie in <code>Entropie_Maximierte_Allokation.py</code> systematisch <span class="math inline">\alpha \in \{0{,}1;\ 0{,}5;\ 1;\ 5\}</span> und <span class="math inline">\beta \in \{0;\ 0{,}005;\ 0{,}015;\ 0{,}05\}</span>. Stellen Sie für jede Kombination Rendite, Volatilität und Entropie in einer Tabelle dar. (a) Wie verändert <span class="math inline">\beta</span> die Konzentration im Krypto-Titel? (b) Ab welchem <span class="math inline">\beta</span> nähert sich die Lösung der Gleichgewichtung? (c) Was ist Ihre Empfehlung — und mit welcher Begründung würden Sie sie einem Anlageausschuss vorlegen?</p>
<p><strong>Aufgabe 11.5 ⭐⭐⭐ — Effekt der Gewichtung untersuchen.</strong> Variieren Sie in <code>Entropie_Maximierte_Allokation.py</code> systematisch <span class="math inline">\alpha \in \{0{,}1;\ 0{,}5;\ 1;\ 5\}</span> und <span class="math inline">\beta \in \{0;\ 0{,}005;\ 0{,}015;\ 0{,}05\}</span>. Stellen Sie für jede Kombination Rendite, <a href="anhang-glossar.md#gloss:volatilitaet" class="glossar-link">Volatilität</a> und Entropie in einer Tabelle dar. (a) Wie verändert <span class="math inline">\beta</span> die Konzentration im Krypto-Titel? (b) Ab welchem <span class="math inline">\beta</span> nähert sich die Lösung der Gleichgewichtung? (c) Was ist Ihre Empfehlung — und mit welcher Begründung würden Sie sie einem Anlageausschuss vorlegen?</p>
<p><strong>Aufgabe 11.6 ⭐⭐⭐ — Nicht-Konvexität demonstrieren.</strong> Bauen Sie bewusst eine ungültige „Kovarianzmatrix“ (per <a href="mailto:A@A.T" class="email">A@A.T</a> mit anschließend überschriebener Diagonale) und lösen Sie das Modell mit 20 Startpunkten. Dokumentieren Sie: Wie viele verschiedene Optima entstehen? Wie groß ist der Unterschied zwischen bestem und schlechtestem Ergebnis? Kann die „Portfoliovarianz“ negativ werden?</p>
<hr />
<h2 id="sec:qp-nlp-denkfehler">11.8 Finde den Denkfehler</h2>
@ -1234,7 +1234,7 @@ Drei Konsequenzen fuer die Praxis:
</ul>
<p>Alle drei schwanken mit 20 %. Leerverkäufe sind in seinem Mandat erlaubt, die Gewichte dürfen also negativ werden; sie müssen sich nur zu 100 % summieren.</p>
<p>Sein erster Versuch mit CVXPY bricht ab:</p>
<pre><code>DCPError: Problem does not follow DCP rules.
<pre><code>[DCPError](anhang-glossar.md#gloss:dcperror){.glossar-link}: Problem does not follow [DCP](anhang-glossar.md#gloss:dcp-disciplined-convex-programming){.glossar-link} rules.
The objective is not DCP. Its following subexpressions are not: QuadForm(...)</code></pre>
<p>Er hält das für eine Einschränkung der Bibliothek und weicht auf <code>scipy</code> aus:</p>
<div class="sourceCode" id="cb13"><pre class="sourceCode python"><code class="sourceCode python"><span id="cb13-1"><a href="#cb13-1" aria-hidden="true" tabindex="-1"></a><span class="im">import</span> numpy <span class="im">as</span> np</span>
@ -1295,7 +1295,7 @@ The objective is not DCP. Its following subexpressions are not: QuadForm(...)</c
<li><strong>Nicht-Konvexität kommt aus dem Alltag</strong>, nicht aus der Theorie: Mengenrabatte, Skaleneffekte, Produkte zweier Entscheidungen. Wo eines davon im Modell steht, ist die Optimalitätsgarantie weg.</li>
<li><strong>Berichten Sie bei nicht-konvexen Problemen die Streuung mit</strong>, nicht die letzte Nachkommastelle. „Bester Wert aus 200 Startpunkten, Spanne bis …“ ist belastbar, ein einzelner Wert ist es nicht.</li>
</ul>
<p><strong>Ausblick.</strong> <a href="unsicherheit.html#kap-unsicherheit">Kapitel 12</a> gibt die Annahme auf, dass die Parameter überhaupt bekannt sind. Wir lernen, mit Szenarien, Erwartungswerten und Worst Cases umzugehen.</p>
<p><strong>Ausblick.</strong> <a href="unsicherheit.html#kap-unsicherheit">Kapitel 12</a> gibt die Annahme auf, dass die <a href="anhang-glossar.md#gloss:parameter" class="glossar-link">Parameter</a> überhaupt bekannt sind. Wir lernen, mit Szenarien, Erwartungswerten und Worst Cases umzugehen.</p>
</article>
<button type="button" class="fortschritt-knopf" data-kapitel="qp-nlp.html"><svg class="icon" aria-hidden="true"><use href="#icon-check"></use></svg> <span>Als gelesen markieren</span></button>