콘텐츠로 이동

알파 모델

알파 모델은 시장 상태를 인사이트 후보로 변환하는 역할을 합니다. 전체 주문 수명 주기를 관리하는 곳은 아닙니다. 기회가 존재하는 시점을 판단하고 Insight를 반환하는 것이 알파 모델의 역할입니다.

AQE는 전용 수명 주기를 통해 알파 모델을 호출합니다.

  • start()
  • init(asset)
  • generate_insights(symbol)
aq-engine/src/core/alpha/mod.rs
pub trait AlphaModel {
fn version(&self) -> &str;
fn start(&mut self, ctx: &mut dyn StrategyContext);
fn init(&mut self, ctx: &mut dyn StrategyContext, asset: &Asset);
fn generate_insights(&mut self, ctx: &mut dyn StrategyContext, symbol: &str) -> AlphaResult;
}

런타임 전체에 적용되는 설정에는 start()를 사용하세요.

  • 지표 등록
  • 워밍업 봉 설정
  • 심볼별 초기화 전에 필요한 상태 구성

자산별 설정에는 init()을 사용하세요.

  • 심볼별 변수 초기화
  • 자산 메타데이터 읽기
  • 심볼별 런타임 상태 준비

다음 작업에는 generate_insights()를 사용하세요.

  • 최신 이력 읽기
  • 지표나 변수 검사
  • 자산 메타데이터 확인
  • 새 Insight 생성 및 반환

EmaPriceCrossover는 AQE에 구현된 알파입니다. 다음 작업을 수행합니다.

  • ATR 및 EMA 등록
  • 이력 읽기
  • 최신 봉과 이전 봉 확인
  • 자산 메타데이터로 숏 포지션 진입 신호의 허용 여부 판단
  • 진입, TP, SL, TTL 설정이 포함된 인사이트 반환
aq-engine/src/core/alpha/ema_price_crossover.rs
fn generate_insights(&mut self, ctx: &mut dyn StrategyContext, symbol: &str) -> AlphaResult {
let Some(asset) = self.get_asset(ctx, symbol) else {
return AlphaResult::new(None, false, Some(format!("Asset {} not found", symbol)), self.name().to_string());
};
let history = match self.get_history(ctx, symbol) {
Some(history) if history.height() >= 2 => history,
_ => return AlphaResult::new(None, true, Some("Not enough history".to_string()), self.name().to_string()),
};
// derive signal, tp, sl, entry ...
let mut insight = Insight::new(
side,
symbol.to_string(),
StrategyType::Custom(self.name().to_string()),
ctx.timeframe().clone(),
confidence,
None,
);
insight
.set_limit_price(Some(entry))
.set_take_profit_levels(Some(vec![tp]))
.set_stop_loss(Some(sl))
.set_period_unfilled(Some(ttluf as u32))
.set_period_till_tp(Some(ttlf as u32));
AlphaResult::new(Some(insight), true, None, self.name().to_string())
}

TestEntry는 더 단순한 알파 구조를 보여줍니다.

  • 최근 가격 상태 읽기
  • 심볼별 활성 인사이트 수 계산
  • 조건이 충족되면 새 매수 또는 매도 인사이트 생성

따라서 간단한 구현부터 시작하려는 경우 전략 코드 작성에 참고하기 좋습니다.

알파 모델에서 하지 않아야 할 일

섹션 제목: “알파 모델에서 하지 않아야 할 일”

알파 모델에 런타임 전체의 관리 책임을 맡겨서는 안 됩니다. 일반적으로 다음 로직은 알파 내부에 두지 마세요.

  • 최종 수량 산정
  • 거래 주문 제출
  • 청산 로직
  • 손절 발동 조건 검사
  • 거래 시간대 필터링

이러한 작업은 인사이트 파이프에 두는 것이 더 적합합니다.

  • aq-engine/src/core/alpha/mod.rs
  • aq-engine/src/core/alpha/ema_price_crossover.rs
  • aq-engine/src/core/alpha/test_entry.rs