[DOCS] nkaz001 hftbacktest
개요
HFT 백테스팅 프레임워크
주문 대기 시간, 주문 입력 지연 시간, 주문 대기열 위치가 고려된 주문 체결 시뮬레이션
특징
Numba JIT function 사용
파이썬 코드로 작성되지만 Numba JIT 컴파일러 사용으로 C/C++급 연산속도 도달 가능
틱 수준 가격변화 구현 / 데이터 피드 업데이트 시간 주기 커스터마이징 가능
풀사이즈 오더북 구현
데이터 피드 및 주문 시 레이턴시 반영 가능
주문 대기열 구현
다양한 종목과 거래소를 대상으로 백테스팅 가능
러스트 환경에서 실시간 트레이딩 봇 배포 서비스 가능
예제코드
import numpy as np
from numba import njit
from hftbacktest import (
BacktestAsset,
HashMapMarketDepthBacktest,
COL_PRICE,
COL_QTY,
COL_SIDE,
GTX, # Post-Only (Maker 주문)
LIMIT, # 지정가 주문
BUY,
SELL,
Linear, # 선형 지연 모델
ConstantLatency # 상수 지연 모델
)
# ---------------------------------------------------------
# 1. (임시) 테스트용 가상 데이터 생성 함수
# 실제 사용 시에는 바이낸스 틱 데이터를 수집하여 .npz로 변환해야 합니다.
# ---------------------------------------------------------
def generate_dummy_data(filename):
print("가상 데이터 생성 중...")
# 1시간 분량의 데이터 (대략적인 구조만 모방)
# 실제 데이터는 timestamp(us), local_timestamp, type, price, qty, ... 등의 컬럼이 필요함
# 간단한 사인파 형태로 가격이 움직인다고 가정
t = np.arange(0, 3600 * 1_000_000, 100_000, dtype=np.int64) # 0.1초 간격
price = 1000 + 10 * np.sin(t / 10_000_000)
# hftbacktest용 데이터 배열 생성 (rows, cols)
# 컬럼 포맷은 hftbacktest 문서 참조 (일반적으로 6개 이상의 컬럼)
data = np.zeros((len(t), 6), dtype=np.float64)
# Event Type 1: Depth Update (매우 단순화됨)
data[:, 0] = 1 # Event Type
data[:, 1] = t # Exchange Timestamp
data[:, 2] = t + 1000 # Local Timestamp (1ms latency)
data[:, 3] = 1 # Side (의미 없음, 스냅샷 갱신용)
data[:, 4] = price # Price
data[:, 5] = 1.0 # Qty
# 데이터를 npz 포맷으로 저장
# 실제로는 ask/bid가 나뉘어 들어오지만, 예제 구동을 위해 단순화
np.savez_compressed(filename, data=data)
print(f"{filename} 생성 완료.")
# ---------------------------------------------------------
# 2. 전략 로직 (Numba JIT 컴파일)
# ---------------------------------------------------------
@njit
def grid_maker_strategy(hbt):
# 설정값
half_spread = 0.5 # 중간 가격 대비 0.5만큼 벌려서 주문
grid_interval = 1_000_000 # 1초 (마이크로초 단위)
order_qty = 0.01 # 주문 수량
# 백테스트 시작
while hbt.elapse(grid_interval) == 0:
# 현재 시장가 확인 (Best Bid/Ask)
# 데이터가 충분하지 ...