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.
|
||||
- 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
|
||||
- Python package deltaforge_mvp with core DSL scaffolds and demo flow.
|
||||
- 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 .execution import ExecutionRouter # lightweight router for multi-venue dispatch (experimental)
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
"""ADMM-lite style coordination skeleton for cross-venue coherence."""
|
||||
from __future__ import annotations
|
||||
|
||||
from typing import List
|
||||
from typing import List, Optional
|
||||
|
||||
from deltaforge_mvp.core import PlanDelta, StrategyDelta
|
||||
|
||||
|
|
@ -27,3 +27,31 @@ class CentralCurator:
|
|||
for p in plans:
|
||||
merged.extend(p.deltas)
|
||||
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