[DOCS] nkaz001 hftbacktest

Wong
2025.11.24조회수 48회

Wong
구독자 22명구독중 4명
안녕하세요. 개발과 경제에 관심있는 ADAS 연구원입니다.
https://github.com/Wong-Woo


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)
# 데이터가 충분하지 않아 가격이 없으면 스킵
...