You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

4.5 KiB

Portfolio and Risk Model

1. 목적

백테스트에서 포트폴리오/리스크 모델은 전략보다 덜 중요해 보이지만, 실제로는 결과의 분포와 낙폭을 결정하는 핵심입니다.

Phase 4에서는 아래 3가지를 반드시 반영합니다.

  1. per-trade risk budget
  2. portfolio-level exposure / concentration limits
  3. kill-switch style risk guardrails

2. 기본 정책

Phase 0의 risk policy를 그대로 따릅니다. 기본 예시:

  • 거래당 계좌 리스크: 0.25% ~ 0.50%
  • 하루 총 신규 리스크: 1.0% 이하
  • 동시 최대 포지션: 3개
  • 같은 섹터 최대 포지션: 2개
  • 연속 손실 임계치 도달 시 신규 진입 제한

Phase 4 구현은 이 규칙을 config로 표현하되, default는 위 정책을 사용합니다.

3. sizing 모델

3.1 Risk-based sizing

기본 공식:

risk_dollars = equity * per_trade_risk_pct
per_share_risk = entry_price - stop_price
shares = floor(risk_dollars / per_share_risk)

추가 제약:

  • shares * entry_price <= available_cash
  • shares <= max_position_value_pct * equity / entry_price
  • shares는 최소 lot 이상

3.2 Value cap

risk-based sizing이 너무 커질 수 있으므로 별도 상한을 둡니다.

예:

  • single position max gross exposure = 20% equity

3.3 Liquidity cap

무료 데이터 기반 전략은 시가총액/평균거래대금 필터가 있어도, 개별 거래가 지나치게 큰 비중을 차지하지 않도록 cap을 둡니다.

예:

  • position value <= ADV dollar volume의 1% 미만

4. portfolio entry gates

신규 포지션 진입은 아래 순서로 판단합니다.

  1. global kill switch 확인
  2. portfolio max positions 확인
  3. sector max positions 확인
  4. duplicate symbol / issuer check
  5. daily risk budget 확인
  6. available cash / margin proxy 확인
  7. liquidity cap 확인

하나라도 실패하면 skip하고 이유 코드를 남깁니다.

5. stop / target 규칙

5.1 Initial stop

v1 기본:

  • min(reaction_day_low breach rule, atr_multiple rule) 대신
  • 구현 단순화를 위해 config에서 하나만 mandatory로 선택
  • 기본값: reaction_day_low 또는 entry_price - 1.0 * ATR20

주의: Phase 4에서 stop 정의는 Phase 3 label 정의와 충돌하면 안 됩니다.

5.2 Take-profit

기본값:

  • target_1_r_multiple = 1.5
  • target_1_fraction = 0.5

5.3 Trailing stop

기본값:

  • previous_day_low_breach
  • daily bar 근사로 구현

5.4 Time exit

기본값:

  • max_holding_days = 3 or 5
  • 해당 거래일 종가 청산

6. regime filters

포트폴리오 엔진은 레짐이 불리할 때 신규 진입을 줄이거나 막을 수 있어야 합니다.

예시:

  • risk_off면 신규 포지션 수 50% 축소
  • VIX 급등일에는 신규 진입 금지
  • SPY trend down + sector weak면 후보 탈락

이 규칙은 signal ranking 전에 적용할 수도 있고, portfolio allocation 단계에서 gating rule로 적용할 수도 있습니다.

v1에서는 gating rule로 구현하는 편이 단순합니다.

7. drawdown-based controls

백테스트에서도 아래 risk guardrails를 반영합니다.

  • strategy drawdown > X%면 신규 진입 중단
  • rolling loss streak >= N이면 cooldown days 적용
  • daily equity drawdown > Y%면 당일 추가 진입 금지

이 기능은 live paper trading과 동일한 인터페이스로 구현해 두는 것이 좋습니다.

8. cash ledger

기본 백테스터는 margin-like 단순 cash ledger로 충분합니다. 하지만 아래 필드는 명시적으로 유지합니다.

  • cash_available
  • gross_exposure
  • net_exposure
  • reserved_risk_budget
  • unrealized_pnl
  • realized_pnl

나중에 cash account 전용 satellite 전략을 넣을 때 재사용할 수 있어야 합니다.

9. attribution-friendly logging

모든 진입/거절/청산은 아래 정보를 남겨야 합니다.

  • accepted/rejected reason
  • sizing inputs
  • stop distance
  • sector gate result
  • regime gate result
  • portfolio slot usage

그래야 나중에 “전략이 나빴는지, 포트폴리오 제약이 성과를 깎았는지” 구분할 수 있습니다.

10. 추천 config 키

risk:
  per_trade_risk_pct: 0.0035
  max_daily_new_risk_pct: 0.01
  max_positions: 3
  max_positions_per_sector: 2
  max_position_value_pct: 0.20
  max_adv_fraction: 0.01
  cooldown_after_loss_streak: 3
  cooldown_days: 2
exits:
  stop_model: reaction_day_low
  atr_multiple: 1.0
  target_1_r: 1.5
  target_1_fraction: 0.5
  trailing_model: previous_day_low
  max_holding_days: 3
regime:
  block_on_vix_spike: true
  reduce_slots_in_risk_off: true