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.

Picking a profile

Next