Files
system-specs/specification.md

43 KiB

QuantBench System Specification

System Overview

QuantBench는 개인 투자자를 위한 퀀트 트레이딩 플랫폼으로, 다중 계좌 관리, 전략 기반 자동매매, 리스크 관리, 성과 분석을 통합 제공합니다. 컨테이너 기반 자산 격리를 통해 하나의 계좌에서 여러 전략을 안전하게 병렬 운영할 수 있습니다.


Phase 1: MVP (Minimum Viable Product)

목표: 안전하게 전략을 실행하고 리스크를 통제할 수 있는 기본 시스템 구축

System Architecture

┌─────────────────────────────────────────────────────┐
│                    User Interface                    │
└──────────────────┬──────────────────────────────────┘
                   │
┌──────────────────┴──────────────────────────────────┐
│                  API Gateway                         │
└─┬────────┬────────┬────────┬────────┬──────────────┘
  │        │        │        │        │
  ▼        ▼        ▼        ▼        ▼
┌────┐  ┌────┐  ┌────┐  ┌────┐  ┌────┐
│mgmt│  │stgy│  │schd│  │risk│  │data│
└─┬──┘  └─┬──┘  └─┬──┘  └─┬──┘  └─┬──┘
  │       │       │       │       │
  └───────┴───────┴───────┴───────┘
                  │
                  ▼
            ┌──────────┐
            │ balance  │
            └────┬─────┘
                 │
    ┌────────────┼────────────┐
    ▼            ▼            ▼
  [API]        [API]        [API]
  한국투자증권   삼성증권      키움증권

📦 Component Specifications - Phase 1

1. balance (계좌 관리)

책임: 증권사 API 통합 및 계좌 자산 관리

주요 기능

1.1 계좌 연동 관리

  • 증권사 API 인증 및 세션 관리
  • 다중 계좌 등록/수정/삭제
  • API 키 암호화 저장 및 갱신

1.2 자산 조회

getCurrentBalance(accountId: string): Balance
  - 원화/외화 현금 잔고
  - 보유 종목별 수량/평가액
  - 매수 가능 금액
  - 출금 가능 금액
  
getPortfolioSnapshot(accountId: string): Portfolio
  - 자산 클래스별 비중 (주식/채권/현금 등)
  - 종목별 손익률
  - 총 자산 평가액

1.3 시세 조회

getCurrentPrice(symbol: string): Price
  - 현재가, 시가, 고가, 저가
  - 거래량
  - 호가 정보 (매수/매도 5호가)
  
getHistoricalPrices(symbol: string, from: Date, to: Date): Price[]
  - 일/주/월봉 데이터
  - 조정 가격 (배당, 액면분할 반영)

1.4 주문 처리

placeOrder(order: Order): OrderResult
  - 시장가/지정가/조건부 주문
  - 주문 검증 (잔고 확인, 호가 단위 등)
  - 주문 번호 반환
  
cancelOrder(orderId: string): boolean
  - 미체결 주문 취소
  
getOrderStatus(orderId: string): OrderStatus
  - 주문 상태 조회 (접수/체결/취소)
  - 부분 체결 정보

1.5 증권사 추상화 인터페이스

interface BrokerAdapter {
  connect(credentials: Credentials): Promise<Session>
  getBalance(accountId: string): Promise<Balance>
  getQuote(symbol: string): Promise<Quote>
  submitOrder(order: Order): Promise<OrderResult>
  cancelOrder(orderId: string): Promise<boolean>
  getOrderHistory(accountId: string, from: Date): Promise<Order[]>
}

// 구현체 예시
class KoreaInvestmentAdapter implements BrokerAdapter { ... }
class SamsungAdapter implements BrokerAdapter { ... }
class KiwoomAdapter implements BrokerAdapter { ... }

데이터 모델

interface Account {
  id: string
  brokerId: string  // 증권사 식별자
  accountNumber: string
  accountName: string
  accountType: 'STOCK' | 'FUTURES' | 'FOREX'
  credentials: EncryptedCredentials
  isActive: boolean
  createdAt: Date
}

interface Balance {
  accountId: string
  cash: {
    krw: number
    usd: number
    // ... 기타 통화
  }
  positions: Position[]
  totalEquity: number
  buyingPower: number
  timestamp: Date
}

interface Position {
  symbol: string
  quantity: number
  averagePrice: number
  currentPrice: number
  marketValue: number
  unrealizedPnL: number
  realizedPnL: number
}

interface Order {
  orderId?: string
  accountId: string
  symbol: string
  side: 'BUY' | 'SELL'
  orderType: 'MARKET' | 'LIMIT' | 'STOP'
  quantity: number
  price?: number
  status: 'PENDING' | 'FILLED' | 'PARTIALLY_FILLED' | 'CANCELLED' | 'REJECTED'
  filledQuantity?: number
  averageFillPrice?: number
  submittedAt?: Date
  executedAt?: Date
}

2. mgmt (컨테이너 관리)

책임: 가상 자산 컨테이너 생성 및 운영 관리

주요 기능

2.1 컨테이너 생명주기 관리

createContainer(config: ContainerConfig): Container
  - 계좌 내 자산 할당
  - 컨테이너 설정 (이름, 목표, 제약조건)
  - 초기 자산 스냅샷 생성
  
updateContainer(id: string, config: Partial<ContainerConfig>): Container
  - 설정 변경 (전략, 리밸런싱 주기 등)
  - 변경 이력 기록
  
deleteContainer(id: string): boolean
  - 컨테이너 비활성화
  - 자산 원 계좌로 회수

2.2 가상 자산 격리

allocateAssets(containerId: string, allocation: AssetAllocation): boolean
  - 실제 계좌 잔고에서 가상 할당
  - 총 할당 금액 검증 (계좌 잔고 초과 방지)
  
getContainerBalance(containerId: string): VirtualBalance
  - 컨테이너별 독립 잔고 조회
  - 현금 + 보유 종목 평가
  
reconcileAssets(accountId: string): ReconciliationReport
  - 실제 계좌 vs 컨테이너 총합 일치 확인
  - 불일치 시 경고 및 조정

2.3 컨테이너 간 자산 이동

transferAssets(from: string, to: string, amount: number): Transfer
  - 컨테이너 간 현금/종목 이전
  - 거래 기록 생성
  - 양쪽 컨테이너 밸런스 업데이트

2.4 컨테이너 상태 모니터링

getContainerStatus(containerId: string): ContainerStatus
  - 현재 실행 중인 전략
  - 마지막 리밸런싱 일시
  - 활성/비활성 상태
  - 에러/경고 메시지

데이터 모델

interface Container {
  id: string
  accountId: string
  name: string
  description?: string
  strategyId?: string  // 연결된 전략
  
  allocation: {
    initialAmount: number
    currentEquity: number
    cashReserve: number  // 최소 현금 보유량
  }
  
  constraints: {
    maxSinglePositionPct: number  // 단일 종목 최대 비중
    maxDrawdown: number  // 최대 허용 낙폭
    allowedAssetClasses: string[]  // 투자 가능 자산군
  }
  
  rebalancing: {
    frequency: 'DAILY' | 'WEEKLY' | 'MONTHLY' | 'QUARTERLY'
    dayOfWeek?: number  // WEEKLY인 경우
    dayOfMonth?: number  // MONTHLY인 경우
    autoExecute: boolean  // 자동 실행 여부
  }
  
  status: 'ACTIVE' | 'PAUSED' | 'ARCHIVED'
  createdAt: Date
  lastRebalancedAt?: Date
}

interface VirtualBalance {
  containerId: string
  cash: number
  positions: Position[]
  totalValue: number
  availableCash: number  // 주문 가능 현금
  allocatedValue: number  // 실제 배정받은 금액
}

3. strategy (전략 관리)

책임: 투자 전략 구현, 백테스트, 버전 관리

주요 기능

3.1 전략 등록 및 관리

registerStrategy(strategy: StrategyDefinition): Strategy
  - 전략 코드/설정 등록
  - 메타데이터 저장 (작성자, 설명, 파라미터)
  - 초기 검증 (구문 오류, 필수 메서드 존재)
  
updateStrategy(id: string, version: StrategyVersion): Strategy
  - 새 버전 생성
  - 이전 버전 보존 (불변성)
  - 변경 사항 추적
  
getStrategy(id: string, version?: string): Strategy
  - 특정 버전 조회 (미지정 시 최신)

3.2 전략 실행 엔진

calculateSignals(strategyId: string, marketData: MarketData): Signal[]
  - 현재 시장 상황 기반 매매 신호 생성
  - 매수/매도/보유 결정
  - 목표 비중 계산
  
generateOrders(containerId: string, signals: Signal[]): Order[]
  - 신호를 실제 주문으로 변환
  - 현재 포지션과 목표 포지션 차이 계산
  - 주문 수량/가격 결정

3.3 백테스트

runBacktest(config: BacktestConfig): BacktestResult
  - 과거 데이터 기반 전략 시뮬레이션
  - 거래 비용, 슬리피지 반영
  - 일별 포트폴리오 가치 계산
  
calculateMetrics(backtestResult: BacktestResult): PerformanceMetrics
  - 총 수익률, CAGR
  - 샤프 비율, 소르티노 비율
  - 최대 낙폭 (MDD)
  - 승률, 평균 수익/손실
  - 변동성 (연율화)

3.4 전략 파라미터 관리

getParameters(strategyId: string): Parameter[]
  - 전략에서 사용하는 파라미터 목록
  - 파라미터 타입, 기본값, 범위
  
setParameters(strategyId: string, params: Record<string, any>): void
  - 파라미터 값 설정
  - 유효성 검증

전략 인터페이스

interface StrategyInterface {
  // 필수 구현 메서드
  initialize(context: StrategyContext): void
  generateSignals(data: MarketData): Signal[]
  
  // 선택적 메서드
  onMarketOpen?(): void
  onMarketClose?(): void
  onOrderFilled?(order: Order): void
}

// 내장 전략 예시
class BoldAssetAllocation implements StrategyInterface {
  private params: {
    stockAllocation: number  // 주식 비중 (0-1)
    bondAllocation: number   // 채권 비중 (0-1)
    rebalanceThreshold: number  // 리밸런싱 임계값
  }
  
  initialize(context: StrategyContext) {
    this.params = context.parameters
  }
  
  generateSignals(data: MarketData): Signal[] {
    // 현재 포트폴리오와 목표 비중 비교
    // 임계값 초과 시 리밸런싱 신호 생성
    // ...
  }
}

데이터 모델

interface Strategy {
  id: string
  name: string
  description: string
  category: 'ASSET_ALLOCATION' | 'MOMENTUM' | 'VALUE' | 'ARBITRAGE' | 'CUSTOM'
  
  versions: StrategyVersion[]
  currentVersion: string
  
  parameters: Parameter[]
  requiredData: string[]  // 필요한 데이터 종류
  
  createdBy: string
  createdAt: Date
  isPublic: boolean
}

interface StrategyVersion {
  version: string  // "1.0.0"
  code: string  // 전략 구현 코드
  changelog?: string
  createdAt: Date
  backtestResults?: BacktestResult[]
}

interface Signal {
  symbol: string
  action: 'BUY' | 'SELL' | 'HOLD'
  targetWeight?: number  // 목표 비중 (0-1)
  targetQuantity?: number  // 목표 수량
  reason?: string  // 신호 발생 이유
  confidence?: number  // 신호 신뢰도 (0-1)
  generatedAt: Date
}

interface BacktestConfig {
  strategyId: string
  strategyVersion: string
  startDate: Date
  endDate: Date
  initialCapital: number
  universe: string[]  // 투자 대상 종목
  benchmark?: string  // 벤치마크 (예: 'SPY')
  
