P1 데이터 자산화 (BE: marketflow 확장 또는 신규 pricehistory 패키지)
클래스
레이어
역할
DailyPrice
domain
일봉 OHLCV Rich Domain Entity (룩어헤드 방지 불변식 포함)
PriceHistoryRepository
domain
일봉 영속화 interface
PriceBackfillGateway
domain
외부 소스(토스/증권사)에서 과거 일봉 수집 interface
BackfillPriceHistoryUseCase
application
종목별 과거 N년 일봉 백필 오케스트레이션
PriceHistoryRepositoryImpl
infrastructure
JPA 구현 (daily_prices 테이블)
P2 엣지 검증 (ml: backtest 엔진 확장)
모듈
역할
입력 → 출력
CostModel
수수료·세금·슬리피지 반영
체결 의도 → 실효 체결가·비용
BacktestEngine
룩어헤드 차단 워크포워드
OHLCV 시계열 + 전략 → 거래 로그·수익곡선
EdgeReport
엣지 유의성 판정
수익곡선 → 초과수익·t검정·승률·MDD·샤프
P3 리스크 관리 (ml + BE 공통 규칙)
모듈
역할
PositionSizer
자본 대비 종목 비중 산출 (고정비율/변동성 기반)
RiskGate
손절·일일 손실 한도·MDD 한도 검사
P4 실행 자동화 (BE: 기존 order 재사용 + 신규 제안·승인)
기존 order 도메인을 그대로 재사용한다 (ADR-003). TossOrderGatewayImpl·OrderDomainService#placeOrder·OrderStatus 전이·PlaceOrderUseCase는 이미 토스 주문(매수·매도·정정·취소)을 구현해 동작 중이다. 신규 증권사 Gateway·신규 Order 도메인을 만들지 않는다.
P4 신규 작업은 신호→제안→수동 승인 게이트뿐이다 (ADR-005).
클래스
레이어
역할
OrderProposal
domain
주문 제안 Rich Domain Entity (제안·승인·거부 상태)
OrderProposalRepository
domain
제안 영속화 interface
PaperExecutor, PaperFillRepository
domain
모의 체결·가상 포지션 (paper 모드, 토스 호출 없음)
ProposeOrderUseCase
application
신호+RiskGate 통과 주문을 제안으로 생성
ApproveOrderProposalUseCase
application
승인 시 모드 분기 — paper=PaperExecutor, live=기존 PlaceOrderUseCase
컨벤션: live 모드의 토스 주문은 외부 시스템 호출이므로 기존 OrderGateway(TossOrderGatewayImpl) 사용. 기본 모드는 paper(ADR-006). 신호→제안→승인→집행 흐름은 presentation Controller → UseCase → DomainService 준수.
sequenceDiagram
participant Runner as 검증 실행기
participant Engine as BacktestEngine
participant Prices as daily_prices
participant Cost as CostModel
participant Edge as EdgeReport
Runner->>Engine: run(symbols, 3years, strategy)
Engine->>Prices: load(symbol, t0..t)
loop 각 시점 t (룩어헤드 차단)
Engine->>Engine: signal(closes[..t])
Engine->>Cost: applyCost(intendedFill)
Cost-->>Engine: 실효 체결가·비용
end
Engine->>Edge: summarize(equityCurve, trades)
Edge-->>Runner: 초과수익·t값·승률·MDD·샤프
ERD
erDiagram
daily_prices {
bigint id PK
varchar symbol
date trade_date
decimal open
decimal high
decimal low
decimal close
bigint volume
}
backtest_runs {
bigint id PK
varchar strategy
date period_start
date period_end
decimal excess_return
decimal sharpe
decimal mdd
decimal t_stat
}
order_proposals {
bigint id PK
varchar symbol
varchar side
decimal price
int quantity
varchar status
varchar source_signal
datetime proposed_at
datetime decided_at
}
paper_fills {
bigint id PK
bigint proposal_id
varchar symbol
varchar side
decimal fill_price
int quantity
datetime filled_at
}
daily_prices는 (symbol, trade_date) unique. orders는 기존 테이블 재사용(신규 아님). order_proposals·paper_fills만 신규. DDL 전문·정밀도는 각 티켓에 둔다.