← 기사 목록으로
July 14, 2026
5분 소요

얼버무리지 않는 알름그렌-크리스: 오후 한나절이면 구현할 수 있는 최적 집행

얼버무리지 않는 알름그렌-크리스: 오후 한나절이면 구현할 수 있는 최적 집행
#execution
#Almgren-Chriss
#market impact
#optimal execution
#TWAP
#퀀트
#python
#크립토

Almgren과 Chriss(2001)의 "Optimal execution of portfolio transactions"(Journal of Risk 3(2), 5–39)는 아마도 집행 연구 분야에서 가장 많이 인용되면서도 가장 제대로 구현되지 않는 논문일 것이다. 세상에 떠도는 "알름그렌-크리스" 코드 대부분은 주석 블록만 그럴듯하게 붙은 TWAP 스케줄러에 불과하다. 이를 다루는 블로그 글 대부분은 유도 과정을 건너뛰고 sinh 함수를 손짓으로 넘긴 뒤, 실제 프로덕션에서 정말 중요한 부분 — 파라미터가 어디서 나오는가 — 는 아예 건드리지 않는다.

이 글은 그 전체를 다룬다. 모델의 가정을 정직하게 명시한다. 닫힌 형태의 궤적을 단언이 아니라 실제로 유도한다. 효율적 프론티어와 위험회피 파라미터를 고르는 방법을 다룬다. 그리고 세 가지 입력값 — 일시적 임팩트 η\eta, 영구적 임팩트 γ\gamma, 변동성 σ\sigma — 을 바이낸스 오더북과 체결 데이터로부터 보정하는 방법을, 실제로 동작하는 파이썬 코드와 함께 왜 적합이 노이즈투성이인지 솔직한 논의까지 곁들여 다룬다. 이것은 집행 분야 전체를 떠받치는 지적 골격이다. TWAP, VWAP, POV는 이 모델의 특수한 경우이거나 발견적(heuristic) 사촌뻘이며(TWAP, VWAP, POV: 모두가 쓰는 집행 알고리즘 참조), 강화학습 스케줄러나 신경망 임팩트 모델 같은 현대적 ML 접근법들은 지금부터 우리가 명시할 바로 그 가정들을 완화하려는 시도다.

설정: 모델이 실제로 가정하는 것

당신은 자산 XX 단위(예: BTC 100개)를 보유하고 있고, 시각 TT까지 전량 청산해야 한다. [0,T][0, T]를 길이 τ=T/N\tau = T/NNN개 구간으로 나눈다. 결정 변수는 보유량 궤적 x0=X,x1,,xN=0x_0 = X, x_1, \dots, x_N = 0이며, 구간 kk에서 체결되는 거래량은 nk=xk1xkn_k = x_{k-1} - x_k이다.

모델 전체를 떠받치는 가정은 세 가지다.

1. 산술 랜덤워크. 교란되지 않은 가격은 다음을 따른다.

Sk=Sk1+στξkτg ⁣(nkτ),S_k = S_{k-1} + \sigma \sqrt{\tau}\, \xi_k - \tau\, g\!\left(\frac{n_k}{\tau}\right),

여기서 ξk\xi_k는 i.i.d. 표준정규분포이고 σ\sigma절대 변동성(단위 시간1/2^{1/2}당 달러, 퍼센트가 아니다)이다. 기하가 아니라 산술인 이유는, 몇 시간 규모에서는 그 차이가 무시할 만하고 산술 워크가 대수를 선형-이차식으로 유지해주기 때문이다. 드리프트는 없다. Almgren과 Chriss는 드리프트 항을 논의하지만, 하루 안 청산에서 4시간짜리 알파 추정치는 거의 언제나 노이즈에 불과하므로 이를 0으로 두는 것이 정직한 기본값이다.

2. 선형 영구 임팩트. g(v)=γvg(v) = \gamma v: 속도 vv로 거래하면 가격이 영구적으로, 비례적으로 이동하며 그 이동은 결코 감쇠하지 않는다. 매도하는 모든 단위가 미드가를 영원히 γ\gamma만큼 끌어내린다. 조악해 보일 수 있지만, 이를 선형으로 유지해야 하는 심오한 이유가 있다. Huberman과 Stanzl(2004)은 거래 규모에 대해 비선형인 영구 임팩트가 양의 기대수익을 내는 왕복 전략 — 즉 가격 조작 — 을 허용함을 증명했다. 선형 영구 임팩트는 편의를 위한 단순화가 아니라, 이 모델 부류에서 무차익거래를 보장하는 유일한 선택이다.

