build(agent): molt-y#23e5c8 iteration
This commit is contained in:
parent
644542c229
commit
b51b3fdc22
|
|
@ -9,6 +9,14 @@ Overview
|
||||||
- Minimal deterministic backtester and a toy execution adapter.
|
- Minimal deterministic backtester and a toy execution adapter.
|
||||||
- MVP runs in a small two-asset, two-venue scenario demonstrating delta-hedges and cross-venue spreads.
|
- MVP runs in a small two-asset, two-venue scenario demonstrating delta-hedges and cross-venue spreads.
|
||||||
|
|
||||||
|
Enhancements (as of this iteration)
|
||||||
|
- DSL sketch for StrategyDelta, Asset, MarketSignal, PlanDelta to support plug-and-play adapters.
|
||||||
|
- Lightweight ADMM-lite coordination with a shadow-fallback solver to handle disconnects gracefully.
|
||||||
|
- Minimal cross-venue execution router (ExecutionRouter) to illustrate latency/fees-aware routing.
|
||||||
|
- Two starter adapters (equity feed and options feed) that feed the canonical DSL and backtester.
|
||||||
|
- Deterministic backtesting for reproducible hedges.
|
||||||
|
- Documentation artifacts including dsl_sketch.md to guide future extensions.
|
||||||
|
|
||||||
What’s included
|
What’s included
|
||||||
- Python package deltaforge_mvp with core DSL scaffolds and demo flow.
|
- Python package deltaforge_mvp with core DSL scaffolds and demo flow.
|
||||||
- Adapters: deltaforge_mvp/adapters/equity_feed.py, deltaforge_mvp/adapters/options_feed.py
|
- Adapters: deltaforge_mvp/adapters/equity_feed.py, deltaforge_mvp/adapters/options_feed.py
|
||||||
|
|
|
||||||
|
|
@ -3,3 +3,4 @@ Expose lightweight APIs for a tiny cross-venue hedging engine scaffold.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from .core import StrategyDelta, Asset, MarketSignal, PlanDelta # re-export for convenience
|
from .core import StrategyDelta, Asset, MarketSignal, PlanDelta # re-export for convenience
|
||||||
|
from .execution import ExecutionRouter # lightweight router for multi-venue dispatch (experimental)
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
"""ADMM-lite style coordination skeleton for cross-venue coherence."""
|
"""ADMM-lite style coordination skeleton for cross-venue coherence."""
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from typing import List
|
from typing import List, Optional
|
||||||
|
|
||||||
from deltaforge_mvp.core import PlanDelta, StrategyDelta
|
from deltaforge_mvp.core import PlanDelta, StrategyDelta
|
||||||
|
|
||||||
|
|
@ -27,3 +27,31 @@ class CentralCurator:
|
||||||
for p in plans:
|
for p in plans:
|
||||||
merged.extend(p.deltas)
|
merged.extend(p.deltas)
|
||||||
return PlanDelta(deltas=merged, venue=None, author="curator")
|
return PlanDelta(deltas=merged, venue=None, author="curator")
|
||||||
|
|
||||||
|
def enforce_with_fallback(self, plans: List[PlanDelta], fallback: Optional["ShadowFallback"] = None) -> PlanDelta:
|
||||||
|
"""Enforce cross-venue constraints with optional shadow/fallback strategy.
|
||||||
|
|
||||||
|
If there are no plans to enforce, and a fallback is provided, use the
|
||||||
|
fallback to produce a safe delta plan. Otherwise, fall back to the standard
|
||||||
|
enforcement path.
|
||||||
|
"""
|
||||||
|
if not plans and fallback is not None:
|
||||||
|
return fallback.propose_safe(plans)
|
||||||
|
return self.enforce(plans)
|
||||||
|
|
||||||
|
|
||||||
|
class ShadowFallback:
|
||||||
|
"""Lightweight shadow/fallback solver to propose safe deltas when disconnected."""
|
||||||
|
def propose_safe(self, signals) -> PlanDelta:
|
||||||
|
# If signals is a list of StrategyDelta, create a corresponding zero-delta plan
|
||||||
|
deltas: List[StrategyDelta] = []
|
||||||
|
# Normalize: extract StrategyDelta items whether the input contains StrategyDelta or PlanDelta
|
||||||
|
items: List[StrategyDelta] = []
|
||||||
|
for s in signals:
|
||||||
|
if isinstance(s, PlanDelta):
|
||||||
|
items.extend(s.deltas)
|
||||||
|
elif isinstance(s, StrategyDelta):
|
||||||
|
items.append(s)
|
||||||
|
for st in items:
|
||||||
|
deltas.append(StrategyDelta(asset=st.asset, delta=0.0, timestamp=0.0))
|
||||||
|
return PlanDelta(deltas=deltas, venue=None, author="shadow-fallback")
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,40 @@
|
||||||
|
DeltaForge DSL Sketch (MVP)
|
||||||
|
==========================
|
||||||
|
|
||||||
|
Goal
|
||||||
|
- Provide a human- and machine-readable description of hedging objectives, mapped to canonical assets and market signals.
|
||||||
|
|
||||||
|
Core concepts
|
||||||
|
- StrategyDelta: a local delta/vega/gamma adjustment for a single Asset.
|
||||||
|
- Asset: canonical representation (equity, option, or future).
|
||||||
|
- MarketSignal: observed market attributes for an Asset.
|
||||||
|
- PlanDelta: an incremental, auditable collection of StrategyDelta blocks authored by a solver.
|
||||||
|
|
||||||
|
Canonical representations
|
||||||
|
- Asset can be one of:
|
||||||
|
- equity: { type: 'equity', symbol: 'AAPL' }
|
||||||
|
- option: { type: 'option', underlying: 'AAPL', strike: 150, expires: 'YYYY-MM-DD' }
|
||||||
|
- future: { type: 'future', symbol: 'ES', expires: 'YYYY-MM-DD' }
|
||||||
|
- StrategyDelta fields:
|
||||||
|
- asset: Asset
|
||||||
|
- delta: float
|
||||||
|
- vega: float
|
||||||
|
- gamma: float
|
||||||
|
- target_pnl: optional float
|
||||||
|
- max_order_size: float
|
||||||
|
- timestamp: float
|
||||||
|
|
||||||
|
PlanDelta fields:
|
||||||
|
- deltas: List[StrategyDelta]
|
||||||
|
- confidence: float
|
||||||
|
- venue: optional str
|
||||||
|
- author: str
|
||||||
|
- timestamp: float
|
||||||
|
- signature: optional str
|
||||||
|
|
||||||
|
Adapters and translation
|
||||||
|
- Adapters translate venue-specific messages into StrategyDelta objects.
|
||||||
|
- The canonical PlanDelta is consumed by a central curator to enforce cross-venue constraints.
|
||||||
|
|
||||||
|
Notes
|
||||||
|
- This is a design sketch for the MVP; concrete serialization formats and protocol messages can be built atop this structure.
|
||||||
|
|
@ -0,0 +1,43 @@
|
||||||
|
"""Lightweight cross-venue execution router (experimental)."""
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from typing import List, Optional
|
||||||
|
|
||||||
|
from deltaforge_mvp.core import PlanDelta
|
||||||
|
|
||||||
|
|
||||||
|
class ExecutionRouter:
|
||||||
|
"""Simple round-robin routing of a PlanDelta to available venues.
|
||||||
|
|
||||||
|
This is a tiny, self-contained shim that demonstrates how a real executor
|
||||||
|
would dispatch plan deltas to venue adapters with latency/fees metadata.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, venues: Optional[List[str]] = None):
|
||||||
|
self.venues = venues or []
|
||||||
|
self._idx = 0
|
||||||
|
|
||||||
|
def route(self, plan: PlanDelta) -> dict:
|
||||||
|
"""Route the given plan to a venue (or no venue if unknown).
|
||||||
|
|
||||||
|
Returns a dict with routing metadata that downstream systems can consume.
|
||||||
|
"""
|
||||||
|
if not self.venues:
|
||||||
|
return {"routed": False, "reason": "no_venues_configured"}
|
||||||
|
|
||||||
|
venue = self.venues[self._idx % len(self.venues)]
|
||||||
|
self._idx += 1
|
||||||
|
# Attach simple routing metadata to the plan (clone-like behavior)
|
||||||
|
routed = PlanDelta(
|
||||||
|
deltas=plan.deltas,
|
||||||
|
confidence=plan.confidence if hasattr(plan, "confidence") else 1.0,
|
||||||
|
venue=venue,
|
||||||
|
author=plan.author,
|
||||||
|
timestamp=plan.timestamp,
|
||||||
|
signature=plan.signature,
|
||||||
|
)
|
||||||
|
return {
|
||||||
|
"routed": True,
|
||||||
|
"venue": venue,
|
||||||
|
"plan": routed,
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue