feat(028-strategy-signals-contrib): add BaseStrategy ABC + StrategySignal TypedDict
This commit is contained in:
parent
fa4d01c23a
commit
c669b37c96
|
|
@ -0,0 +1,49 @@
|
|||
"""Base classes for the quantitative strategy signals framework.
|
||||
|
||||
Based on:
|
||||
Zura Kakushadze and Juan Andrés Serur,
|
||||
"151 Trading Strategies",
|
||||
Palgrave Macmillan, 2018.
|
||||
SSRN: https://ssrn.com/abstract=3247865
|
||||
DOI: 10.1007/978-3-030-02792-6
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from abc import ABC, abstractmethod
|
||||
from typing import Any, Literal
|
||||
|
||||
from typing_extensions import TypedDict
|
||||
|
||||
|
||||
class StrategySignal(TypedDict):
|
||||
"""A single deterministic signal produced by a strategy."""
|
||||
|
||||
name: str
|
||||
ticker: str
|
||||
date: str
|
||||
signal_strength: float # -1.0 (strong bearish) to 1.0 (strong bullish)
|
||||
direction: Literal["bullish", "bearish", "neutral"]
|
||||
detail: str
|
||||
|
||||
|
||||
# Analyst roles that strategies can target
|
||||
Role = Literal["market", "fundamentals", "news", "social", "researcher", "risk"]
|
||||
|
||||
|
||||
class BaseStrategy(ABC):
|
||||
"""Abstract base for all strategy signal generators."""
|
||||
|
||||
# Subclasses must set these
|
||||
name: str = ""
|
||||
roles: list[Role] = []
|
||||
|
||||
@abstractmethod
|
||||
def compute(
|
||||
self, ticker: str, date: str, context: dict[str, Any] | None = None
|
||||
) -> StrategySignal | None:
|
||||
"""Compute a signal for *ticker* on *date*.
|
||||
|
||||
Returns ``None`` when insufficient data is available (graceful fallback).
|
||||
*context* is an optional dict carrying pre-fetched market data.
|
||||
"""
|
||||
Loading…
Reference in New Issue