46 lines
1.6 KiB
Python
46 lines
1.6 KiB
Python
from __future__ import annotations
|
|
|
|
from typing import List
|
|
|
|
from .dsl import Asset, MarketSignal, PlanDelta, StrategyDelta
|
|
from .coordinator import ADMMCoordinator
|
|
from .execution import ExecutionEngine
|
|
from .backtester import Backtester
|
|
from .adapters.equity_feed import build_asset as build_equity_asset, get_signals as equity_signals
|
|
from .adapters.options_feed import build_asset as build_option_asset, get_signals as option_signals
|
|
|
|
|
|
def demo_run(now: float) -> dict:
|
|
# Create two assets across two venues as a minimal cross-venue demo
|
|
aapl = build_equity_asset("AAPL")
|
|
aapl_opt = build_option_asset("AAPL_20260120_150C")
|
|
|
|
# Signals (venue A data feed + venue B option data feed)
|
|
sigs: List[MarketSignal] = []
|
|
sigs.extend(equity_signals(now))
|
|
sigs.extend(option_signals(now))
|
|
|
|
# Simple delta plan: two deltas that sum to zero (delta-neutral)
|
|
d1 = StrategyDelta(delta_positions={aapl.symbol: 10, aapl_opt.symbol: -10}, cash_delta=0.0, notes="mv1")
|
|
d2 = StrategyDelta(delta_positions={aapl.symbol: -5, aapl_opt.symbol: 5}, cash_delta=0.0, notes="mv2")
|
|
plan = PlanDelta(actions=[], deltas=[d1, d2], signature="demo-sig-1")
|
|
|
|
# Reconcile plan across venues
|
|
coordinator = ADMMCoordinator()
|
|
reconciled = coordinator.reconcile(plan)
|
|
|
|
# Route via execution engine (latency-aware)
|
|
engine = ExecutionEngine()
|
|
routes = engine.route(reconciled, sigs)
|
|
|
|
# Backtest deterministic PnL
|
|
bt = Backtester(seed=42)
|
|
pnl = bt.replay(sigs, reconciled)
|
|
|
|
return {
|
|
"assets": [aapl.symbol, aapl_opt.symbol],
|
|
"routes": routes,
|
|
"pnl": pnl,
|
|
"signatures": reconciled.signature,
|
|
}
|