3. 선형 일시적 임팩트. 구간 kk에서 실제로 받는 가격은

S~k=Sk1h ⁣(nkτ),h(v)=ϵsgn(v)+ηv.\tilde{S}_k = S_{k-1} - h\!\left(\frac{n_k}{\tau}\right), \qquad h(v) = \epsilon\, \mathrm{sgn}(v) + \eta v.

ϵ\epsilon은 매수-매도 스프레드의 절반과 수수료를 포착하고, η\eta는 속도 vv로 유동성을 요구할 때 드는 한계비용의 기울기다. 일시적 임팩트는 오직 자신의 체결에만 영향을 미치며 즉시 사라진다 — 다음 자식 주문 전에 오더북이 완전히 재충전된다는 뜻이다. "선형", "즉시", "완전히"라는 세 단어 모두 실제 시장에서는 틀렸으며, 마지막 절에서 그것이 얼마나 틀렸는지 다룬다. 하지만 먼저, 이 가정들을 받아들였을 때 얻는 보상부터 보자.

궤적의 비용과 분산

체결분을 모두 합산하고 초기 마크 XS0X S_0에서 빼면 집행 손실(implementation shortfall)이 나온다. 노이즈 ξk\xi_k에 대한 그 기댓값과 분산은 다음과 같다.

E[C]=12γX2영구+ϵX스프레드+η~τk=1Nnk2일시적,V[C]=σ2τk=1Nxk2,E[C] = \underbrace{\tfrac{1}{2}\gamma X^2}_{\text{영구}} + \underbrace{\epsilon X}_{\text{스프레드}} + \underbrace{\frac{\tilde{\eta}}{\tau} \sum_{k=1}^{N} n_k^2}_{\text{일시적}}, \qquad V[C] = \sigma^2 \tau \sum_{k=1}^{N} x_k^2,

여기서 η~=η12γτ\tilde{\eta} = \eta - \tfrac{1}{2}\gamma\tauτ0\tau \to 0일 때 사라지는 이산화 보정항이다.

대부분의 구현이 놓치는 관찰 두 가지가 있다.

  • 영구 비용 12γX2\tfrac{1}{2}\gamma X^2은 궤적에 의존하지 않는다. 선형이고 감쇠하지 않는 영구 임팩트에서는, 스케줄을 어떻게 짜든 동일한 영구 통행료를 지불한다. 최적화는 전적으로 일시적 비용 항(느리고 균등한 거래를 원함 — nk=X/Nn_k = X/N, 즉 TWAP에서 최소화됨)과 분산 항(재고를 최대한 빨리 없애고 싶어함 — 즉시 청산에서 최소화됨) 사이의 싸움이다.
  • 분산 항은 거래량이 아니라 보유량으로 가중된다. 위험은 거래한 것이 아니라 아직 보유하고 있는 xkx_k에 대해 발생한다. 긴급성이 스케줄을 앞쪽으로 몰아넣는 이유가 바로 이것이다.

닫힌 형태: sinh, cosh, 그리고 긴급성 파라미터

알름그렌-크리스는 평균-분산 목적함수를 최소화한다.

U(x)=E[C]+λV[C],U(x) = E[C] + \lambda V[C],

여기서 λ0\lambda \geq 0은 1/달러 단위의 위험회피도다. 내부 점들에 대해 U/xj=0\partial U / \partial x_j = 0을 설정한다. 일시적 항은 xx의 이차 차분을 기여하고, 분산 항은 xjx_j 자체를 기여하여, 다음과 같은 선형 이차 차분방정식을 얻는다.

xj12xj+xj+1τ2=κ~2xj,κ~2=λσ2η~.\frac{x_{j-1} - 2x_j + x_{j+1}}{\tau^2} = \tilde{\kappa}^2 x_j, \qquad \tilde{\kappa}^2 = \frac{\lambda \sigma^2}{\tilde{\eta}}.

