[STK3-05] /backtest API

작업 내용 (설계 의도)

변경 사항

  • GET /backtest/{symbol}?horizon=5&lookback=120.
  • BacktestResult(samples·승률·평균수익·edge) + 감성 미포함 note 반환.

의존

  • 선행: STK3-03
  • 후행: STK3-07

롤백

  • 라우터 비활성.

다이어그램

처리 흐름

sequenceDiagram
    participant C as Client
    participant M as main.py
    participant BT as backtest.py
    participant Toss as 토스 시세 API
    C->>M: GET /backtest/{symbol}?horizon=5&lookback=120
    M->>Toss: 종가 데이터 lookback일 조회
    Toss-->>M: prices[]
    M->>BT: run_backtest(prices, horizon, warmup=20)
    BT-->>M: BacktestResult
    M-->>C: {samples, win_rate, avg_return, edge, note}

클래스 의존

flowchart LR
    subgraph Presentation["Presentation"]
        router["main.py\n/backtest/{symbol} 라우터"]
    end
    subgraph Domain["ML 도메인"]
        bt["backtest.py\nrun_backtest()"]
        sig["signal.py\nscore()"]
    end
    subgraph External["External"]
        toss["토스 캔들 API"]
    end
    router --> bt
    bt --> sig
    router --> toss

테스트 케이스

  • horizon=5이면 수익률이 5일 후 종가 기준으로 계산된다.
  • lookback=60이면 60일 데이터만 사용되어 samples가 줄어든다.
  • 응답에 samples·overall_win_rate·signal_win_rate·edge·note 필드가 모두 포함된다.
  • lookback이 warmup+horizon보다 작으면 samples=0이 반환되고 에러가 발생하지 않는다.
  • note 필드에 “뉴스 감성 미포함” 문구가 포함된다.