[3] rust crypto_trading_server

wangki·2026년 3월 5일

trading_project

목록 보기
4/6
post-thumbnail

개요

백테스트 시, 시각적으로 전략을 디버깅하기 위해서 웹페이지에 백테스트 결과를 차트에 그려넣으려고 한다. 하나의 응답에 캔들을 포함한 모든 데이터를 포함했다. 속도가 너무 느려서 이를 개선하고자 한다.

AoS(Array of Structures) -> SoA(Structure of Arrays)

변경하는 이유는 ?

  1. json으로 직렬화시 필드명의 중복 제거
  2. 캐시 효율성 증가

요약

구분캔들 수 (1분봉)변경 전 (AoS)변경 후 (SoA)성능 향상 (절감 시간)
Case 186,400개3.22s2.56s0.66s (약 20.5%↓)
Case 2540,000개20.55s15.52s5.03s (약 24.5%↓)

변경 코드

// 이전 구조체 
/// 백테스트 최종 결과
#[derive(Debug, Clone)]
pub struct BackTestResult {
    pub metrics: PerformanceMetrics,
    pub trades: Vec<TradeRecordInternal>,
    pub equity_curve: Vec<EquityCurveData>,
    pub signals: Vec<SignalRecordInternal>,
    pub candles: Vec<CandleData>,  // ✅ 모든 캔들 데이터 포함
 }
// 변경 구조체 
/// 백테스트 최종 결과
#[derive(Debug, Clone)]
pub struct BackTestResult {
    pub metrics: PerformanceMetrics,
    pub trades: Vec<TradeRecordInternal>,
    pub equity_curve: Vec<EquityCurveData>,
    pub signals: Vec<SignalRecordInternal>,
    pub flattened_candles: FlattenedCandles,  // ✅ 모든 캔들 데이터 포함
}

#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct FlattenedCandles {
    pub times: Vec<i64>,
    pub opens: Vec<f64>,
    pub highs: Vec<f64>,
    pub lows: Vec<f64>,
    pub closes: Vec<f64>,
    pub volumes: Vec<f64>,
}

impl From<Vec<Candle>> for FlattenedCandles {
    fn from(candles: Vec<Candle>) -> Self {
        let len = candles.len();
        // 메모리를 미리 할당하여 성능 최적화 (중요!)
        let mut times = Vec::with_capacity(len);
        let mut opens = Vec::with_capacity(len);
        let mut highs = Vec::with_capacity(len);
        let mut lows = Vec::with_capacity(len);
        let mut closes = Vec::with_capacity(len);
        let mut volumes = Vec::with_capacity(len);

        for c in candles {
            times.push(c.open_time.timestamp_millis());
            opens.push(c.open);
            highs.push(c.high);
            lows.push(c.low);
            closes.push(c.close);
            volumes.push(c.volume);
        }

        Self { times, opens, highs, lows, closes, volumes }
    }
}

변경 전

변경 후

결론

현재 프로토타입으로 빠르게 만들고 있으므로 응답에 다 때려 박았는데 이것도 최적화해야 한다. 먼저 최적화된 인프라를 구축한 다음에 빠르게 전략을 만들어볼 예정이다.
아무리 그래도 15초가 걸리는건 좀 아닌거 같은데... ai...

0개의 댓글