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:
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
|
||||
|
||||
Reference in new issue
Block a user