마켓 메이킹이란?
마켓 메이킹(Market Making)은 매수 호가와 매도 호가를 동시에 제출하여 스프레드(bid-ask spread) 차익을 수익으로 얻는 퀀트 트레이딩 전략입니다. 전통 금융에서는 시타델(Citadel), 버투 파이낸셜(Virtu Financial) 같은 대형 기관이 대표적이며, 암호화폐 시장에서는 개인 트레이더도 API를 활용해 자동매매 봇으로 마켓 메이킹에 참여할 수 있습니다.
마켓 메이커는 시장에 유동성을 공급하는 역할을 하며, 그 대가로 스프레드 수익을 얻습니다. 단순해 보이지만, 재고 리스크 관리와 호가 조정 알고리즘이 전략의 성패를 결정합니다.
마켓 메이킹의 수익 구조
마켓 메이킹의 핵심 수익원은 스프레드 캡처입니다. 예를 들어 비트코인의 매수 호가를 $60,000, 매도 호가를 $60,020에 걸면:
- 매수 체결: $60,000에 구매
- 매도 체결: $60,020에 판매
- 스프레드 수익: $20 (0.033%)
하루에 수백~수천 번 반복하면 소액의 스프레드가 누적되어 상당한 수익을 만들어냅니다. 하지만 가격이 한 방향으로 급변하면 역선택(Adverse Selection) 위험에 노출됩니다.
핵심 개념: 재고 리스크와 호가 편향
마켓 메이킹에서 가장 중요한 개념은 재고 리스크(Inventory Risk)입니다. 매수만 체결되고 매도가 체결되지 않으면 포지션이 한쪽으로 쏠리면서 손실이 발생합니다.
이를 해결하는 대표적인 모델이 Avellaneda-Stoikov 모델입니다:
import numpy as np
def avellaneda_stoikov(mid_price, inventory, gamma, sigma, T, dt):
"""
gamma: 리스크 회피 계수
sigma: 변동성
T: 잔여 시간
inventory: 현재 보유 수량 (양수=롱, 음수=숏)
"""
# 예약 가격 (reservation price)
reservation = mid_price - inventory * gamma * (sigma ** 2) * (T - dt)
# 최적 스프레드
spread = gamma * (sigma ** 2) * (T - dt) + (2 / gamma) * np.log(1 + gamma / 1)
bid = reservation - spread / 2
ask = reservation + spread / 2
return bid, ask
이 모델의 핵심은 재고가 쌓이면 호가를 편향시키는 것입니다. 롱 포지션이 과다하면 매수 호가를 낮추고 매도 호가도 낮춰서 매도 체결 확률을 높입니다.
Python으로 구현하는 기본 마켓 메이킹 봇
아래는 거래소 API를 활용한 기본적인 마켓 메이킹 봇의 구조입니다:
class MarketMaker:
def __init__(self, exchange, symbol, spread_bps=10, order_size=0.01):
self.exchange = exchange
self.symbol = symbol
self.spread_bps = spread_bps # 스프레드 (basis points)
self.order_size = order_size
self.inventory = 0
def calculate_quotes(self, mid_price):
half_spread = mid_price * (self.spread_bps / 10000) / 2
# 재고 편향: 재고가 많으면 호가를 아래로 이동
skew = self.inventory * mid_price * 0.0001
bid = mid_price - half_spread - skew
ask = mid_price + half_spread - skew
return round(bid, 2), round(ask, 2)
def run_cycle(self):
# 1. 기존 주문 취소
self.exchange.cancel_all_orders(self.symbol)
# 2. 중간가 계산
orderbook = self.exchange.fetch_order_book(self.symbol)
mid = (orderbook['bids'][0][0] + orderbook['asks'][0][0]) / 2
# 3. 호가 계산 및 주문
bid, ask = self.calculate_quotes(mid)
self.exchange.create_limit_buy_order(self.symbol, self.order_size, bid)
self.exchange.create_limit_sell_order(self.symbol, self.order_size, ask)
실전에서는 이 기본 구조에 주문 체결 감지, 포지션 한도 설정, 비상 청산 로직을 반드시 추가해야 합니다.
마켓 메이킹 전략의 리스크 관리
마켓 메이킹은 소액의 수익을 자주 얻지만, 한 번의 급등락에 큰 손실을 볼 수 있습니다. 필수적인 리스크 관리 요소들입니다:
| 리스크 요소 | 대응 방법 |
|---|---|
| 재고 리스크 | 최대 포지션 한도 설정, 호가 편향 적용 |
| 역선택 | 변동성 급등 시 스프레드 확대 또는 호가 철회 |
| 급변동 (flash crash) | 서킷브레이커: 일정 손실 시 전체 주문 취소 |
| API 장애 | 웹소켓 재연결 로직, 타임아웃 기반 자동 취소 |
| 수수료 초과 | 메이커 리베이트 활용, 최소 스프레드 기준 설정 |
특히 암호화폐 거래소의 메이커 수수료 리베이트는 마켓 메이킹 수익성에 큰 영향을 미칩니다. 바이낸스의 경우 VIP 등급에 따라 메이커 수수료가 마이너스(리베이트)가 되므로, 스프레드 수익 외에 추가 수익을 얻을 수 있습니다.
마켓 메이킹 vs 다른 퀀트 전략
마켓 메이킹은 변동성 돌파 전략이나 평균 회귀 전략과는 수익 구조가 근본적으로 다릅니다:
- 변동성 돌파/추세추종: 큰 움직임에서 수익, 승률 낮고 손익비 높음
- 평균 회귀: 가격 복귀에 베팅, 중간 승률과 중간 손익비
- 마켓 메이킹: 스프레드 캡처, 높은 승률 + 낮은 건당 수익, 꼬리 리스크 존재
서로 다른 시장 환경에서 수익을 내므로, 여러 전략을 조합하면 포트폴리오 수준의 샤프 비율을 개선할 수 있습니다.
결론: 마켓 메이킹 시작 전 체크리스트
마켓 메이킹은 높은 기술적 난이도를 요구하지만, 체계적으로 접근하면 안정적인 수익원이 될 수 있습니다. 시작 전 반드시 확인할 사항입니다:
- ✅ 거래소의 메이커 수수료 구조 확인 (리베이트 여부)
- ✅ 타겟 종목의 평균 스프레드와 일일 거래량 분석
- ✅ 최대 포지션 한도와 일일 손실 한도 사전 설정
- ✅ API 속도 제한(Rate Limit)과 웹소켓 안정성 테스트
- ✅ 반드시 소액 실전 테스트 후 자금 규모 확대
단순한 스프레드 전략부터 시작해 점진적으로 Avellaneda-Stoikov 모델이나 머신러닝 기반 호가 조정으로 발전시켜 나가는 것을 권장합니다.