이는 x=κ2xx'' = \kappa^2 x의 이산 유사물이며, 경계조건 x0=Xx_0 = X, xN=0x_N = 0을 적용하면 해는 쌍곡선 형태가 된다.

  xj=Xsinh ⁣(κ(Ttj))sinh(κT)  nj=2sinh(κτ/2)sinh(κT)cosh ⁣(κ(Ttj1/2))X,\boxed{\;x_j = X\, \frac{\sinh\!\big(\kappa\,(T - t_j)\big)}{\sinh(\kappa T)}\;} \qquad n_j = \frac{2\sinh(\kappa\tau/2)}{\sinh(\kappa T)}\, \cosh\!\big(\kappa (T - t_{j-1/2})\big)\, X,

여기서 κ\kappa2τ2(cosh(κτ)1)=κ~2\tfrac{2}{\tau^2}\left(\cosh(\kappa\tau) - 1\right) = \tilde{\kappa}^2를 풀어 얻으며, τ\tau가 작을 때는 근사적으로 κκ~=λσ2/η\kappa \approx \tilde{\kappa} = \sqrt{\lambda\sigma^2/\eta}이다.

카파 값에 따른 최적 보유량 궤적, TWAP 직선부터 공격적으로 앞쪽에 몰린 곡선까지

전략에 대한 모든 것이 숫자 하나로 압축된다.

κ=λσ2η[단위: 1/시간].\kappa = \sqrt{\frac{\lambda \sigma^2}{\eta}} \qquad [\text{단위: } 1/\text{시간}].

κ\kappa는 **긴급성(urgency)**이다. 그 역수 θ=1/κ\theta = 1/\kappa는 거래의 특징적 시간, 즉 임팩트 비용을 줄이기 위해 재고 위험을 감수할 가치가 있는 시간 척도다. κ\kappa의존하지 않는 것에 주목하라. 주문 크기 XX와 마감시한 TT가 그것이다. 거래의 본질적 시간 척도가 20분인지 6시간인지는 오로지 위험회피도, 변동성, 유동성에 의해 결정된다. θT\theta \ll T이면 마감시한은 무관하다 — 모델은 스스로의 스케줄대로 청산하고 지평선의 나머지 부분은 사용되지 않는다. θT\theta \gg T이면 마감시한이 구속 조건이 되며, 사실상 TWAP을 하는 셈이다.

위험중립 극한은 TWAP이다 — TWAP이 존재하는 이유

λ0\lambda \to 0을 취하면 κ0\kappa \to 0이 된다. 그러면 sinh(z)z\sinh(z) \to z이고

x(t)=Xsinh(κ(Tt))sinh(κT)    XTtT.x(t) = X\,\frac{\sinh(\kappa(T-t))}{\sinh(\kappa T)} \;\longrightarrow\; X\,\frac{T-t}{T}.

최적 궤적은 직선으로 퇴화한다. 즉 동일한 시간 구간에 동일한 수량을 거래한다는 뜻이다. TWAP은 우연히 잘 작동하는 발견적 방법이 아니다. 선형 임팩트를 가진 위험중립 트레이더에 대한 알름그렌-크리스 모델의 정확한 최적해다. 누군가 TWAP을 돌릴 때마다, 그는 암묵적으로 λ=0\lambda = 0을 주장하고 있는 것이다. "내 손실의 분산은 신경 쓰지 않는다, 평균만 신경 쓴다"는 뜻이다. 작은 주문과 짧은 지평선에서는 방어 가능한 입장이다. 하지만 일평균 변동성이 4%인 자산에서 하루 거래량의 5%를 8시간에 걸쳐 청산하는 상황에서는 이상한 입장이다 — 그런데 사람들은 바로 그런 상황에서 어쨌든 TWAP을 돌린다. 반대 극한 λ\lambda \to \infty는 모든 j>0j > 0에서 xj0x_j \to 0을 준다. 첫 구간에 전량을 쏟아붓고, 비용이 얼마가 되든 지불하는 셈이다. 이 두 극단 사이에서 κT\kappa T가 보간을 만든다. κT0.5\kappa T \lesssim 0.5는 TWAP과 거의 구별되지 않고, κT3\kappa T \gtrsim 3은 공격적으로 앞쪽에 몰린 스케줄이다.

집행의 효율적 프론티어