  costs: {
    commission: number  // 거래 수수료
    slippage: number  // 슬리피지 (bps)
  }
}

interface BacktestResult {
  strategyId: string
  config: BacktestConfig
  
  equity: {
    date: Date
    value: number
    cash: number
    positions: Record<string, number>
  }[]
  
  trades: {
    date: Date
    symbol: string
    action: 'BUY' | 'SELL'
    quantity: number
    price: number
    commission: number
  }[]
  
  metrics: PerformanceMetrics
  runAt: Date
}

interface PerformanceMetrics {
  totalReturn: number  // %
  cagr: number  // %
  sharpeRatio: number
  sortinoRatio: number
  maxDrawdown: number  // %
  volatility: number  // % (annualized)
  winRate: number  // %
  avgWin: number  // %
  avgLoss: number  // %
  profitFactor: number
}

4. scheduler (실행 스케줄러)

책임: 전략 실행 자동화 및 리밸런싱 관리

주요 기능

4.1 스케줄 관리

createSchedule(containerId: string, schedule: ScheduleConfig): Schedule
  - 컨테이너별 실행 계획 생성
  - Cron 표현식 지원
  - 시장 시간 고려 (장 전/후, 장 중)
  
updateSchedule(scheduleId: string, config: Partial<ScheduleConfig>): Schedule
  - 스케줄 수정
  
pauseSchedule(scheduleId: string): boolean
resumeSchedule(scheduleId: string): boolean
  - 일시 정지/재개

4.2 실행 트리거

executeStrategy(containerId: string, mode: 'AUTO' | 'MANUAL'): Execution
  - 전략 실행 시작
  - 신호 생성 → 리스크 체크 → 주문 생성 → 승인 처리
  
scheduleRebalancing(containerId: string): void
  - 다음 리밸런싱 일정 등록
  - 시장 휴일 자동 회피

4.3 승인 워크플로우

requestApproval(execution: Execution): ApprovalRequest
  - 사용자 승인 요청 생성
  - 예상 주문 내역, 비용 계산
  - 알림 발송 (이메일/푸시)
  
approveExecution(requestId: string, approved: boolean): boolean
  - 승인/거부 처리
  - 승인 시 주문 실행
  - 거부 시 로그 기록

autoExecuteWithNotification(execution: Execution): ExecutionResult
  - 자동 실행 모드
  - 실행 후 결과 알림

4.4 실행 이력 관리

getExecutionHistory(containerId: string, from: Date): Execution[]
  - 과거 실행 기록 조회
  
getExecutionDetail(executionId: string): ExecutionDetail
  - 실행 상세 정보 (생성된 주문, 체결 내역)

데이터 모델

interface Schedule {
  id: string
  containerId: string
  
  trigger: {
    type: 'CRON' | 'INTERVAL' | 'EVENT'
    expression?: string  // Cron: "0 9 * * 1-5"
    intervalMinutes?: number
    event?: 'MARKET_OPEN' | 'MARKET_CLOSE'
  }
  
  executionMode: 'AUTO' | 'APPROVAL_REQUIRED'
  
  constraints: {
    marketHoursOnly: boolean
    skipHolidays: boolean
    minIntervalHours?: number  // 최소 실행 간격
  }
  
  isActive: boolean
  nextRun?: Date
  lastRun?: Date
}

interface Execution {
  id: string
  containerId: string
  strategyId: string
  
  status: 'PENDING' | 'APPROVED' | 'REJECTED' | 'RUNNING' | 'COMPLETED' | 'FAILED'
  
  signals: Signal[]
  plannedOrders: Order[]
  executedOrders: Order[]
  
  estimatedCost: {
    commission: number
    totalValue: number
  }
  
  approvalRequest?: ApprovalRequest
  
  startedAt?: Date
  completedAt?: Date
  error?: string
}

interface ApprovalRequest {
  id: string
  executionId: string
  
  summary: {
    numOrders: number
    buyValue: number
    sellValue: number
    estimatedCommission: number
  }
  
  orders: Order[]
  
  requestedAt: Date
  expiresAt: Date
  approvedAt?: Date
  approvedBy?: string
  decision?: 'APPROVED' | 'REJECTED'
}

5. data (데이터 관리) NEW

책임: 시계열 데이터 수집, 저장, 제공

주요 기능

5.1 데이터 수집

collectMarketData(symbols: string[], from: Date, to: Date): void
  - 외부 데이터 소스에서 시세 수집
  - 일/분봉 데이터 저장
  - 증분 업데이트 (새로운 데이터만)
  
updateRealTimeData(symbols: string[]): void
  - 실시간 시세 스트리밍
  - 인메모리 캐시 업데이트

5.2 데이터 제공

getPriceHistory(symbol: string, from: Date, to: Date, interval: Interval): PriceBar[]
  - 과거 가격 데이터 조회
  - interval: '1m', '5m', '1h', '1d', '1w', '1M'
  
getLatestPrice(symbol: string): Price
  - 최신 시세 (캐시 우선)
  
getMultipleSymbols(symbols: string[], date: Date): Record<string, Price>
  - 특정 일자 여러 종목 시세
  - 백테스트 최적화

5.3 데이터 품질 관리

validateData(symbol: string, from: Date, to: Date): ValidationReport
  - 결측치 검사
  - 이상치 탐지 (급등락, 거래량 0 등)
  - 데이터 연속성 확인
  
adjustForCorporateActions(symbol: string): void
  - 배당, 액면분할, 병합 반영
  - 조정 가격 계산
  
fillMissingData(symbol: string, method: 'FORWARD_FILL' | 'INTERPOLATE'): void
  - 결측치 보정

5.4 데이터 소스 관리

addDataSource(source: DataSourceConfig): DataSource
  - 외부 데이터 제공자 연동 (Yahoo Finance, Alpha Vantage 등)
  
syncDataSource(sourceId: string): SyncResult
  - 데이터 동기화
  - 충돌 해결 전략

데이터 모델

