Factor-score-driven market risk evaluation: composite score, regime classification, and deployment decisions.
Project description
risk-threshold-engine
A lightweight, zero-dependency Python library that converts factor scores into a market risk regime, deployment decision, and recommended mitigation actions.
Overview
Feed in five 0–100 risk scores (volatility, momentum, breadth, macro, drawdown), get back a structured result telling you whether to deploy capital at full pace, reduce lot sizes, pause, or rebalance.
from risk_threshold_engine import RiskThresholdEngine, FactorScores
engine = RiskThresholdEngine()
scores = FactorScores(
volatility_score=72.0,
momentum_score=60.0,
breadth_score=55.0,
macro_score=65.0,
drawdown_score=50.0,
)
result = engine.evaluate(scores)
print(result.summary())
# [2026-05-01T...] Risk Engine Result
# Composite Score : 61.25 / 100
# Regime : ELEVATED
# Decision : REDUCED_DCA
# ...
Installation
pip install risk-threshold-engine
Or install from source:
git clone https://github.com/BrainScanStudios/risk-threshold-engine.git
cd risk-threshold-engine
pip install -e .
Requirements
Python 3.10+. No external dependencies — only the standard library.
Risk Regimes
| Composite Score | Regime | Default Decision |
|---|---|---|
| 0 – 30 | LOW | FULL_DCA |
| 31 – 55 | MODERATE | REDUCED_DCA |
| 56 – 75 | ELEVATED | REDUCED_DCA / PAUSE* |
| 76 – 100 | SEVERE | REBALANCE |
*ELEVATED switches to PAUSE when the portfolio's cash/bond buffer exceeds 30%.
Default Factor Weights
| Factor | Weight | What it captures |
|---|---|---|
| volatility_score | 25% | Realised vol / VIX signal |
| momentum_score | 20% | Price momentum across assets |
| breadth_score | 15% | Market breadth (advance/decline) |
| macro_score | 20% | Rates, credit spreads, inflation |
| drawdown_score | 20% | Drawdown vs high-water mark |
All weights are configurable. Scores are 0–100 where higher = more risk.
API
RiskThresholdEngine
RiskThresholdEngine(
factor_weights: dict[str, float] | None = None,
ticker_beta: dict[str, float] | None = None,
db_path: str | None = None,
)
factor_weights— Override the default weight map. Must sum to 1.0.ticker_beta— Map of ticker → beta coefficient. When provided, the engine generatesTRIMandOPTIONS_SIGNALactions for high-beta tickers held in the portfolio during elevated/severe regimes.db_path— Optional path to a SQLite file. When set, everyevaluate()call persists results to arisk_engine_resultstable.
evaluate(scores, portfolio=None) -> EngineResult
Runs the full evaluation pipeline.
FactorScores
FactorScores(
volatility_score: float, # 0–100
momentum_score: float, # 0–100
breadth_score: float, # 0–100
macro_score: float, # 0–100
drawdown_score: float, # 0–100
)
All five scores are required and must be in [0, 100]. How you produce them is up to you — any factor scoring module works.
PortfolioState (optional)
PortfolioState(
buffer_pct: float, # cash/short-term bond % of portfolio
cash_usd: float,
positions: dict[str, float], # ticker → market value in USD
)
Passing a PortfolioState enables portfolio-aware decisions (buffer checks, beta-weighted trim candidates, options signals).
EngineResult
| Field | Type | Description |
|---|---|---|
composite_score |
float |
Weighted composite (0–100) |
regime |
RiskRegime |
LOW / MODERATE / ELEVATED / SEVERE |
decision |
DeploymentDecision |
FULL_DCA / REDUCED_DCA / PAUSE / REBALANCE |
actions |
list[MitigationAction] |
Ordered list of recommended actions |
weighted_breakdown |
dict[str, float] |
Per-factor contribution to composite |
notes |
str |
Contextual caveats |
evaluated_at |
str |
ISO 8601 UTC timestamp |
result.to_dict() # fully serialisable dict
result.summary() # human-readable string
Custom Configuration
engine = RiskThresholdEngine(
factor_weights={
"volatility_score": 0.40,
"momentum_score": 0.20,
"breadth_score": 0.10,
"macro_score": 0.20,
"drawdown_score": 0.10,
},
ticker_beta={
"QQQ": 1.20,
"SPY": 1.00,
"TLT": 0.30,
},
db_path="risk_results.db",
)
Development
Clone the repo and set up an isolated environment:
git clone https://github.com/BrainScanStudios/risk-threshold-engine.git
cd risk-threshold-engine
python3 -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -e ".[dev]"
The [dev] extra installs pytest. The library itself has no runtime dependencies beyond the standard library.
pytest
pytest -v # verbose
pytest -k regime # run tests matching a keyword
Project layout
src/
risk_threshold_engine/
__init__.py public API surface
engine.py all core logic lives here
tests/
test_engine.py full test suite
The entire implementation is in engine.py. If you're adding a new action type or regime, the three methods to touch are _build_actions, _decide, and _contextual_notes. If you're changing the scoring model, adjust DEFAULT_FACTOR_WEIGHTS or pass custom weights at construction time.
Submitting changes
- Fork the repository and create a branch from
main. - Add or update tests for any behaviour you change —
pytestmust pass before opening a PR. - Keep the zero-dependency constraint: no new imports outside the standard library.
License
MIT — see LICENSE.
Copyright (c) 2026 Brain Scan Studios
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file risk_threshold_engine-0.1.0.tar.gz.
File metadata
- Download URL: risk_threshold_engine-0.1.0.tar.gz
- Upload date:
- Size: 10.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9cbe1e14f229057b99e9a07b15d7fced3fb9bc5828ba819d496925f93bfff358
|
|
| MD5 |
7efbb6da957a3b249432ad8286ac1a4d
|
|
| BLAKE2b-256 |
d337b5866def2269e059d1a34473f5f3d9a21192bf8357ef12903c25450b9afb
|
File details
Details for the file risk_threshold_engine-0.1.0-py3-none-any.whl.
File metadata
- Download URL: risk_threshold_engine-0.1.0-py3-none-any.whl
- Upload date:
- Size: 9.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
079b8bd5bb269a6d172449299c18147e9bb6b9c1b692e1a8a9cae1172f945b1f
|
|
| MD5 |
1cc5284ca0ce3c64faa1967d6802a494
|
|
| BLAKE2b-256 |
cee2df7b4b1d029f0cfdc46818e53106128b8b863b6b8c044162c1dabea81716
|