Phase 6.1: Chance Constraints - die Zusage "mit 95 % Sicherheit"

Neuer Abschnitt im Kapitel Unsicherheit plus Chance_Constraints.py (74.
Programm). Das Kapitel hatte Monte-Carlo, Zweistufigkeit und
Worst-Case-Robustheit; die Wahrscheinlichkeitszusage war die fehlende vierte
Antwort - und die, nach der das Management tatsaechlich fragt. Setzt Paket 4
aus Verbesserungen_02.md um.

Beide Wege an DERSELBEN Instanz (Kraftwerkspark, 500 MW gesicherte Zusage):
analytisch als Second-Order-Cone-Bedingung (CLARABEL) und szenariobasiert als
Big-M-MILP (SciPy/HiGHS) - beides in einem Prozess, ohne ortools- oder
highspy-Import.

Drei gemessene Befunde:

* Der Mittelwertplan haelt 50,08 %. Kein Fehler, sondern die Definition des
  Erwartungswerts.
* Sicherheit ist konvex bepreist: 56.289 EUR je Prozentpunkt auf dem Weg zu
  80 %, 253.848 EUR zwischen 95 und 99 % - das 4,5-fache. Das Programm
  rechnet die Tabelle selbst aus, statt sie zu behaupten.
* Die Zusage gilt nur fuer die unterstellte Verteilung: Der 95-%-Plan haelt
  gemessen 87,44 %, sobald die Testverteilung eine Kaeltewelle mit
  Dunkelflaute enthaelt, in der alles zugleich einbricht - auch das
  Gaskraftwerk. In einer reinen Normalwelt liefert derselbe Plan 94,97 %.

Zwei eigene Fehlgriffe, beide durch Messen aufgefallen und korrigiert: Die
erste Kostentarierung ergab eine entartete Loesung (alles ins Gaskraftwerk),
womit die Kovarianzmatrix wirkungslos war - und gerade sie begruendet die
Kegelform. Und der erste Kaelteeinbruch traf nur Wind und Sonne; der SOC-Plan
hatte die ohnehin herausgehalten und war zufaellig robust, das Argument trug
nicht.

Ehrlich berichtet statt geglaettet: Die Szenariomethode ueberanpasst. Ueber
zwoelf Laeufe (S = 200, 400, 800) lag die tatsaechliche Quote zwischen
93,14 % und 96,71 %, und die Spanne wurde von S = 400 auf 800 wieder
breiter. Beide Solver bestaetigen optimal bei identischen Kosten - echte
Ueberanpassung, kein Solverartefakt. Steht als Warnkasten im Abschnitt.

Die Laufzeitmessung ist aus der Ausgabe entfernt: Eine Wanduhrzeit ist nie
byteidentisch reproduzierbar (2,2 s / 2,3 s zwischen zwei Laeufen) und haette
Regel 4 dauerhaft gebrochen. Danach drei Laeufe zeichengleich, und die
abgedruckte Ausgabe stimmt mit dem Lauf des extrahierten Programms ueberein.

Mitgezogen: Kapitelkopf, Lernziele, Uebersichtstabelle (drei -> vier
Ansaetze), Selbsttest, Zusammenfassung, Vorwort-Programmverzeichnis, eine
neue Uebungsaufgabe und ihre Loesung in Anhang A.

pyproject.toml korrigiert: cvxpy lag in [finance], wird aber von 13
Programmen gebraucht, darunter dreien in diesem Kapitel - jetzt in der
Grundausstattung. Es zieht kein highspy nach, der Solverkonflikt bleibt auf
[large-scale] beschraenkt.

Stand: 293 Abschnitte, 712 Querverweise, 327 Indexmarken, 74 Programme (0
Fehler), 33 pytest-Tests, PDF 725 Seiten.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
dschlueter 2026-09-08 01:57:19 +02:00
commit 6c67e126dd
23 changed files with 9089 additions and 6419 deletions

View file

