Skip to content

strategy: implement Strategy ABC and signal framework#9

Merged
marwinsteiner merged 2 commits intomainfrom
phase-3/strategy-base
Feb 21, 2026
Merged

strategy: implement Strategy ABC and signal framework#9
marwinsteiner merged 2 commits intomainfrom
phase-3/strategy-base

Conversation

@marwinsteiner
Copy link
Copy Markdown
Owner

Summary

Phase 3 Round 1: Strategy ABC and Signal Framework implementation.

  • src/sysls/strategy/base.py -- Strategy ABC (main user extension point) and StrategyContext

    • StrategyContext: provides bus/clock access plus emit_signal() and request_order() convenience methods
    • Strategy ABC: abstract on_market_data(), optional lifecycle hooks (on_start, on_stop, on_fill, on_position), convenience wrappers for signal emission and order requests
    • Constructor injection via StrategyContext (no global state)
  • src/sysls/strategy/signal.py -- Signal model, SignalBook, and combinators

    • Signal: frozen Pydantic model with direction, strength (clamped to [-1.0, 1.0] via model_validator), instrument, strategy_id, timestamp_ns, metadata
    • SignalBook: mutable container tracking latest signal per instrument with optional max_age_seconds for stale signal filtering
    • Combinators: combine_signals_average, combine_signals_majority, combine_signals_weighted
    • Conversion utilities: signal_from_event / signal_to_event for bus event integration
  • 50 tests total (18 base + 32 signal), all passing

  • Full ruff lint + format compliance

  • Zero regressions across the full 472-test suite

Test plan

  • StrategyContext properties (bus, clock accessible)
  • StrategyContext emit_signal publishes SignalEvent on bus
  • StrategyContext request_order creates OrderRequest and publishes OrderSubmitted
  • Strategy init stores attributes correctly
  • Default params is empty dict
  • Lifecycle hooks (on_start, on_stop, on_fill, on_position) are no-ops by default
  • Cannot instantiate Strategy without implementing on_market_data (ABC enforcement)
  • Convenience methods delegate to context correctly
  • Signal model creation, strength clamping, immutability
  • SignalBook CRUD (update, get, remove, clear, contains, len)
  • SignalBook stale signal filtering with max_age_seconds
  • All three combinator functions (average, majority, weighted)
  • Signal/SignalEvent round-trip conversion
  • Full test suite regression check (472 passed, 10 skipped)

Adds the main user extension point for trading strategies:
- StrategyContext: provides bus/clock access and convenience methods
  for emitting signals and requesting orders
- Strategy ABC: abstract on_market_data, optional lifecycle hooks
  (on_start, on_stop, on_fill, on_position), convenience wrappers
- 18 tests covering context, init, lifecycle, abstract enforcement,
  convenience methods, and concrete strategy behavior
Adds the signal framework for expressing and combining trading intentions:
- Signal: frozen Pydantic model with direction, strength (clamped to [-1,1]),
  instrument, strategy_id, timestamp, and metadata
- SignalBook: mutable container tracking latest signal per instrument with
  optional max_age_seconds for stale signal filtering
- Combinators: combine_signals_average, combine_signals_majority,
  combine_signals_weighted for multi-signal aggregation
- Conversion: signal_from_event/signal_to_event for bus integration
- 32 tests covering model creation, clamping, immutability, book CRUD,
  staleness, all combinators, and event round-trips
@marwinsteiner marwinsteiner merged commit 4d1b26b into main Feb 21, 2026
1 check passed
@marwinsteiner marwinsteiner deleted the phase-3/strategy-base branch February 21, 2026 18:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant