Avellaneda-Stoikov 마켓메이킹 전략 완전 분석 — 수식·재고위험·스프레드 최적화 원리
암호화폐 거래소의 유동성 공급자라면 반드시 알아야 할 Avellaneda-Stoikov 모델. 예약가격(reservation price)과 최적 스프레드 공식을 단계별로 해부하고, Hummingbot이 크립토 시장에 맞게 어떻게 변형했는지 γ·κ·η 세 파라미터 계산까지 상세히 분석한다.
마켓메이커는 왜 수식이 필요한가
암호화폐 거래소에서 마켓메이커는 매수·매도 호가를 동시에 제시해 유동성을 공급한다. 문제는 재고위험(inventory risk)다. 한쪽 방향 주문만 체결되면 포지션이 한쪽으로 쏠리고, 시장이 그 방향으로 움직이면 손실이 난다.
이 문제를 수학적으로 해결한 것이 2006년 Avellaneda와 Stoikov가 발표한 모델이다. Hummingbot은 이 모델을 암호화폐 시장에 맞게 개조해 avellaneda_market_making 전략으로 구현했다.

원본 모델: 두 핵심 방정식
예약가격 (Reservation Price)
r(s, q, t, σ) = s - q · γ · σ² · (T - t)
| 변수 | 의미 |
|---|---|
| s | 현재 중간가격(mid price) |
| q | 보유 인벤토리(기본 자산 수량, 양수=롱, 음수=숏) |
| γ (감마) | 위험회피 계수 (높을수록 재고위험에 민감) |
| σ (시그마) | 자산 변동성 |
| T - t | 잔여 시간 (종료시각까지 남은 시간) |
직관: 인벤토리 q가 양수(기본 자산 과다 보유)이면 예약가격이 중간가격보다 낮아진다. 즉 봇이 더 낮은 가격에서도 팔 의향이 있다는 뜻 — 재고를 줄이고 싶기 때문이다. 반대로 q가 음수(기본 자산 부족)이면 예약가격이 올라가 매수를 유도한다.
최적 스프레드 (Optimal Spread)
δᵃ + δᵇ = γ · σ² · (T - t) + (2/γ) · ln(1 + γ/κ)
| 변수 | 의미 |
|---|---|
| δᵃ | 매도 호가와 예약가격의 차이 |
| δᵇ | 예약가격과 매수 호가의 차이 |
| κ (카파) | 주문장 유동성 파라미터 (깊은 오더북일수록 큰 값) |
직관: 변동성이 높을수록, 그리고 잔여 시간이 길수록 스프레드를 넓혀야 한다. 오더북이 얕으면(κ가 작으면) 체결 가능성이 낮아지므로 역시 스프레드를 넓힌다.
Hummingbot의 네 가지 개조
원본 모델은 주식 시장(유한 거래일, 정규분포 가격 프로세스)을 가정한다. 24시간 무휴로 돌아가는 암호화폐 봇에 그대로 적용하면 맞지 않는다. Hummingbot 팀이 도입한 수정 사항:
- η (에타) 파라미터 추가 — 목표 인벤토리에서 멀어질수록 주문 크기를 줄이는 decay 함수 (2018 Stanford 논문 참고)
- vol_to_spread_multiplier — 변동성 임계값 이상에서 스프레드를 비례 확대하는 안전장치
- 파라미터 재계산 — 사용자가 지정한 min/max 스프레드로부터 γ와 κ를 역산
- 반복 closing_time (T) — 봇이 무기한 실행되므로 주기적으로 T를 리셋하고 파라미터를 재보정
γ (감마) 역산: 사용자 설정에서 위험회피 계수 구하기
사용자는 γ를 직접 입력하지 않는다. 대신 min_spread와 max_spread를 입력하면 봇이 γ를 역산한다.
인벤토리 q가 양수일 때, 예약가격과 스프레드 공식을 결합하면:
γ_max = (max_spread - min_spread) / (2 · |q| · σ²)
이 γ_max에 IRA(Inventory Risk Aversion, 0~1 사이 계수)를 곱한다:
γ = γ_max × IRA
IRA = 1: 최대 위험회피. 인벤토리 편중 시 예약가격이 크게 움직여 호가를 공격적으로 조정.
IRA = 0: 위험 중립. 재고 불균형을 무시하고 중간가격 중심으로 대칭 호가.
κ (카파) 역산: 초기 스프레드 조건
t=0(봇 시작 시점)에서 스프레드가 max_spread로 시작하도록 κ를 결정한다. 초기 스프레드 타겟:
(δᵃ + δᵇ)_t=0 = (2 - IRA) × max_spread + IRA × min_spread
IRA=1이면 max_spread + min_spread, IRA=0이면 2×max_spread가 된다.
κ를 구하는 방정식:
κ = γ / [exp{((δᵃ + δᵇ)_t=0 × γ - σ²γ²) / 2} - 1]
이 κ값이 주문장의 유동성 깊이를 반영하는 파라미터로 작동한다.

η (에타): 인벤토리 decay로 주문 크기 조절
목표 인벤토리에서 멀어질수록 주문 크기를 줄여 추가 편중을 방지한다:
q_decay = 총 기본 자산 인벤토리 / IRA
η = 1 / q_decay
예: 총 인벤토리 100 BTC, IRA=0.5이면 q_decay=200, η=0.005. 인벤토리가 목표에서 멀수록 주문 크기 지수가 감쇠한다.
IRA → 0의 극한: 순수 마켓메이킹과의 관계
IRA를 0으로 보내면 γ도 0으로 수렴한다. 이때:
- 예약가격 r → 중간가격 s (재고 편중 무시)
- 스프레드 → 2 × max_spread (항상 최대 스프레드 유지)
- 매수·매도 호가가 중간가격에 대칭
이것은 단순 pure_market_making 전략과 동일하다. 즉 순수 마켓메이킹은 Avellaneda-Stoikov 모델의 특수한 극한 케이스다.
실전 파라미터 설정 가이드
| 상황 | 권장 IRA | 스프레드 설정 |
|---|---|---|
| 변동성 높음, 재고 민감 | 0.7~1.0 | min 0.3%, max 1.5% |
| 변동성 보통, 균형 추구 | 0.3~0.6 | min 0.1%, max 0.8% |
| 변동성 낮음, 공격적 유동성 | 0.0~0.2 | min 0.05%, max 0.3% |
핵심 직관: IRA를 높이면 봇이 재고 균형에 집착해 수익 기회를 일부 포기하지만 꼬리 위험(tail risk)이 줄어든다. 낮추면 더 많은 체결을 노리지만 시장이 급격히 움직일 때 포지션이 크게 쏠릴 수 있다.
정리
Avellaneda-Stoikov 모델의 핵심은 두 가지다. 첫째, 예약가격으로 호가 중심을 재고 상태에 따라 동적으로 이동시킨다. 둘째, 변동성과 오더북 깊이를 반영해 스프레드를 최적화한다. Hummingbot의 개조 버전은 여기에 무한 실행 적응(반복 T), 주문량 decay(η), 직관적 파라미터 역산(IRA → γ, κ)을 더해 실전 크립토 봇으로 발전시켰다.
퀀트 마켓메이킹에 처음 입문한다면 IRA=0.5, min_spread=0.1%, max_spread=0.8%에서 시작해 실전 데이터를 보며 조정하는 것을 권장한다.
💬 댓글 0
댓글을 불러오는 중…