42 lines
1.8 KiB
Python
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)
|