Automatischer Push: 19 Datei(en) geändert

- .vault-tools/plan-kopie/LIESMICH.md
- .vault-tools/plan-kopie/rot_nachweis.py
- .vault-tools/plan-kopie/welle_vergleich.py
- .vault-tools/plan-kopie/welle_vergleich_treiber.py
- .vault-tools/trading-plattform-pruefung/LIESMICH.md
- .vault-tools/trading-plattform-pruefung/angriffe.py
- .vault-tools/trading-plattform-pruefung/browserlauf.py
- .vault-tools/trading-plattform-pruefung/browserlauf_zugang.py
- .vault-tools/trading-plattform-pruefung/c_eigenlauf.py
- .vault-tools/trading-plattform-pruefung/d_eigenlauf.py
- .vault-tools/trading-plattform-pruefung/handelstag_auswertung.py
- .vault-tools/trading-plattform-pruefung/ntfy_probe_server.py
- … und 7 weitere

Erzeugt vom PostToolUse-Hook .vault-tools/auto-push/auto_push.py.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
Pascal MichelandClaude Opus 5 committed 2026-09-19 04:00:01 +02:00
1 parent 371a1f5d2a
commit 395642c480
19 files changed
+1636 -32

No files matched your search

@@ -8,12 +8,23 @@ Beobachtung wie der Weg des Trainings (dieselbe REST-Antwort -> alpaca_json_zu_b
NautilusEnv._beobachtung)? Der Test im Repo baut seine Kerzen aus den Bars selbst und sieht deshalb
keine Abweichung zwischen den zwei Umwandlungen; dieser Lauf nimmt zwei getrennte Wege von derselben
Antwort.
Was es nicht sieht: Beobachtungen mit offener Position (Position und Kontowert kommen im Betrieb vom
Broker), SIP gegen IEX (gemessen in der Vorabmessung), andere Instrumente und Tage.
Zweite Frage (seit 2026-09-18, Prueferbefund zu Teil 10: der erste Teil vergleicht nur position = 0,
kontowert = startkapital, schritte_seit_trade = 0 -- drei der vier Schlusswerte sind dort auf beiden
Seiten Konstanten): Stimmen die vier Schlusswerte auch bei offener Long- und Short-Position, bei einem
Kontowert ungleich dem Startkapital und bei schritte_seit_trade groesser null? Dafuer faehrt die
Umgebung eine feste Aktionsfolge ueber alle fuenf Stufen, und nach jedem Schritt baut der Weg des
Runners seine Beobachtung aus DEMSELBEN Zustand (Position, Kontowert und Zaehler aus der Umgebung
gelesen). Geprueft wird damit die Rechnung des Runners, nicht die Herkunft seines Zustands.
Was es nicht sieht: ob Position und Kontowert im Betrieb richtig vom Broker kommen (Vorzeichen bei
Shorts: erst am Paper-Konto messbar), den Zaehler schritte_seit_trade des Runners selbst (er zaehlt nur
in Entscheidungstakten, todo Teil 10), SIP gegen IEX (gemessen in der Vorabmessung), andere
Instrumente und Tage.
Regressionsnachweis: --sabotage verschiebt einen Schlusskurs um einen Cent und muss mit Exit 2 enden.
--mutant-vorzeichen tauscht die Funktion des Runners gegen eine, die den Betrag der Position nimmt
(ein Vorzeichenfehler im Ziel); der erste Teil bleibt dabei gruen, der zweite muss rot sein.
Aufruf in WSL aus dem Projektordner (dort liegt config/secrets.toml; der Schluessel wird nie ausgegeben):
python pruef_beobachtung_echt.py 2026-09-17 [--sabotage]
python pruef_beobachtung_echt.py 2026-09-17 [--sabotage] [--mutant-vorzeichen]
"""
import dataclasses
@@ -53,6 +64,7 @@ def main() -> int:
return 3
tag = datetime.strptime(sys.argv[1], "%Y-%m-%d").replace(tzinfo=HANDELSZONE)
sabotage = "--sabotage" in sys.argv[2:]
mutant = "--mutant-vorzeichen" in sys.argv[2:]
ende = handelsende(tag)
# Weg des Runners.
@@ -150,10 +162,60 @@ def main() -> int:
if ungleich <= 3:
stellen = np.flatnonzero(soll != ist)[:5]
print(f" ungleich ab Kerze {start}: Stellen {stellen.tolist()}, groesster Abstand {abstand:.3e}")
print(f"Teil 1: {verglichen} Beobachtungen verglichen, {ungleich} ungleich, groesster Abstand {groesste:.3e}")
# Teil 2: Zustand ungleich null. Aktion a heisst Stufe a - MAX_STUFE; die Folge geht ueber
# +2, +1, flach, -2, -1 und haelt dazwischen, damit schritte_seit_trade waechst.
folge = [4, 4, 4, 3, 3, 2, 0, 0, 0, 1, 1, 2]
runner = baue_beobachtung
if mutant:
def runner(fenster_kerzen, *, position, **rest): # noqa: E306 - Mutant: Betrag statt Vorzeichen
return baue_beobachtung(fenster_kerzen, position=abs(position), **rest)
zustand = {"long": 0, "short": 0, "flach": 0, "kontowert_ungleich": 0, "zaehler_groesser_null": 0}
verglichen2 = 0
ungleich2 = 0
groesste2 = 0.0
letzter_start = len(bars) - FENSTER - EPISODE
for start in range(0, letzter_start + 1, max(1, letzter_start // 9)):
env.reset(options={"start_index": start})
for k, aktion in enumerate(folge, 1):
soll, _, beendet, abgeschnitten, _ = env.step(aktion)
position = env._strategie.netto_position()
ist = runner(
kerzen[start + k : start + k + FENSTER],
position=position,
hoechste_position=MAX_STUFE * BASIS,
kontowert=env._kontowert,
startkapital=startkapital,
schritte_seit_trade=env._schritte_seit_trade,
episoden_laenge=EPISODE,
indikator_perioden=PERIODEN,
)
zustand["long" if position > 0 else "short" if position < 0 else "flach"] += 1
zustand["kontowert_ungleich"] += env._kontowert != startkapital
zustand["zaehler_groesser_null"] += env._schritte_seit_trade > 0
verglichen2 += 1
if soll.shape != ist.shape or not np.array_equal(soll, ist):
ungleich2 += 1
abstand = float(np.max(np.abs(soll.astype(np.float64) - ist.astype(np.float64))))
groesste2 = max(groesste2, abstand)
if ungleich2 <= 3:
stellen = np.flatnonzero(soll != ist)[:5]
print(
f" Teil 2 ungleich: Start {start}, Schritt {k}, Position {position}, "
f"Stellen {stellen.tolist()}, groesster Abstand {abstand:.3e}"
)
if beendet or abgeschnitten:
break
env.close()
print(f"{verglichen} Beobachtungen verglichen, {ungleich} ungleich, groesster Abstand {groesste:.3e}")
if ungleich:
print(f"Teil 2: {verglichen2} Beobachtungen verglichen, {ungleich2} ungleich, groesster Abstand {groesste2:.3e}")
print(f" gesehene Zustaende: {zustand}")
if not (zustand["long"] and zustand["short"] and zustand["kontowert_ungleich"] and zustand["zaehler_groesser_null"]):
print("BEFUND: Teil 2 hat nicht jeden Zustand gesehen (long, short, Kontowert ungleich, Zaehler groesser null)")
return 2
if ungleich or ungleich2:
print("BEFUND: die Beobachtung des Runners weicht von der der NautilusEnv ab")
return 2
return 0