interface PriceBar {
  symbol: string
  timestamp: Date
  open: number
  high: number
  low: number
  close: number
  volume: number
  adjustedClose?: number  // 조정 종가
}

interface DataSource {
  id: string
  name: string
  provider: 'BROKER' | 'YAHOO' | 'ALPHA_VANTAGE' | 'CUSTOM'
  
  config: {
    apiKey?: string
    endpoint?: string
    rateLimit?: number  // requests per minute
  }
  
  coverage: {
    symbols: string[]  // 지원 종목
    intervals: string[]  // 지원 주기
    delay: number  // 데이터 지연 시간 (분)
  }
  
  priority: number  // 다중 소스 시 우선순위
  isActive: boolean
}

interface ValidationReport {
  symbol: string
  period: { from: Date, to: Date }
  
  issues: {
    type: 'MISSING_DATA' | 'OUTLIER' | 'ZERO_VOLUME' | 'PRICE_GAP'
    date: Date
    description: string
    severity: 'LOW' | 'MEDIUM' | 'HIGH'
  }[]
  
  completeness: number  // 0-1
  quality: 'EXCELLENT' | 'GOOD' | 'FAIR' | 'POOR'
}

6. risk (리스크 관리) NEW

책임: 포지션 리스크 통제 및 사전 주문 검증

주요 기능

6.1 사전 주문 검증 (Pre-Trade Risk Check)

validateOrder(order: Order, container: Container): RiskCheckResult
  - 잔고 충분성 확인
  - 포지션 사이즈 한도 검증
  - 집중도 리스크 평가
  - 레버리지 제한 확인
  
validateOrderBatch(orders: Order[], container: Container): RiskCheckResult[]
  - 여러 주문의 통합 리스크 평가
  - 주문 간 상호작용 고려

6.2 포지션 리스크 모니터링

calculatePositionRisk(containerId: string): PositionRisk
  - 포지션별 VaR (Value at Risk)
  - 포트폴리오 베타
  - 섹터/산업 집중도
  
checkRiskLimits(containerId: string): LimitViolation[]
  - 설정된 리스크 한도 위반 검사
  - 위반 항목 및 심각도 반환

6.3 손절/익절 관리

setStopLoss(containerId: string, symbol: string, config: StopLossConfig): void
  - 종목별 손절 설정
  - 트레일링 스톱 지원
  
setTakeProfit(containerId: string, symbol: string, level: number): void
  - 익절 목표 설정
  
checkStopConditions(containerId: string): StopTrigger[]
  - 손절/익절 조건 충족 확인
  - 자동 청산 주문 생성 준비

6.4 리스크 한도 설정

setRiskLimits(containerId: string, limits: RiskLimits): void
  - 컨테이너별 리스크 한도 지정
  - 글로벌 한도 vs 개별 한도
  
getRiskProfile(containerId: string): RiskProfile
  - 현재 리스크 프로필 조회
  - 한도 대비 현황

6.5 포트폴리오 리스크 분석

calculatePortfolioVaR(containerId: string, confidence: number, horizon: number): VaRResult
  - 포트폴리오 VaR 계산 (역사적 방법, 파라메트릭 방법)
  - confidence: 신뢰수준 (예: 0.95, 0.99)
  - horizon: 기간 (일)
  
calculateCorrelationMatrix(containerId: string): CorrelationMatrix
  - 보유 종목 간 상관관계
  - 분산 효과 분석
  
stressTest(containerId: string, scenarios: Scenario[]): StressTestResult[]
  - 시나리오별 손실 추정
  - 극단 상황 대비

데이터 모델

interface RiskLimits {
  containerId: string
  
  position: {
    maxSinglePositionPct: number  // 단일 종목 최대 비중 (%)
    maxSectorPct: number  // 단일 섹터 최대 비중 (%)
    maxTotalLeverage: number  // 최대 레버리지 배수
  }
  
  loss: {
    maxDailyLossPct: number  // 일일 최대 손실 (%)
    maxDrawdownPct: number  // 최대 낙폭 (%)
    stopLossEnabled: boolean
  }
  
  exposure: {
    maxLongExposure: number  // 최대 롱 익스포저
    maxShortExposure: number  // 최대 숏 익스포저
    maxGrossExposure: number  // 최대 총 익스포저
  }
}

interface RiskCheckResult {
  passed: boolean
  violations: {
    rule: string
    severity: 'BLOCKING' | 'WARNING'
    message: string
    currentValue: number
    limitValue: number
  }[]
  recommendations?: string[]
}

interface PositionRisk {
  containerId: string
  
  positions: {
    symbol: string
    marketValue: number
    weightPct: number
    VaR95: number  // 95% 신뢰수준 VaR
    beta: number
    sector: string
  }[]
  
  portfolio: {
    totalValue: number
    totalVaR95: number
    beta: number
    correlationRisk: number  // 집중도 점수
  }
  
  limits: {
    type: string
    current: number
    limit: number
    utilizationPct: number
  }[]
  
  calculatedAt: Date
}

interface StopLossConfig {
  type: 'FIXED' | 'TRAILING' | 'TIME_BASED'
  
  // FIXED: 고정 가격/비율
  fixedPrice?: number
  fixedPct?: number  // 매수가 대비 %
  
  // TRAILING: 최고가 대비 추적
  trailingPct?: number
  
  // TIME_BASED: 기간 경과 후
  holdingPeriodDays?: number
  
  autoExecute: boolean  // 자동 청산 여부
}

interface VaRResult {
  confidence: number
  horizon: number
  VaR: number  // 금액
  VaRPct: number  // 비율
  method: 'HISTORICAL' | 'PARAMETRIC' | 'MONTE_CARLO'
  calculatedAt: Date
}

interface Scenario {
  name: string
  description: string
  changes: {
    symbol: string
    priceChangePct: number
  }[]
}

interface StressTestResult {
  scenario: Scenario
  estimatedLoss: number
  estimatedLossPct: number
  affectedPositions: {
    symbol: string
    currentValue: number
    projectedValue: number
    lossPct: number
  }[]
}

