Risk Profiles
Conservative, Moderate, Aggressive: preset risk configurations
RiskProfile provides three preset RiskConfig instances so you don’t have to configure every risk layer from scratch. Start with a profile, override what you need.
Presets
python
from horizon.risk import RiskProfile
conservative = RiskProfile.conservative()
moderate = RiskProfile.moderate()
aggressive = RiskProfile.aggressive()
Conservative
python
RiskConfig(
per_order=OrderRisk(max_order_notional_usd=10_000, rate_limit_per_sec=5),
stop_loss=StopLoss(
per_position_pct=0.05,
trailing_pct=0.03,
cooldown=timedelta(hours=1),
),
drawdown=[
DrawdownGuard(daily_pct=0.03, action=HaltNew),
DrawdownGuard(weekly_pct=0.07, action=ReduceHalf),
DrawdownGuard(monthly_pct=0.15, action=Flatten),
],
margin=MarginGuard(warn_at_utilization=0.75, reduce_at_utilization=0.85),
kill_switch=KillSwitch(
auto_trigger_on=[PortfolioDrawdownEvent(threshold=0.20)]
),
max_gross_leverage=1.0,
)
- Stops. 5% per position with 3% trailing, 1-hour cooldown
- Drawdown: daily 3% / weekly 7% / monthly 15%
- Margin: warn at 75%, reduce at 85%
- Kill switch: fires at 20% total drawdown
- Leverage: capped at 1.0× (no margin)
Use for capital that’s sensitive to drawdown. institutional mandates, retirement accounts, conservative investors.
Moderate
python
RiskConfig(
per_order=OrderRisk(max_order_notional_usd=25_000, rate_limit_per_sec=10),
stop_loss=StopLoss(
per_position_pct=0.10,
trailing_pct=0.05,
cooldown=timedelta(minutes=30),
),
drawdown=[
DrawdownGuard(daily_pct=0.05, action=HaltNew),
DrawdownGuard(weekly_pct=0.10, action=ReduceHalf),
DrawdownGuard(monthly_pct=0.20, action=Flatten),
],
margin=MarginGuard(warn_at_utilization=0.80, reduce_at_utilization=0.90),
kill_switch=KillSwitch(
auto_trigger_on=[PortfolioDrawdownEvent(threshold=0.25)]
),
max_gross_leverage=2.0,
)
- Stops. 10% per position with 5% trailing, 30-minute cooldown
- Drawdown: daily 5% / weekly 10% / monthly 20%
- Margin: warn at 80%, reduce at 90%
- Kill switch: fires at 25% total drawdown
- Leverage: up to 2.0×
The sane default for most systematic strategies. Use this unless you have a specific reason to deviate.
Aggressive
python
RiskConfig(
per_order=OrderRisk(max_order_notional_usd=100_000, rate_limit_per_sec=20),
stop_loss=StopLoss(per_position_pct=0.20, trailing_pct=0.10),
drawdown=[
DrawdownGuard(daily_pct=0.10, action=HaltNew),
DrawdownGuard(weekly_pct=0.20, action=ReduceHalf),
DrawdownGuard(monthly_pct=0.35, action=Flatten),
],
margin=MarginGuard(warn_at_utilization=0.90, reduce_at_utilization=0.97),
kill_switch=KillSwitch(
auto_trigger_on=[PortfolioDrawdownEvent(threshold=0.40)]
),
max_gross_leverage=4.0,
)
- Stops. 20% per position with 10% trailing
- Drawdown: daily 10% / weekly 20% / monthly 35%
- Margin: warn at 90%, reduce at 97%
- Kill switch: fires at 40% total drawdown
- Leverage: up to 4.0×
Use only for risk-tolerant capital (personal speculation, hedge fund with drawdown tolerance) and strategies with demonstrated edge.
Overriding fields
python
from horizon.risk import RiskProfile, StopLoss
risk = RiskProfile.moderate().override(
stop_loss=StopLoss(per_position_pct=0.08, trailing_pct=0.04), # tighter stops
max_gross_leverage=1.5, # lower than default
)
RiskConfig.override(**kwargs) returns a copy with the specified fields replaced. The original profile is unchanged.