# 02. 알고리즘 리팩터링·고도화 기준

## 1. 생산 모델 경계

생산 엔진은 수익률 최대화 함수가 아니라 다음의 순서가 보존된 **결정 상태기계**다.

```text
HARD_IMPAIRMENT
  → PORTFOLIO_SURVIVAL
  → DYNAMIC_PROFIT_FLOOR
  → CONCENTRATION_LIQUIDITY
  → OPPORTUNITY_COST
  → REENTRY_OPTION
```

상위 정책이 행동을 결정하면 하위 점수는 이를 상쇄하지 못한다. 모든 정책은 `PolicyId`, 입력 `EvidenceId`, `ModelVersion`, `ConfigVersion`, 허용오차와 반대증거를 남긴다.

## 2. Scalar Position 제거

기존 `position: float` 하나로는 Core와 Tactical, 기존 lot과 재진입 lot을 분리할 수 없다. 다음 모델로 전환한다.

```text
Portfolio
 └─ PositionLot (원가·수량·개설/종료·세금 lot)
     └─ CycleState (Entry, Peak, Floor, BreachCount, LastSell, LastBuy)
         └─ ProtectionState / ReentryWatch
```

- 부분매도는 특정 Lot/Cycle에 귀속된다.
- 재진입은 새 `CycleId`와 새 Lot을 만든다.
- Strategic Core는 정책상 보호 대상 비중과 Tactical 비중을 분리한다.
- Hard Impairment는 자동 재진입을 금지한다.

## 3. Functional Core / Imperative Shell

**Pure Core**

- `SellPolicyChain.Evaluate(input)`
- `ReentryPolicy.Evaluate(input)`
- `PortfolioConstraintPolicy.Evaluate(input)`
- `ExpectedUtilityCalculator.Calculate(input)`

**Imperative Shell**

- PIT data query
- transaction, Dapper SQL
- EvidenceSnapshot 저장
- Outbox 발행
- Hangfire schedule/retry
- SignalR/Telegram 통지

## 4. 기대효용 계산 분해

한 개의 opaque score 대신 구성요소를 별도로 저장한다.

- Hold expected return distribution P10/P50/P90
- ES95와 영구가치훼손 확률×LGD
- marginal portfolio risk
- liquidity/slippage/tax/FX
- replacement lower confidence edge
- reentry option loss

Opportunity sell은 순우위의 신뢰하단이 0을 넘고 IPS·유동성·세금 제약을 통과할 때만 허용한다.

## 5. 실행 시뮬레이션

- 결정: 시장 종가 후
- 주문의도: 다음 거래가능 세션
- Fill: open/VWAP/limit 모델 중 승인된 시나리오
- 부분체결, gap, ADV participation, spread, FX, 세금, 수수료를 별도 이벤트로 기록
- SignalDecision과 Fill은 분리해 추천 성과·실행 성과·고객 행동을 attribution한다.

## 6. 일평가

일평가는 단타 적중률이 아니다.

| 영역 | 핵심 |
|---|---|
| 운영 무결성 | duplicate, lookahead, DQ hold, 미승인 공개, reconciliation |
| 예측 | coverage, calibration, Brier/log loss |
| 매도 | ES/MDD 감소, permanent loss 회피, gain capture, false-exit cost |
| 재진입 | capture, delay cost, duplicate stage, expiry |
| 비용후 효용 | 20/63/126/252 거래일 |
| 모델리스크 | PBO, DSR, parameter stability, regime drift |

## 7. 변경 규칙

임계값·수식·우선순위를 바꾸는 PR은 반드시 다음을 포함한다.

1. Policy ID와 변경 사유
2. Characterization/Golden diff
3. Frozen OOS와 cost×2 결과
4. market/asset/regime별 영향
5. false-exit·reentry·ES 영향
6. ModelCard와 rollback 기준
7. Quant/Risk 승인