🔄 Phase 1 Workflow Example

전략 실행 플로우:

1. [scheduler] 스케줄 트리거 발생
   ↓
2. [scheduler] 컨테이너 정보 조회 (mgmt)
   ↓
3. [strategy] 신호 생성 (data에서 시세 조회)
   ↓
4. [risk] 사전 리스크 체크
   ├─ PASS → 주문 생성
   └─ FAIL → 실행 중단, 알림 발송
   ↓
5. [scheduler] 승인 요청 (AUTO인 경우 skip)
   ↓
6. [balance] 주문 제출
   ↓
7. [mgmt] 컨테이너 밸런스 업데이트
   ↓
8. [scheduler] 실행 결과 기록 및 알림

Phase 2: Production Ready

목표: 실전 운영을 위한 모니터링, 분석, 알림 체계 구축

Additional Components


📦 Component Specifications - Phase 2

7. analytics (성과 분석 및 리포팅) NEW

책임: 실거래 성과 측정 및 리포팅

주요 기능

7.1 성과 측정

calculatePerformance(containerId: string, period: DateRange): PerformanceReport
  - 기간별 수익률 (일/주/월/분기/연)
  - 벤치마크 대비 초과 수익
  - 리스크 조정 수익률 (샤프, 소르티노)
  
getReturnsTimeseries(containerId: string, from: Date): TimeseriesData
  - 일별 수익률 시계열
  - 누적 수익률 차트 데이터

7.2 귀속 분석 (Attribution Analysis)

analyzeReturns(containerId: string, period: DateRange): AttributionReport
  - 수익 원천 분해
    - 자산 배분 효과
    - 종목 선택 효과
    - 타이밍 효과
  - 섹터/테마별 기여도

7.3 거래 분석

analyzeTrades(containerId: string, from: Date): TradeAnalysis
  - 총 거래 건수, 거래 회전율
  - 승률, 손익비
  - 평균 보유 기간
  - 최대 연속 수익/손실
  
calculateTradingCosts(containerId: string, period: DateRange): CostAnalysis
  - 총 수수료
  - 슬리피지 추정
  - 세금 (양도소득세 등)
  - 순수익률 (비용 차감 후)

7.4 리포트 생성

generateReport(containerId: string, type: ReportType, period: DateRange): Report
  - type: 'DAILY' | 'WEEKLY' | 'MONTHLY' | 'QUARTERLY' | 'ANNUAL'
  - PDF/HTML 형식
  - 자동 이메일 발송 옵션
  
scheduleReport(config: ReportSchedule): void
  - 정기 리포트 자동 생성

7.5 벤치마크 비교

compareWithBenchmark(containerId: string, benchmarkSymbol: string, period: DateRange): ComparisonReport
  - 누적 수익률 비교
  - 추적 오차 (Tracking Error)
  - 정보 비율 (Information Ratio)
  - 상승/하락 시장 성과

데이터 모델

interface PerformanceReport {
  containerId: string
  period: DateRange
  
  returns: {
    total: number  // %
    annualized: number  // CAGR
    daily: number
    weekly: number
    monthly: number
    ytd: number
  }
  
  risk: {
    volatility: number  // annualized
    sharpeRatio: number
    sortinoRatio: number
    maxDrawdown: number
    calmarRatio: number
  }
  
  benchmark?: {
    symbol: string
    returns: number
    excessReturn: number
    beta: number
    alpha: number
    trackingError: number
    informationRatio: number
  }
  
  generatedAt: Date
}

interface AttributionReport {
  containerId: string
  period: DateRange
  
  totalReturn: number
  
  attribution: {
    assetAllocation: number  // 자산 배분 효과
    stockSelection: number  // 종목 선택 효과
    timing: number  // 타이밍 효과
    interaction: number  // 상호작용 효과
  }
  
  sectorContribution: {
    sector: string
    weight: number
    return: number
    contribution: number
  }[]
  
  topContributors: {
    symbol: string
    contribution: number
  }[]
  
  topDetractors: {
    symbol: string
    contribution: number
  }[]
}

interface TradeAnalysis {
  containerId: string
  period: DateRange
  
  summary: {
    totalTrades: number
    winningTrades: number
    losingTrades: number
    winRate: number  // %
    
    avgWin: number  // %
    avgLoss: number  // %
    profitFactor: number  // avgWin / avgLoss
    
    avgHoldingPeriod: number  // days
    turnoverRate: number  // annualized
  }
  
  longestWinStreak: number
  longestLossStreak: number
  
  largestWin: {
    symbol: string
    return: number
    date: Date
  }
  
  largestLoss: {
    symbol: string
    return: number
    date: Date
  }
}

interface CostAnalysis {
  period: DateRange
  
  costs: {
    commission: number
    estimatedSlippage: number
    tax: number
    other: number
    total: number
  }
  
  impact: {
    grossReturn: number
    netReturn: number
    costDrag: number  // bps
  }
  
  costByType: {
    buy: number
    sell: number
  }
}

interface Report {
  id: string
  containerId: string
  type: ReportType
  period: DateRange
  
  sections: {
    summary: PerformanceSummary
    positions: CurrentPositions
    trades: RecentTrades
    performance: PerformanceCharts
    attribution: AttributionAnalysis
    risk: RiskMetrics
  }
  
  format: 'PDF' | 'HTML' | 'JSON'
  fileUrl?: string
  generatedAt: Date
}

8. monitor (모니터링 및 알림) NEW

책임: 시스템 상태 감시 및 이상 탐지

주요 기능

8.1 시스템 헬스 체크

checkSystemHealth(): HealthStatus
  - 각 컴포넌트 상태 확인
  - API 연결 상태
  - 데이터베이스 응답 시간
  - 메모리/CPU 사용률
  
monitorApiConnections(): ConnectionStatus[]
  - 증권사 API 연결 상태
  - 데이터 소스 연결 상태
  - 마지막 성공 시간
  - 실패 시 재연결 시도

