4.5 KiB
Portfolio and Risk Model
1. 목적
백테스트에서 포트폴리오/리스크 모델은 전략보다 덜 중요해 보이지만, 실제로는 결과의 분포와 낙폭을 결정하는 핵심입니다.
Phase 4에서는 아래 3가지를 반드시 반영합니다.
- per-trade risk budget
- portfolio-level exposure / concentration limits
- 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_cashshares <= max_position_value_pct * equity / entry_priceshares는 최소 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
신규 포지션 진입은 아래 순서로 판단합니다.
- global kill switch 확인
- portfolio max positions 확인
- sector max positions 확인
- duplicate symbol / issuer check
- daily risk budget 확인
- available cash / margin proxy 확인
- 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.5target_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_availablegross_exposurenet_exposurereserved_risk_budgetunrealized_pnlrealized_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