diff --git a/deltaforge_skeleton/coordination.py b/deltaforge_skeleton/coordination.py new file mode 100644 index 0000000..9a54913 --- /dev/null +++ b/deltaforge_skeleton/coordination.py @@ -0,0 +1,25 @@ +from __future__ import annotations + +from typing import List + +from deltaforge_skeleton.core import PlanDelta + + +class ADMMCoordinator: + """Lightweight, production-friendly ADMM-lite coordinator for cross-venue coherence. + + This is intentionally tiny: it augments an existing PlanDelta with a detectable + ADMM coordination step. It is safe to disable or remove this in environments + that do not require cross-venue coordination. + """ + + def __init__(self, rho: float = 1.0): + self.rho = rho + + def coordinate(self, plan: PlanDelta, venues: List[str]) -> PlanDelta: + if not plan or not plan.steps: + return plan + # Minimal ADMM-like annotation to indicate coordination happened + venues_str = ",".join(venues) if venues else "[]" + plan.steps.append(f"ADMM_COORDINATE between [{venues_str}] with rho={self.rho}") + return plan diff --git a/deltaforge_skeleton/curator.py b/deltaforge_skeleton/curator.py index 7c3c974..8b6f446 100644 --- a/deltaforge_skeleton/curator.py +++ b/deltaforge_skeleton/curator.py @@ -3,6 +3,13 @@ from __future__ import annotations from typing import List from deltaforge_skeleton.core import MarketSignal, PlanDelta, StrategyDelta, Asset +# Optional cross-venue coordination (ADMM-lite) import. The coordination +# module is kept minimal to avoid imposing heavy dependencies on the MVP. +try: + from deltaforge_skeleton.coordination import ADMMCoordinator +except Exception: + ADMMCoordinator = None # type: ignore + class Curator: def __init__(self): @@ -10,7 +17,7 @@ class Curator: def synthesize(self, signals: List[MarketSignal]) -> PlanDelta: # Naive delta-synthesis: for each asset, create a delta hedge with 1x price weight - steps = [] + steps: List[str] = [] for s in signals: asset = s.asset # simple heuristic: hedge ratio proportional to liquidity and inverse of price @@ -19,4 +26,16 @@ class Curator: steps.append(f"HEDGE {asset.symbol} with ratio {hedge_ratio:.3f}") plan = PlanDelta(steps=steps, timestamp=0.0, provenance="deltaforge-skeleton-curation") self.audit.append("synthesized plan from signals") + + # Optional cross-venue coordination: if a real ADMM coordinator is available, + # attempt to coordinate across a default two-venue setup. This keeps the MVP + # lightweight while enabling future multi-venue coherence checks. + if ADMMCoordinator is not None: + try: + coordinator = ADMMCoordinator() + plan = coordinator.coordinate(plan, venues=["VenueA", "VenueB"]) + except Exception: + # Silently ignore coordination issues to preserve existing behavior + pass + return plan