8.2 이상 거래 탐지

detectAnomalies(containerId: string): Anomaly[]
  - 급격한 포지션 변화 (설정치 초과)
  - 비정상적 주문 크기
  - 예상치 못한 체결
  - 시장 충격 (market impact) 과다
  
checkMarketConditions(): MarketAlert[]
  - 극심한 변동성
  - 유동성 부족
  - 서킷브레이커 발동
  - 시장 전체 급락/급등

8.3 알림 관리

sendAlert(alert: Alert): void
  - 채널별 알림 발송 (이메일/SMS/푸시/Slack)
  - 중요도별 라우팅
  - 알림 이력 저장
  
configureAlertRules(rules: AlertRule[]): void
  - 알림 조건 설정
  - 임계값, 빈도 제한
  - 수신자 그룹 관리
  
getAlertHistory(from: Date, severity?: AlertSeverity): Alert[]
  - 과거 알림 조회
  - 필터링 및 검색

8.4 대시보드 데이터

getDashboardData(): DashboardSnapshot
  - 전체 계좌 요약
  - 컨테이너별 상태
  - 최근 실행 이력
  - 활성 알림
  
getRealtimeMetrics(containerId: string): RealtimeMetrics
  - 현재 P&L
  - 당일 수익률
  - 포지션 변화
  - 리스크 지표

8.5 성능 모니터링

trackLatency(operation: string, duration: number): void
  - 주요 작업 소요 시간 추적
  - 주문 처리 지연 모니터링
  
logError(error: Error, context: any): void
  - 에러 로깅 및 분류
  - 스택 트레이스 저장
  - 재발 패턴 분석

데이터 모델

interface HealthStatus {
  overall: 'HEALTHY' | 'DEGRADED' | 'DOWN'
  
  components: {
    name: string
    status: 'UP' | 'DOWN' | 'SLOW'
    responseTime?: number  // ms
    lastCheck: Date
    message?: string
  }[]
  
  connections: {
    broker: 'CONNECTED' | 'DISCONNECTED' | 'ERROR'
    database: 'CONNECTED' | 'DISCONNECTED'
    dataProviders: Record<string, 'CONNECTED' | 'DISCONNECTED'>
  }
  
  resources: {
    cpuUsage: number  // %
    memoryUsage: number  // %
    diskUsage: number  // %
  }
  
  checkedAt: Date
}

interface Anomaly {
  type: 'POSITION_SPIKE' | 'UNUSUAL_ORDER' | 'UNEXPECTED_FILL' | 'HIGH_IMPACT'
  severity: 'LOW' | 'MEDIUM' | 'HIGH' | 'CRITICAL'
  
  containerId: string
  description: string
  
  details: {
    expected?: any
    actual: any
    threshold?: any
  }
  
  detectedAt: Date
  resolved: boolean
}

interface Alert {
  id: string
  type: 'SYSTEM' | 'RISK' | 'EXECUTION' | 'PERFORMANCE' | 'ANOMALY'
  severity: 'INFO' | 'WARNING' | 'ERROR' | 'CRITICAL'
  
  title: string
  message: string
  
  source: string  // 발생 컴포넌트
  containerId?: string
  
  channels: ('EMAIL' | 'SMS' | 'PUSH' | 'SLACK')[]
  sentAt?: Date
  
  acknowledged: boolean
  acknowledgedAt?: Date
  acknowledgedBy?: string
  
  createdAt: Date
}

interface AlertRule {
  id: string
  name: string
  description: string
  
  condition: {
    metric: string  // 'drawdown', 'dailyLoss', 'positionSize', etc.
    operator: '>' | '<' | '=' | '>=' | '<='
    threshold: number
  }
  
  severity: AlertSeverity
  channels: AlertChannel[]
  
  throttle: {
    enabled: boolean
    minIntervalMinutes: number  // 최소 알림 간격
  }
  
  isActive: boolean
}

interface DashboardSnapshot {
  accounts: {
    accountId: string
    totalEquity: number
    cashBalance: number
    todayPnL: number
    todayReturn: number
  }[]
  
  containers: {
    containerId: string
    name: string
    status: 'ACTIVE' | 'PAUSED'
    equity: number
    todayReturn: number
    activeStrategy: string
    lastRebalanced: Date
  }[]
  
  recentExecutions: {
    executionId: string
    containerId: string
    status: string
    completedAt: Date
  }[]
  
  activeAlerts: Alert[]
  
  systemHealth: 'HEALTHY' | 'DEGRADED' | 'DOWN'
  
  timestamp: Date
}

interface RealtimeMetrics {
  containerId: string
  
  current: {
    equity: number
    cash: number
    positionsCount: number
  }
  
  today: {
    pnl: number
    return: number
    tradesCount: number
  }
  
  risk: {
    currentDrawdown: number
    VaR95: number
    leverage: number
  }
  
  updatedAt: Date
}

🔄 Phase 2 Enhanced Workflow

성과 모니터링 플로우:

1. [scheduler] 전략 실행 완료
   ↓
2. [analytics] 실시간 성과 계산
   ├─ 일일 수익률 업데이트
   ├─ 리스크 지표 재계산
   └─ 벤치마크 대비 성과 비교
   ↓
3. [monitor] 이상 탐지
   ├─ 급격한 손실 → CRITICAL 알림
   ├─ 리스크 한도 근접 → WARNING 알림
   └─ 정상 범위 → 로그만 기록
   ↓
4. [monitor] 대시보드 업데이트
   ↓
5. [analytics] 정기 리포트 생성 (일정에 따라)

Phase 3: Enterprise Grade

목표: 규제 대응, 감사 추적, 고급 시뮬레이션

Additional Components


📦 Component Specifications - Phase 3

9. audit (감사 및 로깅) NEW

책임: 불변 감사 로그 및 규제 리포팅

주요 기능

9.1 감사 로그 기록

