# Phase 6 아키텍처 — Paper Trading & Live Execution

## 1. 목적

Phase 6의 목적은 Phase 4의 백테스트 신호와 Phase 5의 overlay 결과를 **실제 주문 가능한 execution plan**으로 변환하고,
이를 **paper trading**에서 충분히 검증한 뒤 **small-capital live execution**으로 이행할 수 있는 운영 레이어를 구현하는 것입니다.

핵심은 다음과 같습니다.

- 전략 신호 생성과 주문 실행을 분리한다.
- 실행 시스템은 신호를 맹신하지 않고 별도의 risk guard를 통과한 주문만 보낸다.
- paper/live의 코드 경로를 최대한 동일하게 유지한다.
- 실행 실패, 네트워크 장애, 브로커 지연, 부분체결, 재시작을 모두 가정한다.

## 2. 상위 구성

```text
signal pipeline (Phase 2~5)
  -> candidate store
  -> order planner
  -> risk guard
  -> approval gate (optional)
  -> broker adapter
  -> execution event bus
  -> position manager
  -> reconciliation loop
  -> alerts / blotter / dashboard
```

### 2.1 구성 요소

#### candidate reader
- Phase 4/5 산출물에서 실행 가능한 후보를 읽는다.
- 후보는 `trade_date`, `symbol`, `side`, `entry_window`, `planned_stop`, `planned_time_exit`, `score`, `portfolio_bucket`을 가져야 한다.

#### order planner
- 후보를 실제 주문 단위로 변환한다.
- sizing 결과, 주문 타입, limit/stop 가격, TTL, submission window를 계산한다.
- planner는 브로커 API를 직접 호출하지 않는다.

#### risk guard
- 계좌 기준, 종목 기준, 전략 기준, 운영 기준 제한을 체크한다.
- pre-trade 단계에서만 끝나지 않고 in-trade/post-trade 검사도 포함한다.

#### approval gate
- human-in-the-loop가 필요한 초기 운영 모드용 모듈이다.
- 승인/거절/수정 요청을 ticket 기반으로 기록한다.

#### broker adapter
- 최소 인터페이스만 노출한다.
- submit, cancel, replace, fetch order, fetch positions, fetch fills, heartbeat.
- Phase 6의 기본 reference broker는 Alpaca paper이다. live 지원은 adapter 수준에서 optional로 둔다.

#### execution event bus
- 주문 제출 결과, 체결, 취소, 거부, 연결 장애, 재동기화 이벤트를 canonical event로 변환한다.
- 내부 상태머신은 브로커별 raw payload가 아니라 canonical event를 소비한다.

#### position manager
- 실행 포지션, 평균단가, 남은 수량, stop 상태, time exit 상태를 관리한다.
- 백테스터와 동일한 청산 규칙을 실전용으로 근사 적용한다.

#### reconciliation loop
- 주기적으로 브로커 상태와 내부 상태를 비교한다.
- 누락 이벤트, 중복 체결, orphan order, stale position을 탐지한다.

## 3. 실행 모드

### 3.1 dry-run mode
- 주문을 브로커에 보내지 않는다.
- order plan과 risk decision만 생성한다.
- 모든 알림/로그/리포트는 동일하게 생성한다.
- Phase 6 초반 개발 단계의 기본 모드다.

### 3.2 paper mode
- broker paper endpoint에만 주문을 보낸다.
- 체결과 취소 이벤트를 실시간으로 소비한다.
- 운영 프로세스 검증과 상태머신 검증용이다.

### 3.3 live mode
- 실제 주문을 보낸다.
- 기본은 human approval required.
- auto mode는 충분한 paper 성과와 운영 안정성 확인 후에만 허용한다.

## 4. 세션 기준 실행 타임라인

### T-1 (전일 종가 후)
- 최종 candidate snapshot 확정
- overlay score 반영 완료
- order plan preview 생성
- 리스크 및 자금 사용 가능성 점검

### T (장 시작 전)
- broker/account health check
- market calendar / holiday / half-day 확인
- latest candidate consistency check
- approval mode일 경우 주문 티켓 생성

### T (장중)
- entry window 도달 시 주문 제출
- fill / partial fill / reject / cancel 이벤트 처리
- intraday risk guard 점검
- 일일 손실 또는 시스템 장애 발생 시 신규 주문 중단

### T (장 종료 직전/후)
- time exit 대상 주문 처리
- 종가 기반 상태 업데이트
- blotter / execution summary / reconciliation 수행

## 5. 상태 저장 원칙

상태는 메모리에만 두지 않는다. 아래는 반드시 durable storage에 기록한다.

- candidate snapshot id
- order plan id
- approval ticket
- client_order_id
- broker_order_id
- canonical order event
- position snapshot
- exception / operator action

## 6. 공통 코드 경로 원칙

아래 모듈은 dry-run / paper / live에서 공통 코드 경로를 사용해야 한다.

- candidate selection input reader
- order planner
- risk guard
- state machine
- blotter generator
- reconciliation core logic

브로커 endpoint 차이는 broker adapter와 credential/config 계층에서만 나뉘어야 한다.

## 7. Phase 4와 연결되는 contract

Phase 4에서 생성한 backtest candidate와 Phase 6에서 실행하는 candidate는 최소한 다음 필드를 공유해야 한다.

- `candidate_id`
- `symbol`
- `side`
- `strategy_id`
- `event_id`
- `trade_date`
- `entry_policy`
- `planned_stop_policy`
- `planned_time_exit_policy`
- `score_total`
- `score_components`
- `sizing_inputs`

Phase 6는 이 contract를 받아 live-specific 필드를 추가한다.

- `execution_session_id`
- `broker_name`
- `broker_account_id`
- `client_order_id`
- `approval_ticket_id`
- `risk_decision`

## 8. 실패에 대비한 설계

Phase 6는 반드시 아래 실패를 정상 흐름으로 가정해야 한다.

- broker websocket disconnect
- HTTP timeout
- duplicate callback
- order accepted 후 fill event 지연
- cancel requested 후 already filled
- replace requested 후 partial fill 선행
- process restart 중 이벤트 손실
- operator가 수동으로 브로커 화면에서 주문을 변경한 경우

이 실패들에 대한 대응은 `state_machine_and_reconciliation.md`에서 구체화한다.
