# Avellaneda-Stoikov 모델을 차익거래에 적용하기

> 마켓메이킹 모델 Avellaneda-Stoikov를 Hyperliquid HIP-3와 국내 주식 현물의 헤지 차익거래에 옮기며, 재고와 기준 가격과 스큐를 다시 정의한 과정을 정리합니다.

- Canonical URL: https://jerrylog.dev/ko/blog/avellaneda-stoikov-for-arbitrage
- Date: 2026-10-18
- Author: Jerry
- Language: ko
- Topic: 금융 / 트레이딩 시스템
- Tags: market-making, avellaneda-stoikov, arbitrage, hummingbot, hyperliquid

---

## 배경

### 거래 구조

- maker 쪽: Hyperliquid HIP-3의 xyz:SMSN(삼성전자), xyz:SKHX(SK하이닉스) perp에 fair 가격보다 높게 매도 호가를 사다리(ladder) 형태로 건다
- 헤지 쪽: maker 체결이 나면 KIS에서 같은 수량의 현물(005930, 000660)을 매수한다
- fair 가격: KIS 현물 호가를 USD/KRW 환율로 바꿔 계산한다. 환율은 은행 고시 환율과 업비트 USDT-KRW를 섞은 값을 쓴다
- 왕복 비용은 24.24bp로 잡았다. 대부분이 국내 주식 매도 시 붙는 증권거래세라 줄일 수 없는 하한이다
- 처음 구조는 한 방향 누적기였다. 캡까지 쌓은 뒤에는 포지션을 들고만 있었다

### basis가 유지되는 이유

이 전략은 basis가 한동안 벌어진 채로 유지된다는 전제 위에서 설계했습니다. hummingbot은 0.5초에서 1초 간격으로 루프를 돌며 호가를 다시 계산하기 때문에, 가격이 순간적으로 튀었다 돌아오는 차이를 잡기에는 불리합니다. 그런 차이는 다음 루프에서 호가를 고치기 전에 사라지는 경우가 많습니다.

반면, 현물과 perp 사이에서는 basis가 자주, 오래 유지됩니다. KIS의 SK하이닉스 현물과 Hyperliquid의 SKHX perp 사이도 마찬가지였습니다. perp 쪽 마켓메이커가 자기 재고를 기준으로 fair를 옮기기 때문입니다.

HIP-3 perp에서 마켓메이커의 상대편은 대부분 일반 사용자이고, 이들의 주문은 롱으로 쏠리는 경우가 많습니다. 롱 주문을 받아 준 마켓메이커에게는 숏 재고가 쌓이고, 마켓메이커는 재고를 줄이려고 fair를 위로 올립니다. 그래서, 국내 현물 가격이 그대로여도 한쪽으로 치우친 주문 흐름이 이어지는 동안 perp의 fair는 현물에서 조금씩 멀어집니다(drift). 유동성이 얇은 시장이라 이 차이는 빨리 메워지지도 않습니다.

마켓메이커가 재고에 따라 기준 가격을 옮기는 방식은 뒤에서 다룰 A&S의 reservation price와 같은 방향입니다. 이 전략은 상대편 마켓메이커의 재고 스큐가 만든 basis를 받는 쪽에 섭니다. 그래서, 가격을 쫓아가며 basis를 잡기보다 fair보다 높은 자리에 maker 매도 사다리를 미리 걸어 두고 perp 가격이 그 자리까지 올라오기를 기다렸습니다.

### 청산이 수동인 문제

- 진입은 자동이지만 청산은 두 거래소를 손으로 되감아야 했다
- 느리고 위험하며, basis가 유리해지는 구간(마이너스 프리미엄)을 놓친다
- hummingbot의 ladder executor와 원래 쓰던 자체 엔진 모두 자동 청산 기능이 없었다
- 별도의 청산 단계를 만드는 대신, 진입과 청산을 한 호가 표면의 양면으로 보기로 했다. 이 관점에서 A&S와 만났다

## Avellaneda-Stoikov 모델 요약

### 문제 설정

- 원 논문(2008)의 질문: 한 종목의 마켓메이커가 재고 위험을 지면서 매수, 매도 호가를 어디에 걸어야 하는가
- 가정: mid 가격은 산술 브라운 운동을 따르고, 내 호가가 mid에서 $\delta$만큼 떨어져 있을 때 체결 강도는 $\lambda(\delta) = A e^{-\kappa \delta}$로 줄어든다
- 목표: 기간 끝($T$)의 부(wealth)에 대한 지수 효용을 최대화한다. 위험 회피 계수는 $\gamma$

### reservation price와 optimal spread

재고가 $q$일 때 마켓메이커가 무차별하게 느끼는 가격(reservation price)은 mid에서 재고 반대 방향으로 밀려납니다.

$$
r(s, q, t) = s - q \gamma \sigma^2 (T - t)
$$

호가 간격은 위험 회피와 주문 도착 강도로 정해집니다.

$$
\delta^a + \delta^b = \gamma \sigma^2 (T - t) + \frac{2}{\gamma} \ln\left(1 + \frac{\gamma}{\kappa}\right)
$$

- 첫 항은 재고 위험에 대한 보상, 둘째 항은 체결 확률과 마진 사이의 균형이다
- bid, ask는 $r$을 중심으로 대칭으로 건다. 롱 재고가 많으면 중심이 내려가 매도는 쉽고 매수는 어려워진다

> **Diagram:** 재고 q에 따른 bid, ask, reservation price (γ=0.5, κ=1.5, σ=1, τ=1)
> 
> 재고 q가 늘어날수록 reservation price가 mid 아래로 내려가고, bid와 ask가 같은 간격(δ=1.65σ)을 유지한 채 함께 내려간다. γ=0.5, κ=1.5, σ=1, τ=1.

### hummingbot 구현에서 달라진 점

- $\sigma$: 논문의 $\sigma^2$ 대신 tick 단위 표준편차 $\sigma$를 쓴다. 코드 주석은 분산을 가격에서 빼면 단위가 맞지 않기 때문이라고 설명한다. 당시에는 이 설명을 그대로 받아들였는데, 맞지 않는 설명이었다. 뒤의 설계 재검토에서 다룬다
- $T - t$: 기간을 정하지 않는 모드에서는 1로 고정한다
- $q$: 기초 자산 수량이 아니라 목표 대비 비율로 정규화한다. $q = \mathrm{clip}\left(\frac{\text{balance} - \text{target}}{\text{inventory}}, -1, 1\right)$
- min spread: 계산한 호가가 mid에서 최소 간격 안으로 들어오지 못하게 막는다
- $\eta$: 재고가 쌓인 쪽 주문 크기를 $e^{-\eta q}$로 줄인다
- 이 네 가지를 순수 함수(as_policy)로 뽑아 hummingbot 원본과 같은 값을 내는지 골든 테스트로 고정했다

## 차익거래로 옮길 때 바뀌는 것

### A&S에서 빌린 것

*이 글은 아직 작성중입니다. 완성되면 이어서 공개합니다.*