logEvent(event: AuditEvent): void
  - 모든 중요 이벤트 불변 저장
  - 타임스탬프, 사용자, 작업 내용
  - 변경 전/후 데이터
  
logOrderActivity(order: Order, action: OrderAction): void
  - 주문 생성/수정/취소/체결
  - 호가 정보 스냅샷
  - 결정 근거 (전략 신호)

9.2 변경 이력 추적

trackConfigChange(entity: string, entityId: string, changes: any): void
  - 컨테이너 설정 변경
  - 전략 파라미터 수정
  - 리스크 한도 조정
  
getChangeHistory(entity: string, entityId: string): ChangeLog[]
  - 시간순 변경 이력
  - 변경자, 사유 포함

9.3 규제 리포팅

generateComplianceReport(type: ComplianceReportType, period: DateRange): ComplianceReport
  - 거래 내역 보고서
  - 포지션 보유 명세
  - 이상 거래 탐지 결과
  
exportAuditTrail(from: Date, to: Date, format: 'CSV' | 'JSON'): File
  - 감사 추적 데이터 추출
  - 외부 감사 대비

9.4 데이터 보존 정책

archiveOldData(cutoffDate: Date): ArchiveResult
  - 오래된 데이터 아카이브
  - 빠른 조회용 DB vs 장기 보관용 스토리지
  
retainCriticalData(dataType: string, retentionYears: number): void
  - 법적 보존 기간 관리
  - 자동 삭제 방지

9.5 무결성 검증

verifyAuditIntegrity(from: Date, to: Date): IntegrityReport
  - 감사 로그 변조 검사
  - 체인 연속성 확인
  - 해시 검증

데이터 모델

interface AuditEvent {
  id: string
  timestamp: Date
  
  eventType: 'ORDER' | 'CONFIG_CHANGE' | 'EXECUTION' | 'LOGIN' | 'DATA_EXPORT'
  action: string  // 'CREATE', 'UPDATE', 'DELETE', 'EXECUTE'
  
  userId?: string
  containerId?: string
  
  entity: string  // 'Container', 'Strategy', 'Order', etc.
  entityId: string
  
  before?: any  // 변경 전 상태
  after?: any  // 변경 후 상태
  
  metadata: {
    ipAddress?: string
    userAgent?: string
    reason?: string
  }
  
  hash: string  // 무결성 검증용
  previousHash?: string  // 이전 이벤트 해시 (체인)
}

interface ChangeLog {
  timestamp: Date
  changedBy: string
  field: string
  oldValue: any
  newValue: any
  reason?: string
}

interface ComplianceReport {
  type: 'TRADE_HISTORY' | 'POSITION_STATEMENT' | 'UNUSUAL_ACTIVITY'
  period: DateRange
  
  trades: {
    date: Date
    orderId: string
    symbol: string
    side: 'BUY' | 'SELL'
    quantity: number
    price: number
    value: number
  }[]
  
  positions: {
    symbol: string
    quantity: number
    averagePrice: number
    marketValue: number
    unrealizedPnL: number
  }[]
  
  unusualActivities: {
    date: Date
    type: string
    description: string
    resolution: string
  }[]
  
  generatedAt: Date
  certifiedBy?: string
}

interface IntegrityReport {
  period: DateRange
  totalEvents: number
  
  verification: {
    hashChainValid: boolean
    noGaps: boolean
    noModifications: boolean
  }
  
  issues: {
    eventId: string
    issue: string
    severity: 'LOW' | 'HIGH'
  }[]
  
  overall: 'PASS' | 'FAIL'
  verifiedAt: Date
}

10. simulation (시뮬레이션 환경) NEW

책임: 실전 배포 전 안전한 테스트 환경 제공

주요 기능

10.1 Paper Trading

createPaperAccount(config: PaperAccountConfig): PaperAccount
  - 가상 계좌 생성
  - 초기 자본금 설정
  - 실시간 시세 연동
  
executePaperTrade(order: Order): PaperOrderResult
  - 가상 주문 실행
  - 실제 호가 기반 체결 시뮬레이션
  - 슬리피지 모델링

10.2 전략 시뮬레이션

runSimulation(config: SimulationConfig): SimulationResult
  - 특정 기간 실전 시뮬레이션
  - 다양한 시장 시나리오 테스트
  - 컨테이너 설정 검증
  
compareStrategies(strategyIds: string[], config: SimulationConfig): ComparisonResult
  - 여러 전략 동시 비교
  - 동일 조건 시뮬레이션
  - 상대 성과 분석

10.3 파라미터 최적화

optimizeParameters(strategyId: string, searchSpace: ParameterSpace): OptimizationResult
  - 그리드 서치
  - 랜덤 서치
  - 베이지안 최적화
  - 유전 알고리즘
  
validateOptimization(result: OptimizationResult, outOfSampleData: MarketData): ValidationResult
  - 과최적화 검증
  - Out-of-sample 테스트
  - 워크포워드 분석

10.4 시나리오 테스트

testScenario(containerId: string, scenario: Scenario): ScenarioResult
  - 특정 시장 상황 시뮬레이션
  - 블랙스완 이벤트 대비
  - 극단 변동성 테스트
  
runMonteCarloSimulation(containerId: string, iterations: number): MonteCarloResult
  - 확률적 시뮬레이션
  - 수익률 분포 추정
  - 최악 시나리오 확률

10.5 전환 지원

promoteToProd(paperAccountId: string, realAccountId: string): MigrationPlan
  - Paper → 실계좌 전환 계획
  - 설정 검증
  - 리스크 재확인
  
cloneContainer(sourceId: string, targetAccountId: string): Container
  - 검증된 설정 복제
  - 실계좌 적용

데이터 모델

interface PaperAccount {
  id: string
  name: string
  
  balance: {
    initialCash: number
    currentCash: number
    positions: Position[]
    totalEquity: number
  }
  
  settings: {
    commissionModel: 'FIXED' | 'PERCENTAGE'
    commissionRate: number
    slippageModel: 'FIXED_BPS' | 'VOLUME_BASED'
    slippageBps: number
  }
  
