idea105-deltatrace/deltatrace/demo.py

72 lines
2.6 KiB
Python

"""Demo: end-to-end DeltaTrace pipeline.
Generates synthetic market data, builds an event graph,
replays it deterministically, and produces a signed audit log.
"""
from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PrivateKey
from .adapters import FIXFeedAdapter, SandboxExchangeAdapter
from .audit_log import AuditLog
from .event_graph import EventGraph, EventType
from .replay_engine import ReplayEngine
def main() -> None:
# 1. Setup
graph = EventGraph()
fix_adapter = FIXFeedAdapter()
sandbox = SandboxExchangeAdapter(fill_rate=1.0, latency_ms=0.1)
key = Ed25519PrivateKey.generate()
audit = AuditLog(key)
# 2. Ingest FIX market data
fix_msg = {"35": "W", "55": "AAPL", "bid": "185.50", "ask": "185.55", "44": "185.52", "38": "1000"}
tick_events = fix_adapter.ingest(fix_msg)
for ev in tick_events:
graph.add_event(ev)
# 3. Generate signal from tick
from .event_graph import Event
signal = Event.create(EventType.SIGNAL, {"strategy": "momentum", "direction": "buy", "strength": 0.85})
graph.add_event(signal)
graph.add_edge(tick_events[0].id, signal.id, label="tick->signal")
# 4. Plan delta
plan = Event.create(EventType.PLAN_DELTA, {"action": "buy", "symbol": "AAPL", "qty": 500, "limit": 185.55})
graph.add_event(plan)
graph.add_edge(signal.id, plan.id, label="signal->plan")
# 5. Risk check
risk = Event.create(EventType.RISK_CHECK, {"check": "position_limit", "result": "pass", "exposure": 92750})
graph.add_event(risk)
graph.add_edge(plan.id, risk.id, label="plan->risk_check")
# 6. Order via sandbox exchange
order_events = sandbox.ingest({"type": "order", "symbol": "AAPL", "price": 185.55, "qty": 500, "side": "buy"})
for ev in order_events:
graph.add_event(ev)
graph.add_edge(risk.id, order_events[0].id, label="risk->order")
if len(order_events) > 1:
graph.add_edge(order_events[0].id, order_events[1].id, label="order->fill")
# 7. Audit log
for ev in graph.topological_order():
audit.append(ev.id, f"processed:{ev.event_type.value}", ev.payload)
# 8. Replay
engine = ReplayEngine()
result = engine.replay(graph)
# 9. Output
print(f"Events in graph: {len(graph.events)}")
print(f"Edges: {len(graph.edges)}")
print(f"Replay: {result.events_replayed} events, {result.total_latency_ns / 1e6:.2f}ms span")
print(f"Fidelity: {result.fidelity_score}")
print(f"Audit entries: {len(audit.entries)}")
print(f"Audit chain valid: {audit.verify()}")
if __name__ == "__main__":
main()