idea159-arbsphere-federated.../idea159_arbsphere_federated.../orchestrator.py

69 lines
2.5 KiB
Python

from __future__ import annotations
"""Two-venue MVP orchestrator for ArbSphere (toy demo).
This script wires two LocalArbProblem instances (representing two venues)
with their corresponding SharedSignals, runs the minimal ADMM step for each,
merges the resulting PlanDelta deterministically via EnergiBridge, and routes
the combined delta through a mock broker adapter to demonstrate end-to-end
flow in a two-venue setting.
"""
from datetime import datetime
from idea159_arbsphere_federated_cross.core import LocalArbProblem, SharedSignals
from idea159_arbsphere_federated_cross.solver import admm_step
from idea159_arbsphere_federated_cross.energi_bridge import EnergiBridge
from idea159_arbsphere_federated_cross.adapters.broker_adapter import MockBrokerAdapter
def build_local_venue(venue: str, asset_pair: str, target_misprice: float, max_exposure: float, latency_budget_ms: int) -> LocalArbProblem:
return LocalArbProblem(
id=f"lp-{venue}-{datetime.utcnow().isoformat()}",
venue=venue,
asset_pair=asset_pair,
target_misprice=target_misprice,
max_exposure=max_exposure,
latency_budget_ms=latency_budget_ms,
)
def build_signals(version: int, price_delta: float, cross_venue_corr: float, liquidity: float) -> SharedSignals:
return SharedSignals(
version=version,
price_delta=price_delta,
cross_venue_corr=cross_venue_corr,
liquidity=liquidity,
)
def run_two_venue_demo() -> None:
# Venue 1
local1 = build_local_venue("NYSE", "AAPL/GOOG", 0.5, 1_000_000.0, 50)
signals1 = build_signals(version=1, price_delta=0.10, cross_venue_corr=0.85, liquidity=1_000_000.0)
delta1 = admm_step(local1, signals1)
# Venue 2
local2 = build_local_venue("LON", "GOOG/AMZN", 0.6, 1_000_000.0, 60)
signals2 = build_signals(version=1, price_delta=0.08, cross_venue_corr=0.80, liquidity=1_200_000.0)
delta2 = admm_step(local2, signals2)
# Deterministic merge of deltas (toy CRDT-like merge)
merged = EnergiBridge.merge_deltas(delta1, delta2)
# Serialize to canonical IR (for adapters)
ir = EnergiBridge.to_ir(local1, signals1, delta=merged)
print("Canonical IR payload:")
print(ir)
# Route to a mock broker to demonstrate end-to-end flow
broker = MockBrokerAdapter()
ack = broker.consume(merged) # type: ignore[arg-type]
print("Broker acknowledged delta. Actions:", merged.actions)
print("DeltaID:", merged.delta_id)
print("Completed two-venue demo at", datetime.utcnow().isoformat())
if __name__ == "__main__":
run_two_venue_demo()