summaryrefslogtreecommitdiff
path: root/services/strategy-engine
diff options
context:
space:
mode:
authorTheSiahxyz <164138827+TheSiahxyz@users.noreply.github.com>2026-04-02 14:17:43 +0900
committerTheSiahxyz <164138827+TheSiahxyz@users.noreply.github.com>2026-04-02 14:17:43 +0900
commit35aa61c651217663406c9cd6df404f85338b2d68 (patch)
tree9d85dd87e725984d45d7b6bdfef8b316ddfc4ae7 /services/strategy-engine
parent17540c99d5e28576a6642e23d7bd6b297513e2d8 (diff)
style: fix lint and formatting issues across news collector and shared
Diffstat (limited to 'services/strategy-engine')
-rw-r--r--services/strategy-engine/src/strategy_engine/main.py6
-rw-r--r--services/strategy-engine/src/strategy_engine/stock_selector.py13
-rw-r--r--services/strategy-engine/tests/test_stock_selector.py40
3 files changed, 31 insertions, 28 deletions
diff --git a/services/strategy-engine/src/strategy_engine/main.py b/services/strategy-engine/src/strategy_engine/main.py
index e9c96b2..5a30766 100644
--- a/services/strategy-engine/src/strategy_engine/main.py
+++ b/services/strategy-engine/src/strategy_engine/main.py
@@ -126,9 +126,9 @@ async def run() -> None:
anthropic_model=config.anthropic_model,
max_picks=config.selector_max_picks,
)
- tasks.append(asyncio.create_task(
- run_stock_selector(selector, notifier, db, config, log)
- ))
+ tasks.append(
+ asyncio.create_task(run_stock_selector(selector, notifier, db, config, log))
+ )
log.info("stock_selector_enabled", time=config.selector_final_time)
await asyncio.gather(*tasks)
diff --git a/services/strategy-engine/src/strategy_engine/stock_selector.py b/services/strategy-engine/src/strategy_engine/stock_selector.py
index e1f2fe7..268d557 100644
--- a/services/strategy-engine/src/strategy_engine/stock_selector.py
+++ b/services/strategy-engine/src/strategy_engine/stock_selector.py
@@ -4,17 +4,14 @@ import json
import logging
import re
from datetime import datetime, timezone
-from decimal import Decimal
-from typing import Optional
import aiohttp
-import pandas as pd
from shared.alpaca import AlpacaClient
from shared.broker import RedisBroker
from shared.db import Database
from shared.models import OrderSide
-from shared.sentiment_models import Candidate, MarketSentiment, SelectedStock, SymbolScore
+from shared.sentiment_models import Candidate, MarketSentiment, SelectedStock
logger = logging.getLogger(__name__)
@@ -325,7 +322,9 @@ class StockSelector:
ema20 = sum(closes[-20:]) / 20 # simple approximation
current_price = closes[-1]
if current_price <= ema20:
- logger.debug("%s price %.2f <= EMA20 %.2f", candidate.symbol, current_price, ema20)
+ logger.debug(
+ "%s price %.2f <= EMA20 %.2f", candidate.symbol, current_price, ema20
+ )
continue
avg_volume = sum(volumes[:-1]) / max(len(volumes) - 1, 1)
@@ -333,7 +332,9 @@ class StockSelector:
if current_volume <= 0.5 * avg_volume:
logger.debug(
"%s volume %.0f <= 50%% avg %.0f",
- candidate.symbol, current_volume, avg_volume,
+ candidate.symbol,
+ current_volume,
+ avg_volume,
)
continue
diff --git a/services/strategy-engine/tests/test_stock_selector.py b/services/strategy-engine/tests/test_stock_selector.py
index a2f5bca..ff9d09c 100644
--- a/services/strategy-engine/tests/test_stock_selector.py
+++ b/services/strategy-engine/tests/test_stock_selector.py
@@ -1,12 +1,8 @@
"""Tests for stock selector engine."""
-import pytest
-from unittest.mock import AsyncMock, MagicMock, patch
+from unittest.mock import AsyncMock, MagicMock
from datetime import datetime, timezone
-from decimal import Decimal
-from shared.models import OrderSide
-from shared.sentiment_models import SymbolScore, MarketSentiment, SelectedStock, Candidate
from strategy_engine.stock_selector import (
SentimentCandidateSource,
@@ -17,10 +13,12 @@ from strategy_engine.stock_selector import (
async def test_sentiment_candidate_source():
mock_db = MagicMock()
- mock_db.get_top_symbol_scores = AsyncMock(return_value=[
- {"symbol": "AAPL", "composite": 0.8, "news_count": 5},
- {"symbol": "NVDA", "composite": 0.6, "news_count": 3},
- ])
+ mock_db.get_top_symbol_scores = AsyncMock(
+ return_value=[
+ {"symbol": "AAPL", "composite": 0.8, "news_count": 5},
+ {"symbol": "NVDA", "composite": 0.6, "news_count": 3},
+ ]
+ )
source = SentimentCandidateSource(mock_db)
candidates = await source.get_candidates()
@@ -64,15 +62,19 @@ def test_parse_llm_selections_with_markdown():
async def test_selector_blocks_on_risk_off():
mock_db = MagicMock()
- mock_db.get_latest_market_sentiment = AsyncMock(return_value={
- "fear_greed": 15,
- "fear_greed_label": "Extreme Fear",
- "vix": 35.0,
- "fed_stance": "neutral",
- "market_regime": "risk_off",
- "updated_at": datetime.now(timezone.utc),
- })
-
- selector = StockSelector(db=mock_db, broker=MagicMock(), alpaca=MagicMock(), anthropic_api_key="test")
+ mock_db.get_latest_market_sentiment = AsyncMock(
+ return_value={
+ "fear_greed": 15,
+ "fear_greed_label": "Extreme Fear",
+ "vix": 35.0,
+ "fed_stance": "neutral",
+ "market_regime": "risk_off",
+ "updated_at": datetime.now(timezone.utc),
+ }
+ )
+
+ selector = StockSelector(
+ db=mock_db, broker=MagicMock(), alpaca=MagicMock(), anthropic_api_key="test"
+ )
result = await selector.select()
assert result == []