deltaforge-real-time-cross-.../tests/test_basic_flow.py

42 lines
1.8 KiB
Python

import math
from datetime import datetime
from deltaforge.dsl import Asset, MarketSignal, LocalArbProblem, SharedSignals, PlanDelta
from deltaforge.curator import reconcile
from deltaforge.adapters.equity_feed import generate_signal
from deltaforge.adapters.options_feed import generate_signal as opt_signal
from deltaforge.execution import ExecutionEngine
from deltaforge.backtester import backtest
def test_end_to_end_basic_flow():
# Define two assets (two venues)
a1 = Asset(symbol="AAPL", asset_type="equity", venue="venueA")
a2 = Asset(symbol="SPY", asset_type="equity", venue="venueB")
# Generate signals from adapters
s1 = MarketSignal(asset=a1, timestamp=datetime.utcnow(), price=150.0, source="equity_feed")
s2 = MarketSignal(asset=a2, timestamp=datetime.utcnow(), price=400.0, source="equity_feed")
signals = SharedSignals(version=1, signals=[s1, s2], privacy_tag="public")
# Local arb problem per venue
arb1 = LocalArbProblem(id="arb-venueA", venue="venueA", assets=[a1], objective="delta-hedge")
arb2 = LocalArbProblem(id="arb-venueB", venue="venueB", assets=[a2], objective="delta-hedge")
plan = PlanDelta(delta={"AAPL": -0.5, "SPY": 0.5}, timestamp=datetime.utcnow(), author="tester", contract_id="ct-001")
# Curator reconciles plan across venues
reconciled = reconcile(signals, [arb1, arb2], plan)
# Basic execution routing (toy)
engine = ExecutionEngine(venues=["venueA", "venueB"])
venue_map = {"AAPL": "venueA", "SPY": "venueB"}
exec_res = engine.route(reconciled.delta, venue_map)
assert exec_res.status == "ok"
# Backtest deterministically
bt = backtest(reconciled.delta, initial_capital=100000.0)
assert isinstance(bt.pnl, float)
# PnL should be deterministic given the same inputs
assert math.isfinite(bt.pnl)