"""Liest die Antwortformen dreier Alpaca-Endpunkte fuer Paket M (zehn Aktien). Nur lesend, keine Order. Koordinator-Werkzeug, nicht Teil des Repos (entstanden 2026-09-24 nachts). Ausgegeben werden Schluessel, Typen, Seitenmarken und die Handelsfelder der Anlagen (tradable, shortable, easy_to_borrow, fractionable, marginable) -- keine Kontodaten, kein Schluessel. Endpunkte: GET /v2/assets/{symbol} (Handels-API, paper-api) GET /v2/stocks/trades/latest?symbols=... (Daten-API, feed=iex) GET /v2/stocks/bars?symbols=...&timeframe=1Min (Daten-API, feed=iex, Seitenverhalten ueber Symbole) Aufruf (WSL, TRADING_GEHEIMNISSE gesetzt): python alpaca_formen_lesen.py JJJJ-MM-TT SYMBOL [SYMBOL ...] """ import sys import tomllib from pathlib import Path import requests sys.path.insert(0, str(Path.cwd())) from trading import geheimnisse # noqa: E402 HANDEL = "https://paper-api.alpaca.markets" DATEN = "https://data.alpaca.markets" def form(wert, tiefe=0): if isinstance(wert, dict): if tiefe > 1: return "{...}" return "{" + ", ".join(f"{k}: {form(v, tiefe + 1)}" for k, v in list(wert.items())[:14]) + "}" if isinstance(wert, list): return f"[{len(wert)} x {form(wert[0], tiefe + 1) if wert else '-'}]" return type(wert).__name__ def main() -> int: tag, symbole = sys.argv[1], sys.argv[2:] werte = tomllib.loads(geheimnisse.pfad().read_text(encoding="utf-8"))["alpaca"] s = requests.Session() s.trust_env = False s.headers.update({"APCA-API-KEY-ID": werte["key_id"], "APCA-API-SECRET-KEY": werte["secret_key"]}) print("== /v2/assets/{symbol}") for sym in symbole: a = s.get(f"{HANDEL}/v2/assets/{sym}", timeout=20) if a.status_code != 200: print(sym, "HTTP", a.status_code) continue j = a.json() felder = {k: j.get(k) for k in ("symbol", "exchange", "status", "tradable", "shortable", "easy_to_borrow", "fractionable", "marginable")} print(felder) print("Schluessel einer Anlage:", sorted(j.keys()) if symbole else "-") print("== /v2/stocks/trades/latest (gebuendelt)") t = s.get(f"{DATEN}/v2/stocks/trades/latest", params={"symbols": ",".join(symbole), "feed": "iex"}, timeout=20) print("HTTP", t.status_code, "Form:", form(t.json())) trades = t.json().get("trades", {}) print("Symbole mit Trade:", len(trades), "von", len(symbole), "; Felder eines Trades:", sorted(next(iter(trades.values())).keys()) if trades else "-") print("== /v2/stocks/bars (gebuendelt, Seiten)") start, ende = f"{tag}T13:30:00Z", f"{tag}T20:00:00Z" seiten, gesamt, je_symbol, token = 0, 0, {}, None while True: p = {"symbols": ",".join(symbole), "timeframe": "1Min", "start": start, "end": ende, "feed": "iex", "limit": 10000, "adjustment": "raw"} if token: p["page_token"] = token b = s.get(f"{DATEN}/v2/stocks/bars", params=p, timeout=30) if b.status_code != 200: print("HTTP", b.status_code, b.text[:200]) return 1 j = b.json() seiten += 1 if seiten == 1: print("Form erste Seite:", form(j)) for sym, liste in (j.get("bars") or {}).items(): je_symbol[sym] = je_symbol.get(sym, 0) + len(liste) gesamt += len(liste) token = j.get("next_page_token") if not token or seiten > 20: break print("Seiten:", seiten, "Balken gesamt:", gesamt) print("Balken je Symbol:", dict(sorted(je_symbol.items()))) return 0 if __name__ == "__main__": raise SystemExit(main())