λ\lambda마다 하나의 궤적, 하나의 기대비용 E(λ)E(\lambda), 하나의 분산 V(λ)V(\lambda)이 나온다. λ[0,)\lambda \in [0, \infty)를 훑으면 (V,E)(V, E) 평면에서 곡선이 그려진다 — 마코위츠와 직접적으로 유사한 집행의 효율적 프론티어다. 이는 볼록하고 감소한다. 분산을 줄이면 항상 기대손실이 더 커지며, 수익 체감이 가파르다. 주어진 λ\lambda가 선택하는 프론티어 지점에서, 위험회피도는 접선의 (음의) 기울기다. λ=E/V\lambda = -\partial E / \partial V.

람다가 접선의 기울기로 나타나는 집행 비용 대 분산의 효율적 프론티어

프론티어는 "λ\lambda가 무엇인가?"라는 — 누구도 내성적으로 답할 수 없는 — 질문을 "나는 어떤 비용/위험 트레이드오프를 원하는가?"라는, 데스크가 실제로 답할 수 있는 질문으로 재구성한다. 지점을 고르는 실전적 방법 세 가지는 다음과 같다.

  1. 한계비용 추론. 프론티어를 따라가며 묻는다. "이 지점에서 다음 지점으로 이동하면, 손실 표준편차 Δstd\Delta\text{std} 달러를 줄이기 위해 기대비용 ΔE\Delta E 달러를 지불하는데 — 이 거래를 받아들일 것인가?" 프론티어의 무릎(knee)은 대개 2배 오차 범위 내에서 명확하며, 그 해상도에서 궤적은 λ\lambda에 둔감하다.
  2. 위험 예산. 허용 가능한 최대 손실 표준편차를 고정하고(예: "잔여 포지션의 하루 1-시그마는 명목가치의 15bp 미만이어야 한다"), 이를 만족하는 가장 저렴한 궤적을 취한다. 이는 제약 최적화 문제이며 그 라그랑주 승수가 곧 λ\lambda다.
  3. 특징적 시간 타겟팅. θ=1/κ\theta = 1/\kappa를 직접 고르고("이 주문은 반감기 90분이어야 한다") λ=η/(σ2θ2)\lambda = \eta/(\sigma^2\theta^2)를 역산한다. 대부분의 실무자가 "긴급성" 슬라이더를 설정할 때 암묵적으로 하는 일이 바로 이것이다.

