Summary
ScoringEngine._calculate_kelly_sizing explicitly returns None when historical performance data is absent. That None flows into StrategyRecommendation.position_size, which is typed as float. Any downstream code doing arithmetic on recommendation.position_size (e.g., size * capital) raises TypeError.
Evidence
src/models/scoring_engine.py lines 207-208: return None in _calculate_kelly_sizing when history is empty.
src/models/recommendation_engine.py line 329: position_size=scored_strategy.kelly_size
src/models/recommendation_engine.py line 33: position_size: float — not Optional[float].
Fix
Change the type annotation to Optional[float] and document that None means "position size undetermined". Guard all callers that read position_size numerically.
Summary
ScoringEngine._calculate_kelly_sizingexplicitly returnsNonewhen historical performance data is absent. ThatNoneflows intoStrategyRecommendation.position_size, which is typed asfloat. Any downstream code doing arithmetic onrecommendation.position_size(e.g.,size * capital) raisesTypeError.Evidence
src/models/scoring_engine.pylines 207-208:return Nonein_calculate_kelly_sizingwhen history is empty.src/models/recommendation_engine.pyline 329:position_size=scored_strategy.kelly_sizesrc/models/recommendation_engine.pyline 33:position_size: float— notOptional[float].Fix
Change the type annotation to
Optional[float]and document thatNonemeans "position size undetermined". Guard all callers that readposition_sizenumerically.