콘텐츠로 이동

PaperBroker와 모의 거래

PaperBroker는 다음을 위한 AQE의 주문 실행 시뮬레이터입니다.

  • 백테스트
  • 모의 거래
  • 인사이트 수명 주기 동작 검증

다음 작업을 처리합니다.

  • 주문 제출
  • 체결
  • 취소
  • 청산 요청
  • 브래킷 레그
  • 트레일링 스톱 실행
  • 거래 이벤트 발생
  • 계좌 상태 및 계좌 평가액

또한 주문 금액이 매수 가능 금액을 초과하는 등 모의 계좌가 유효하지 않은 상태가 되지 않도록 방지합니다.

YahooFinanceDataFeed는 다음을 제공합니다.

  • 종목 메타데이터
  • 과거 봉
  • 최신 호가
  • 최신 봉
  • 실시간 봉 스트림 구독

이는 과거 데이터 리서치와 모의 거래 중심 런타임 워크플로에서 사용하는 기본 시장 데이터 경로입니다.

AQE는 비용 차감 전 거래 손익과 자산별 수수료를 별도로 모델링합니다. Asset.fees에는 다음이 포함됩니다.

  • 롱 및 숏 포지션 진입을 위한 commission.entry.long과 commission.entry.short
  • 롱 및 숏 포지션 청산을 위한 commission.exit.long과 commission.exit.short
  • 롱 및 숏 포지션의 오버나이트 금융 비용 또는 수익을 위한 swap.long과 swap.short

롱과 숏은 개별 주문의 매수·매도 여부가 아니라 포지션 방향을 뜻합니다. 새 포지션을 여는 매수 주문에는 롱 진입 수수료가, 매도 주문에는 숏 진입 수수료가 적용됩니다. 포지션을 청산할 때 AQE는 원래 포지션 방향의 청산 수수료와 스왑을 적용합니다. 따라서 청산 주문이 매수이더라도 commission.exit.short는 숏 포지션의 청산 수수료입니다.

수수료와 스왑은 동일한 공개 수수료 종류 열거형인 AssetFee를 사용합니다. 사용 가능한 수수료 종류는 다음과 같습니다.

  • AssetFee::None
  • AssetFee::Points(points): 포인트 기반 스왑 계산에 사용
  • AssetFee::PercentageFee(rate): 0.001은 거래 명목 금액의 0.1%를 의미
  • AssetFee::FixedFee(amount): 체결당 고정 금액
  • AssetFee::PerContractFee(amount): 거래 수량을 곱한 금액
  • AssetFee::PercentagePerContractFee(rate): price * contract_size * quantity * rate로 적용

수수료 계산은 양수인 PercentageFee, FixedFee, PerContractFee, PercentagePerContractFee 값을 허용합니다. Points는 스왑에 필요하므로 공유 열거형에 포함되어 있습니다. 수수료 필드에서 사용하면 AQE는 0으로 처리합니다.

스왑 값은 양수 또는 음수일 수 있습니다. 양수 스왑은 손익을 늘리고 음수 스왑은 손익을 줄입니다. 모의 거래에서 AQE는 비용을 반영한 청산 순손익을 다음과 같이 계산합니다.

gross PnL + swap - entry commission - exit commission

모의 주문 실행 브로커를 만들 때 with_asset_fees(...)를 사용하세요. AQS에서 생성한 백테스트도 같은 경로를 사용합니다.

use aq_engine::core::broker::paper_broker::PaperBroker;
use aq_engine::core::broker::types::{
AccountType, AssetCommissionFees, AssetFee, AssetFees, AssetSideFees, AssetSwapFees,
};
let fees = AssetFees {
commission: AssetCommissionFees {
entry: AssetSideFees {
long: AssetFee::PercentageFee(0.0005),
short: AssetFee::PercentageFee(0.0007),
},
exit: AssetSideFees {
long: AssetFee::FixedFee(1.0),
short: AssetFee::FixedFee(1.0),
},
},
swap: AssetSwapFees {
long: AssetFee::PerContractFee(-3.25),
short: AssetFee::PercentagePerContractFee(0.000041),
},
..AssetFees::default()
};
let execution = PaperBroker::new(AccountType::Paper, 100_000.0, 1).with_asset_fees(fees);

AssetFees의 기존 entry 및 exit 필드는 방향별 수수료 객체가 비어 있을 때 호환성 대체값으로 여전히 허용됩니다. 새 구성에서는 commission 및 swap 객체를 사용해야 합니다.

  • aq-engine/src/core/broker/paper_broker.rs
  • aq-engine/src/core/broker/types/mod.rs
  • aq-engine/src/core/broker/data_feeds/yahoo.rs