보정 절에서 정당화할 숫자들로 구체적 예를 들어보자. S_0 = \100{,}000에서에서 X = 100BTC를매도한다고하자.지평선BTC를 매도한다고 하자. 지평선T = 4시간,시간, \sigma = $600perBTCperper BTC per\sqrt{\text{h}}(연간약3(연간 약 3% 일간 변동성), \eta = 1.0\ $\cdot\text{h}/\text{BTC},, \lambda = 10^{-6}\ $^{-1}$. 그러면

κ=106×3.6×1051.0=0.6 h1,κT=2.4,θ1.7 h.\kappa = \sqrt{\frac{10^{-6} \times 3.6\times 10^{5}}{1.0}} = 0.6\ \text{h}^{-1}, \qquad \kappa T = 2.4, \qquad \theta \approx 1.7\ \text{h}.

최적 스케줄은 첫 시간에 46.2 BTC를 매도한다(TWAP: 25). 일시적 비용은 \eta \int_0^T v(t)^2 dt \approx \3{,}290로, TWAP의 \2,500 대비 높다. 손실 표준편차는 $53,000로, TWAP의 $69,300 대비 낮다. 즉 $10M 명목가치에서 추가 0.8bp의 기대비용을 지불하는 대가로 손실 위험을 23% 줄인다. 이것이 이 모델의 전체 내용을 한 문장으로 요약한 것이다. 보험료를 가격 매기고, 그 보험을 살지 말지는 당신이 결정하게 한다.

궤적 자체는 파이썬 열 줄이면 된다.

import numpy as np

def almgren_chriss(X, T, N, sigma, eta, gamma, lam):
    """Optimal liquidation trajectory (discrete AC 2001)."""
    tau = T / N
    eta_t = eta - 0.5 * gamma * tau          # tilde-eta
    kappa_t2 = lam * sigma**2 / eta_t        # tilde-kappa^2
    kappa = np.arccosh(0.5 * kappa_t2 * tau**2 + 1) / tau
    t = np.arange(N + 1) * tau
    x = X * np.sinh(kappa * (T - t)) / np.sinh(kappa * T)
    n = x[:-1] - x[1:]                       # child order sizes
    E = 0.5 * gamma * X**2 + (eta_t / tau) * np.sum(n**2)
    V = sigma**2 * tau * np.sum(x[1:]**2)
    return x, n, E, V

x, n, E, V = almgren_chriss(X=100, T=4, N=48, sigma=600,
                            eta=1.0, gamma=0.3, lam=1e-6)
print(f"first-hour qty: {n[:12].sum():.1f} BTC, "
      f"E=${E:,.0f}, std=${np.sqrt(V):,.0f}")

lamnp.logspace(-8, -4, 50)으로 스윕하고 EEV\sqrt{V}에 대해 그리면 — 그것이 당신의 프론티어이며, 전체 의사결정 곡면이 리스크 위원회에 보여줄 수 있는 차트 한 장에 들어간다.

보정: 바이낸스 데이터로부터 η\eta, γ\gamma, σ\sigma 구하기

여기가 구현체의 90%가 조용히 죽는 지점이다. 궤적 공식은 사소하지만, 파라미터는 그렇지 않다. 세 개의 값, 세 개의 서로 다른 추정 문제다.

바이낸스 데이터로부터의 참여율 대비 슬리피지, 순 주문흐름 대비 가격 변화 산점도

σ\sigma: 쉬운 값

루트시간당 절대 변동성을, 미드가 수익률로부터 구한다. 1분 봉을 사용하고 스케일을 조정한다. 더 미세한 샘플링에서는 미시구조 노이즈(bid-ask 바운스)가 실현 분산을 위로 편향시킨다. 이 추정치는 견고하다 — 변동성은 당신이 제대로 맞출 수 있는 유일한 파라미터다.

η\eta: 오더북과 체결 데이터로부터의 일시적 임팩트

상호보완적인 두 경로가 있다. 경로 A — L2 오더북을 훑기. 뎁스 스냅샷으로부터, 크기 qq의 가상 시장가 스윕 비용을 계산한다. 소비된 레벨들의 VWAP에서 미드가를 뺀 값이다. cost(q)ϵ+ηinstq\text{cost}(q) \approx \epsilon + \eta_{\text{inst}}\, q를 적합시키면 BTC당 즉시 임팩트가 나온다. 모델의 속도 기반 η\eta로 변환하려면 오더북 재충전 시간 Δtr\Delta t_r(BTCUSDT의 경우 대략 10–60초)을 가정해야 한다. 속도 vv로 거래하면 재충전 사이클당 vΔtrv \Delta t_r이 소비되므로, ηηinstΔtr\eta \approx \eta_{\text{inst}} \Delta t_r이다. 즉시, 완전한 재충전이라는 이 가정이 바로 Obizhaeva-Wang이 파고드는 균열이다. 아래에서 더 다룬다. 경로 B — 참여율에 대한 실현 슬리피지 회귀. 공격적(테이커) 흐름을 1분 구간으로 나눈다. 각 구간마다 테이커 측 VWAP에서 구간 시작 미드가를 뺀 값을 테이커 거래량 속도에 회귀시킨다. 경로 B는 시장이 실제로 공격자에게 부과한 것을 측정하고, 경로 A는 지금 이 순간 대기 중인 오더북이 부과할 것을 측정한다. 두 값이 3배 이상 벌어지면, 수준(레벨)에 대해서는 B를, 하루 중 형태에 대해서는 A를 믿어라.

γ\gamma: Kyle 스타일 회귀를 통한 영구 임팩트

미드가 변화를 5분 창 동안의 부호 있는 순 테이커 흐름에 회귀시킨다.

ΔS5m=γQnet+noise,Qnet=taker buystaker sells.\Delta S_{5m} = \gamma\, Q_{\text{net}} + \text{noise}, \qquad Q_{\text{net}} = \text{taker buys} - \text{taker sells}.

그런 다음 임팩트가 한 창 뒤에 되돌아가지 않았는지 확인한다. 되돌아가지 않는 성분이 당신의 거래 시간 척도에서 "영구적"인 것이다. 이것이 세 값 중 가장 노이즈가 심하다.

공개 바이낸스 REST 엔드포인트만 사용하는 실제 동작 코드는 다음과 같다.

import requests, numpy as np, pandas as pd

B = "https://api.binance.com/api/v3"
sym = "BTCUSDT"

kl = requests.get(f"{B}/klines", params=dict(
    symbol=sym, interval="1m", limit=1000)).json()
close = np.array([float(k[4]) for k in kl])
sigma = np.diff(close).std() * np.sqrt(60)       # $/sqrt(h)

d = requests.get(f"{B}/depth",
                 params=dict(symbol=sym, limit=5000)).json()
bids = np.array(d["bids"], dtype=float)          # [price, qty]
mid = (bids[0, 0] + float(d["asks"][0][0])) / 2
cq = np.cumsum(bids[:, 1])                       # cum qty
cn = np.cumsum(bids[:, 0] * bids[:, 1])          # cum notional
sizes = np.linspace(0.5, 50, 40)                 # BTC probes
cost = [mid - np.interp(q, cq, cn) / q for q in sizes]
eps, eta_inst = np.polyfit(sizes, cost, 1)[::-1] # cost ~ eps + k*q
eta = eta_inst * (30 / 3600)                     # 30s refresh -> $*h/BTC

tr = requests.get(f"{B}/aggTrades",
                  params=dict(symbol=sym, limit=1000)).json()
df = pd.DataFrame(dict(
    t=[t["T"] for t in tr],
    p=[float(t["p"]) for t in tr],
    q=[float(t["q"]) * (-1 if t["m"] else 1) for t in tr]))
df["bin"] = df.t // 300_000                      # 5-min bins
g = df.groupby("bin").agg(dp=("p", lambda s: s.iloc[-1] - s.iloc[0]),
                          qn=("q", "sum"))
gamma = np.polyfit(g.qn, g.dp, 1)[0]             # $/BTC
print(f"sigma={sigma:.0f} $/sqrt(h)  eta={eta:.2f} $*h/BTC  "
      f"gamma={gamma:.3f} $/BTC")

프로덕션에서는 단일 aggTrades 페이지 대신 히스토리컬 덤프 며칠치를 사용해서 수천 개의 구간에 대해 γ\gamma 회귀를 돌려라. 몇 개 안 되는 표본으로는 안 된다.

크립토 보정이 노이즈투성이인 이유, 그리고 대응법

실제 데이터로 γ\gamma 회귀를 돌려보면 R2R^2가 몇 퍼센트에 불과하고 계수는 날마다 2–5배씩 요동친다. 이것은 코드 버그가 아니다. 구조적인 이유가 있다.

  • 내생성(Endogeneity). 흐름은 가격에 반응하는 만큼 가격도 흐름에 반응한다. 모멘텀 트레이더는 가격이 올랐기 때문에 매수한다. 수익률을 흐름에 순진하게 OLS 회귀시키면 그들의 반응을 포착해서 임팩트로 잘못 귀속시킨다. 깔끔한 해법은 (구성상 외생적인) 자신의 체결 데이터를 사용하는 것인데, 이는 어느 정도 거래를 해본 뒤에야 얻을 수 있다.
  • 오목성(Concavity). 실제 임팩트는 크기에 대해 오목하며 — 경험적으로 제곱근에 가깝다(Almgren, Thum, Hauptmann, Li(2005), "Direct estimation of equity market impact"는 지수가 0.6에 가깝다고 밝혔으며, 동일한 오목성이 크립토에서도 견고하게 나타난다). 오목함수에 직선을 적합시키면 η\etaγ\gamma가 표본의 크기 범위에 의존하게 된다. 실제로 거래할 참여율 수준에서 보정하라.
  • 파편화와 파생상품 주도. 바이낸스의 BTCUSDT 현물은 여러 거래소 중 하나일 뿐이며, 가격 발견은 종종 무기한선물(perp)에서 일어난다. 당신이 보지 못하는 흐름이 당신이 회귀시키는 가격을 움직여 노이즈 항을 부풀린다.
  • 국면 의존성. 아시아 세션에서 측정한 η\eta는 미국장 개장을 설명하지 못한다. 변동성이 두 배가 되면 임팩트도 대략 두 배가 된다. 세션별로 보정하고, 최소 주 단위로 재적합하라.

구원이 되는 사실은, 궤적 자체는 관대하다는 것이다. κ1/η\kappa \propto \sqrt{1/\eta}이므로, η\eta의 2배 오차는 κ\kappa를 겨우 2\sqrt{2}배만 움직이며, 비용함수는 최적점 근처에서 평평하다. η\eta를 2배 이내로, λ\lambda를 한 자릿수 이내로 맞추는 것만으로도 TWAP 대비 얻을 수 있는 개선의 대부분을 이미 포착한다. 정밀도는 거래 전 비용 추정에서 중요하고, 스케줄링에는 견고함이면 충분하다.

모델이 무너지는 지점, 그리고 이를 해결하는 논문들

알름그렌-크리스는 하나의 골조이며, 어느 대들보가 하중을 지탱하는지 정확히 아는 것이 어느 확장으로 손을 뻗어야 할지 알려준다.

비선형 임팩트 — Almgren(2003). "Optimal execution with nonlinear impact functions and trading-enhanced risk"(Applied Mathematical Finance 10, 1–18)는 거듭제곱 형태의 일시적 임팩트 h(v)=ηvαh(v) = \eta v^\alpha로 이 프로그램을 다시 짠다. 경험적으로 선호되는 α1/2\alpha \approx 1/2 — 제곱근 법칙 — 에서는 최적 궤적의 성격이 바뀐다. 오목한 임팩트는 선형 임팩트보다 급격한 거래를 덜 벌하므로, 같은 λ\lambda에서 최적 스케줄이 더 앞쪽에 몰리게 된다. 정성적 구조(긴급성 파라미터, 효율적 프론티어)는 살아남지만, sinh 공식은 살아남지 못한다.

리질리언스와 LOB — Obizhaeva와 Wang(2013). "Optimal trading strategy and supply/demand dynamics"(Journal of Financial Markets 16(1), 1–32; 워킹 페이퍼는 2005년부터 유통)는 일시적/영구적 이분법을, 유한한 뎁스와 지수적으로 감쇠하는 임팩트를 가진 한계주문서로 대체한다. 당신의 거래는 오더북을 갉아먹고, 오더북은 리질리언스 속도 ρ\rho로 다시 채워진다. AC의 "일시적 임팩트는 즉시 사라진다"는 가정은 ρ\rho \to \infty 극한이다. 최적 전략은 극적으로 형태가 바뀐다. 시작에 한 덩어리, 끝에 한 덩어리, 그 사이는 일정한 거래 속도 — 이 덩어리들은 오더북의 회복을 이용한다. 만약 당신의 자식 주문 간격이 거래소의 재충전 시간과 비슷한 규모라면(크립토에서는 몇 초에서 1분 — 실제로 종종 그렇다), 당신은 알름그렌-크리스 영역이 아니라 Obizhaeva-Wang 영역에 있는 것이며, 위 보정 과정의 Δtr\Delta t_r 어림수가 바로 그 경고 신호다.

동적 차익거래 부재 — Gatheral(2010). "No-dynamic-arbitrage and market impact"(Quantitative Finance 10(7), 749–759)는 즉시 임팩트 함수 f(v)f(v)와 감쇠 커널 G(t)G(t)의 어떤 조합이 내적으로 일관적인지, 즉 음의 기대비용을 갖는 왕복 전략을 허용하지 않는지를 묻는다. 결과는 명확하다. 지수적 감쇠는 오직 선형 임팩트와만 양립한다 — 지수적 감쇠와 제곱근 임팩트를 결합하면 오실레이팅 거래 시퀀스로 모델에서 돈을 뽑아낼 수 있게 된다. 비선형 임팩트는 거듭제곱 법칙 감쇠를 요구하며, 두 지수를 연결하는 부등식이 존재한다(임팩트 vδ\sim v^\delta, 감쇠 tγd\sim t^{-\gamma_d}일 때 대략 γd+δ1\gamma_d + \delta \geq 1). 화려한 감쇠 커널을 임팩트 모델에 볼트로 조여 붙이기 전에 반드시 읽어야 할 논문이다. 대부분의 임기응변적 조합은 은밀하게 차익거래 가능하며, 실무에서 이는 당신의 최적화기가 그 차익거래를 발견하여 터무니없이 오실레이팅하는 스케줄을 산출한다는 뜻이다. 만약 당신의 "최적" 궤적이 순수 청산 도중에 매수와 매도를 번갈아 한다면, 당신은 알파를 발견한 게 아니라 Gatheral을 위반한 것이다.

ML 후속편들. 이 시리즈의 두 갈래는 바로 이 골조 위에 직접 세워진다. 첫째, 강화학습 집행 — 임팩트가 비선형적이고, 상태 의존적이며, 부분적으로만 관측 가능하다는 것을 인정하는 순간 닫힌 형태는 사라지고, RL(Nevmyvaka, Feng, Kearns의 2006년 Q-러닝 논문 이후로)은 궤적 공간을 탐색하는 자연스러운 방법이 된다 — 하지만 진지한 모든 RL 집행 에이전트는 AC 해법과 비교 검증되며, 종종 AC 해법으로부터 초기화된다. 둘째, 신경망 가격 임팩트 모델h(v)=ηvh(v) = \eta v를 오더북 상태의 학습된 함수로 대체하면서도, 그 위에 평균-분산 스케줄링 로직은 유지한다. 선형-가우시안 베이스라인이 정확히 무엇이고 왜 그 형태를 갖는지 모르면 두 후속편 모두 의미가 없다.

정리

이 모델은 세 개의 가정, 하나의 차분방정식, 하나의 숫자로 이루어진다. 선형 영구 임팩트(조작 불가능성에 의해 강제됨), 선형 일시적 임팩트(당신이 그 주변에서 보정하는 근사), 산술 브라운 노이즈. 최적해는 재고 분산과 임팩트 비용을 맞바꾸고, 전략 전체는 긴급성 κ=λσ2/η\kappa = \sqrt{\lambda\sigma^2/\eta}로 압축되며, TWAP은 λ=0\lambda = 0인 퇴화 경우로 튀어나온다 — 이것이 이 모델에서 가장 유용한 단 하나의 사실이다. "이것을 TWAP으로 돌려야 하나?"라는 질문을 습관의 문제에서 위험회피에 관한 검증 가능한 주장으로 바꿔주기 때문이다. 보정이야말로 진짜 작업이다. σ\sigma는 쉽고, η\eta는 2배 게임이며, γ\gamma는 하나의 연구 프로젝트이고, 궤적은 이 셋 모두를 관대하게 봐준다. 오후 한나절이면 구현할 수 있다. 나머지 한 달은 회귀 진단에 써라.

참고문헌

  • Almgren, R., Chriss, N. (2001). "Optimal execution of portfolio transactions." Journal of Risk, 3(2), 5–39.
  • Almgren, R. (2003). "Optimal execution with nonlinear impact functions and trading-enhanced risk." Applied Mathematical Finance, 10(1), 1–18.
  • Almgren, R., Thum, C., Hauptmann, E., Li, H. (2005). "Direct estimation of equity market impact." Risk, 18(7), 58–62.
  • Huberman, G., Stanzl, W. (2004). "Price manipulation and quasi-arbitrage." Econometrica, 72(4), 1247–1275.
  • Obizhaeva, A., Wang, J. (2013). "Optimal trading strategy and supply/demand dynamics." Journal of Financial Markets, 16(1), 1–32.
  • Gatheral, J. (2010). "No-dynamic-arbitrage and market impact." Quantitative Finance, 10(7), 749–759.
  • Nevmyvaka, Y., Feng, Y., Kearns, M. (2006). "Reinforcement learning for optimized trade execution." ICML 2006.
blog.disclaimer

Authors

Eugen Soloviov
Eugen Soloviov

Trading-systems engineer

Trading-systems engineer building bots since 2017: cross-exchange arbitrage (connected up to 30 venues), cointegration-based pairs arbitrage across spot and futures, scalping, news and sentiment-driven strategies, trend algorithms, and portfolio management and balancing algorithms. Also builds sub-millisecond order execution, big-data warehouses, backtesting engines, AI agents, and trading interfaces (incl. open-source profitmaker.cc). Stack: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, architecture.

Newsletter

시장에서 앞서 나가세요

뉴스레터를 구독하여 독점적인 AI 트레이딩 통찰력, 시장 분석 및 플랫폼 업데이트를 받아보세요.

귀하의 개인정보를 존중합니다. 언제든지 구독을 취소할 수 있습니다.