@ -609,141 +609,146 @@ Alles bereit — Sie können mit dem ersten Kapitel beginnen.</code></pre>
<td><a href="unsicherheit.html#kap-unsicherheit">Kapitel 12</a></td>
</tr>
<tr class="even">
<td><code>Chance_Constraints.py</code></td>
<td>Zusage „mit 95 % Sicherheit“, SOC und Big-M</td>
<td><a href="unsicherheit.html#kap-unsicherheit">Kapitel 12</a></td>
</tr>
<tr class="odd">
<td><code>Bellman_Minimalbeispiel.py</code></td>
<td>Rückwärtsinduktion</td>
<td><a href="dynamische-programmierung.html#kap-dynamische-programmierung">Kapitel 13</a></td>
</tr>
<tr class="odd">
<tr class="even">
<td><code>Mehrziel_Pareto.py</code></td>
<td>Pareto-Front, ε-Constraint, Gewichtslücke</td>
<td><a href="mehrziel.html#kap-mehrziel">Kapitel 14</a></td>
</tr>
<tr class="even">
<tr class="odd">
<td><code>Predict_then_Optimize.py</code></td>
<td>MSE gegen Entscheidungskosten</td>
<td><a href="prognose.html#kap-prognose">Kapitel 15</a></td>
</tr>
<tr class="odd">
<tr class="even">
<td><code>Strukturbruecke.py</code></td>
<td>Derselbe Code über Werkstatt und Depot</td>
<td><a href="bruecke.html#kap-bruecke">Kapitel 16</a></td>
</tr>
<tr class="even">
<tr class="odd">
<td><code>Kraftwerkseinsatz.py</code></td>
<td>Unit Commitment unter Windunsicherheit</td>
<td><a href="supplychain.html#kap-supplychain">Kapitel 17</a></td>
</tr>
<tr class="odd">
<tr class="even">
<td><code>Mehrperiodige_Order_Execution.py</code></td>
<td>Almgren-Chriss</td>
<td><a href="dynamische-programmierung.html#kap-dynamische-programmierung">Kapitel 13</a></td>
</tr>
<tr class="even">
<tr class="odd">
<td><code>Renditen_Vergleich.py</code></td>
<td>Diskret vs. logarithmisch</td>
<td><a href="finanzdaten.html#kap-finanzdaten">Kapitel 18</a></td>
</tr>
<tr class="odd">
<tr class="even">
<td><code>Schaetzrauschen_Demo.py</code></td>
<td>Error-Maximizer messen</td>
<td><a href="finanzdaten.html#kap-finanzdaten">Kapitel 18</a></td>
</tr>
<tr class="even">
<tr class="odd">
<td><code>Finanzdaten_Ledoit_Wolf.py</code></td>
<td>Datenpipeline, Shrinkage</td>
<td><a href="finanzdaten.html#kap-finanzdaten">Kapitel 18</a></td>
</tr>
<tr class="odd">
<tr class="even">
<td><code>Kovarianz_Falle.py</code></td>
<td>Singuläre Kovarianz, Error-Maximizer</td>
<td><a href="finanzdaten.html#kap-finanzdaten">Kapitel 18</a></td>
</tr>
<tr class="even">
<tr class="odd">
<td><code>Markowitz_CVXPY.py</code></td>
<td>GMV, Max Sharpe, Frontier</td>
<td><a href="markowitz.html#kap-markowitz">Kapitel 19</a></td>
</tr>
<tr class="odd">
<tr class="even">
<td><code>Diversifikation_Demo.py</code></td>
<td>Korrelation und Portfoliorisiko</td>
<td><a href="markowitz.html#kap-markowitz">Kapitel 19</a></td>
</tr>
<tr class="even">
<tr class="odd">
<td><code>Renditeschaetzung_Falle.py</code></td>
<td>Schätzfehler in erwarteten Renditen</td>
<td><a href="markowitz.html#kap-markowitz">Kapitel 19</a></td>
</tr>
<tr class="odd">
<tr class="even">
<td><code>VaR_CVaR_Demo.py</code></td>
<td>Fat Tails, Subadditivität</td>
<td><a href="cvar.html#kap-cvar">Kapitel 20</a></td>
</tr>
<tr class="even">
<tr class="odd">
<td><code>CVaR_Portfolio.py</code></td>
<td>CVaR mit Reibung</td>
<td><a href="cvar.html#kap-cvar">Kapitel 20</a></td>
</tr>
<tr class="odd">
<tr class="even">
<td><code>QuantitativeTradingEngine.py</code></td>
<td>Walk-Forward-Backtest</td>
<td><a href="handelsmaschine.html#kap-handelsmaschine">Kapitel 21</a></td>
</tr>
<tr class="even">
<tr class="odd">
<td><code>Backtest_Fallen.py</code></td>
<td>Fünf Selbsttäuschungen</td>
<td><a href="handelsmaschine.html#kap-handelsmaschine">Kapitel 21</a></td>
</tr>
<tr class="odd">
<tr class="even">
<td><code>Data_Snooping.py</code></td>
<td>Bestes aus N Versuchen auf Rauschen</td>
<td><a href="handelsmaschine.html#kap-handelsmaschine">Kapitel 21</a></td>
</tr>
<tr class="even">
<tr class="odd">
<td><code>Infeasibility_Diagnose.py</code></td>
<td>Notfallplan statt Fehler</td>
<td><a href="praxisfallen.html#kap-praxisfallen">Kapitel 22</a></td>
</tr>
<tr class="odd">
<tr class="even">
<td><code>Erklaerbarkeit.py</code></td>
<td>Constraint-Trace, Was-wäre-wenn</td>
<td><a href="praxisfallen.html#kap-praxisfallen">Kapitel 22</a></td>
</tr>
<tr class="even">
<tr class="odd">
<td><code>Betriebsueberwachung.py</code></td>
<td>Status, Gap und Zeitausschöpfung</td>
<td><a href="praxisfallen.html#kap-praxisfallen">Kapitel 22</a></td>
</tr>
<tr class="odd">
<tr class="even">
<td><code>or_kern.py</code></td>
<td>Gemeinsamer Unterbau: Domäne, Status, Prüfung</td>
<td><a href="praxisfallen.html#kap-praxisfallen">Kapitel 22</a></td>
</tr>
<tr class="even">
<tr class="odd">
<td><code>Solverwechsel_CPSAT_HiGHS.py</code></td>
<td>Derselbe Fall in zwei Solvern</td>
<td><a href="praxisfallen.html#kap-praxisfallen">Kapitel 22</a></td>
</tr>
<tr class="odd">
<tr class="even">
<td><code>test_or_kern.py</code></td>
<td>Testsuite für ein Optimierungsmodell</td>
<td><a href="testing.html#kap-testing">Kapitel 23</a></td>
</tr>
<tr class="even">
<tr class="odd">
<td><code>Mutationstest.py</code></td>
<td>Findet die Lücken der eigenen Tests</td>
<td><a href="testing.html#kap-testing">Kapitel 23</a></td>
</tr>
<tr class="odd">
<tr class="even">
<td><code>Benchmark_Skalierung.py</code></td>
<td>Aufbau gegen Lösen, vier Bibliotheken</td>
<td><a href="testing.html#kap-testing">Kapitel 23</a></td>
</tr>
<tr class="even">
<tr class="odd">
<td><code>Optimierungsdienst.py</code></td>
<td>Das Modell als HTTP-Dienst</td>
<td><a href="testing.html#kap-testing">Kapitel 23</a></td>
</tr>
<tr class="odd">
<tr class="even">
<td><code>Konfliktsuche.py</code></td>
<td>Deletion Filter: den Widerspruch einkreisen</td>
<td><a href="anhang-fehlerdiagnose.html#anhang-fehlerdiagnose">Anhang C</a></td>