56 lines
1.7 KiB
Python
56 lines
1.7 KiB
Python
from crossvenue_arbx.bridge import EnergiBridge
|
|
from crossvenue_arbx.core import LocalArbProblem, SharedSignals, PlanDelta
|
|
|
|
|
|
def test_to_catopt_basic_structure():
|
|
problem = LocalArbProblem(
|
|
id="venue1-p1",
|
|
venue="Venue1",
|
|
assets=["AAPL", "MSFT"],
|
|
target_misprice=0.001,
|
|
max_exposure=100000.0,
|
|
latency_budget=0.1,
|
|
)
|
|
signals = SharedSignals(
|
|
version=1,
|
|
price_delta_by_asset={"AAPL": 0.001, "MSFT": -0.0007},
|
|
cross_corr={("AAPL", "MSFT"): 0.8},
|
|
liquidity_estimates={"AAPL": 1.0, "MSFT": 1.2},
|
|
)
|
|
|
|
bridge = EnergiBridge()
|
|
catopt = bridge.to_catopt(problem, signals)
|
|
|
|
# Basic structure checks
|
|
assert isinstance(catopt, dict)
|
|
assert "version" in catopt
|
|
assert catopt["version"] >= 1
|
|
assert "objects" in catopt
|
|
objs = catopt["objects"]
|
|
assert "LocalArbProblem" in objs
|
|
assert objs["LocalArbProblem"]["venue"] == "Venue1"
|
|
assert "SharedSignals" in objs
|
|
assert objs["SharedSignals"]["version"] == 1
|
|
|
|
|
|
def test_to_catopt_with_plan_delta_round_trip():
|
|
problem = LocalArbProblem(
|
|
id="venue1-p1",
|
|
venue="Venue1",
|
|
assets=["AAPL"],
|
|
target_misprice=0.001,
|
|
max_exposure=100000.0,
|
|
latency_budget=0.1,
|
|
)
|
|
signals = SharedSignals(version=2, price_delta_by_asset={"AAPL": 0.001})
|
|
plan = PlanDelta(
|
|
delta_actions=[{"from_venue": "Venue1", "to_venue": "Venue2", "asset": "AAPL", "size": 1.0, "time": 2.0}],
|
|
timestamp=2.0,
|
|
contract_id=problem.fingerprint(),
|
|
)
|
|
|
|
catopt = EnergiBridge.to_catopt(problem, signals, plan)
|
|
decoded = EnergiBridge.from_catopt(catopt)
|
|
|
|
assert decoded["plan_delta_ref"]["contract_id"] == problem.fingerprint()
|