  isActive: boolean
  createdAt: Date
}

interface SimulationConfig {
  strategyId: string
  startDate: Date
  endDate: Date
  
  initialCapital: number
  universe: string[]
  
  costs: {
    commission: number
    slippage: number
    tax: number
  }
  
  constraints: RiskLimits
  
  rebalanceFrequency: string
}

interface SimulationResult {
  config: SimulationConfig
  
  performance: PerformanceMetrics
  
  equity: {
    date: Date
    value: number
  }[]
  
  trades: {
    date: Date
    symbol: string
    action: 'BUY' | 'SELL'
    quantity: number
    price: number
  }[]
  
  drawdowns: {
    start: Date
    end: Date
    depth: number  // %
    recovery: number  // days
  }[]
  
  completedAt: Date
}

interface ParameterSpace {
  parameters: {
    name: string
    type: 'INTEGER' | 'FLOAT' | 'CATEGORICAL'
    min?: number
    max?: number
    step?: number
    values?: any[]
  }[]
}

interface OptimizationResult {
  strategyId: string
  searchSpace: ParameterSpace
  
  bestParameters: Record<string, any>
  bestMetric: number  // 최적화 목표 지표값
  
  trials: {
    parameters: Record<string, any>
    metrics: PerformanceMetrics
  }[]
  
  optimizationTime: number  // seconds
  
  warnings: {
    overfitting: boolean
    insufficientData: boolean
    unstableParameters: string[]
  }
}

interface MonteCarloResult {
  iterations: number
  
  returns: {
    mean: number
    median: number
    std: number
    percentiles: {
      p5: number
      p25: number
      p75: number
      p95: number
    }
  }
  
  drawdowns: {
    mean: number
    max: number
    percentiles: {
      p95: number
      p99: number
    }
  }
  
  probabilities: {
    profit: number  // 수익 확률
    loss10pct: number  // 10% 이상 손실 확률
    loss20pct: number
  }
  
  distribution: number[]  // 수익률 히스토그램
}

🔄 Phase 3 Advanced Workflow

전략 검증 및 배포 플로우:

1. [simulation] Paper Trading 시작
   ├─ 가상 계좌 생성
   └─ 실시간 시세 연동
   ↓
2. [simulation] 1개월 Paper Trading 실행
   ├─ [strategy] 신호 생성
   ├─ [risk] 리스크 체크
   └─ [simulation] 가상 주문 체결
   ↓
3. [analytics] Paper Trading 성과 분석
   ├─ 수익률, 리스크 지표 계산
   └─ 백테스트 vs 실시간 비교
   ↓
4. [simulation] 파라미터 최적화 (필요 시)
   ├─ 그리드 서치 실행
   └─ Out-of-sample 검증
   ↓
5. [simulation] 스트레스 테스트
   ├─ 극단 시나리오 시뮬레이션
   └─ 몬테카를로 시뮬레이션
   ↓
6. [simulation] 실계좌 전환 계획 생성
   ├─ 설정 검증
   └─ 리스크 재확인
   ↓
7. [audit] 전환 승인 및 기록
   ↓
8. [mgmt] 실계좌 컨테이너 생성
   ↓
9. [scheduler] 자동 실행 시작
   ↓
10. [monitor] 지속적 모니터링
    └─ [audit] 모든 활동 기록

📊 Final System Architecture (All Phases)

┌────────────────────────────────────────────────────────────┐
│                     User Interface                         │
│  (Web/Mobile Dashboard, Reports, Alerts, Admin Panel)      │
└────────────────────────┬───────────────────────────────────┘
                         │
┌────────────────────────┴───────────────────────────────────┐
│                     API Gateway                            │
│              (Authentication, Rate Limiting)               │
└─┬────┬────┬────┬────┬────┬────┬────┬────┬────┬───────────┘
  │    │    │    │    │    │    │    │    │    │
  ▼    ▼    ▼    ▼    ▼    ▼    ▼    ▼    ▼    ▼
┌───┐┌───┐┌───┐┌───┐┌───┐┌───┐┌───┐┌───┐┌───┐┌───┐
│mgt││stg││sch││rsk││dat││ana││mon││aud││sim││bal│
└─┬─┘└─┬─┘└─┬─┘└─┬─┘└─┬─┘└─┬─┘└─┬─┘└─┬─┘└─┬─┘└─┬─┘
  │    │    │    │    │    │    │    │    │    │
  └────┴────┴────┴────┴────┴────┴────┴────┴────┘
                         │
        ┌────────────────┼────────────────┐
        │                │                │
        ▼                ▼                ▼
   ┌─────────┐     ┌─────────┐     ┌─────────┐
   │Message  │     │Database │     │  Cache  │
   │ Queue   │     │ Cluster │     │ (Redis) │
   └─────────┘     └─────────┘     └─────────┘
                         │
            ┌────────────┼────────────┐
            ▼            ▼            ▼
        [Broker      [Broker      [Broker
         API 1]       API 2]       API 3]

Component Legend:

  • mgt: Container Management
  • stg: Strategy Management
  • sch: Scheduler
  • rsk: Risk Management
  • dat: Data Management
  • ana: Analytics
  • mon: Monitor
  • aud: Audit
  • sim: Simulation
  • bal: Balance (Broker Integration)

🎯 Implementation Roadmap

Phase 1 Timeline (3-4 months)

  • Week 1-4: balance + data 기본 구현
  • Week 5-8: mgmt + strategy 핵심 기능
  • Week 9-12: scheduler + risk
  • Week 13-16: 통합 테스트 및 버그 수정

Phase 2 Timeline (2-3 months)

  • Week 1-4: analytics 구현
  • Week 5-8: monitor + 알림 시스템
  • Week 9-12: 대시보드 및 리포팅

Phase 3 Timeline (2-3 months)

  • Week 1-4: audit 시스템
  • Week 5-8: simulation 환경
  • Week 9-12: 최종 통합 및 규제 대응