← Quay lại danh sách bài viết
July 14, 2026
5 phút đọc

Almgren-Chriss không màu mè: Thực thi tối ưu bạn có thể triển khai trong một buổi chiều

Almgren-Chriss không màu mè: Thực thi tối ưu bạn có thể triển khai trong một buổi chiều
#thực thi
#almgren-chriss
#market impact
#thực thi tối ưu
#twap
#quant
#python
#crypto

Almgren và Chriss (2001), "Optimal execution of portfolio transactions" (Journal of Risk 3(2), 5–39), có lẽ là bài báo được trích dẫn nhiều nhất trong nghiên cứu về thực thi lệnh và cũng là một trong những bài bị triển khai sai nhiều nhất. Phần lớn code "Almgren-Chriss" trôi nổi ngoài kia thực chất chỉ là một bộ lập lịch TWAP kèm vài dòng comment. Phần lớn bài blog về nó bỏ qua phần suy diễn, vẫy tay qua loa về hàm sinh, và chưa bao giờ chạm tới phần thực sự quan trọng trong production: các tham số đến từ đâu.

Bài viết này làm trọn vẹn cả quá trình. Các giả định của mô hình, được trình bày trung thực. Quỹ đạo dạng đóng, được suy diễn chứ không chỉ khẳng định. Đường biên hiệu quả và cách chọn tham số ngại rủi ro. Và việc hiệu chỉnh ba đầu vào — impact tạm thời η\eta, impact vĩnh viễn γ\gamma, độ biến động σ\sigma — từ dữ liệu order book và trade của Binance, kèm code Python chạy được và một thảo luận thẳng thắn về lý do vì sao việc fit lại nhiễu đến vậy. Đây là xương sống tư duy của mọi thứ khác trong lĩnh vực thực thi lệnh: TWAP, VWAP, và POV là các trường hợp đặc biệt hoặc các biến thể heuristic (xem TWAP, VWAP, POV: các thuật toán thực thi mà ai cũng dùng), còn các phương pháp ML hiện đại — bộ lập lịch reinforcement learning và mô hình impact bằng neural network — là những nỗ lực nới lỏng chính xác các giả định mà chúng ta sắp viết ra dưới đây.

Bối cảnh: mô hình thực sự giả định điều gì

Bạn đang nắm giữ XX đơn vị tài sản (ví dụ 100 BTC) và phải thanh lý hoàn toàn trước thời điểm TT. Chia [0,T][0, T] thành NN khoảng có độ dài τ=T/N\tau = T/N. Biến quyết định của bạn là quỹ đạo tồn kho x0=X,x1,,xN=0x_0 = X, x_1, \dots, x_N = 0, với các lệnh trade nk=xk1xkn_k = x_{k-1} - x_k được thực thi trong khoảng kk.

Ba giả định gánh toàn bộ mô hình:

1. Bước ngẫu nhiên số học (arithmetic random walk). Giá không bị nhiễu loạn tuân theo

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

trong đó ξk\xi_k là các biến chuẩn hóa độc lập cùng phân phối, và σ\sigma là độ biến động tuyệt đối (đô-la trên mỗi đơn vị thời gian mũ 1/21/2, không phải phần trăm). Số học, không phải hình học — trong vài giờ, sự khác biệt là không đáng kể, và bước đi số học giữ cho đại số vẫn tuyến tính-bậc hai. Không có drift: Almgren và Chriss có bàn tới thành phần drift, nhưng đối với một lệnh thanh lý trong ngày, ước lượng alpha của bạn trong 4 giờ gần như luôn chỉ là nhiễu, và việc đặt nó bằng không là lựa chọn mặc định trung thực nhất.

2. Impact vĩnh viễn tuyến tính. g(v)=γvg(v) = \gamma v: giao dịch với tốc độ vv dịch chuyển giá một cách vĩnh viễn, tỷ lệ thuận, và sự dịch chuyển đó không bao giờ suy giảm. Mỗi đơn vị bạn bán đẩy giá mid xuống thêm γ\gamma mãi mãi. Điều này trông có vẻ thô sơ, nhưng có một lý do sâu xa để giữ nó tuyến tính: Huberman và Stanzl (2004) đã chứng minh rằng impact vĩnh viễn phi tuyến theo kích thước lệnh sẽ cho phép tồn tại các chiến lược round-trip có lợi nhuận kỳ vọng dương — tức thao túng giá. Impact vĩnh viễn tuyến tính không phải là một sự đơn giản hóa cho tiện; đó là lựa chọn duy nhất không có arbitrage trong lớp mô hình này.

3. Impact tạm thời tuyến tính. Giá mà bạn thực sự nhận được trong khoảng 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 nắm bắt một nửa spread bid-ask cộng với phí; η\eta là độ dốc của chi phí biên khi đòi hỏi thanh khoản với tốc độ vv. Impact tạm thời chỉ ảnh hưởng đến fill của chính bạn và biến mất ngay lập tức — sổ lệnh được bù đắp đầy đủ trước khi child order tiếp theo của bạn được gửi đi. Cả ba từ "tuyến tính", "ngay lập tức", "đầy đủ" đều sai trong thị trường thực, và phần cuối bài viết sẽ nói về mức độ sai đó. Nhưng trước hết, hãy xem cái lợi khi chấp nhận chúng.

Chi phí và phương sai của một quỹ đạo

Cộng dồn các fill, trừ đi từ mức giá đánh dấu ban đầu XS0X S_0, ta thu được implementation shortfall. Kỳ vọng và phương sai của nó theo nhiễu ξk\xi_k là:

E[C]=12γX2vı˜nh vieˆ˜n+ϵXspread+η~τk=1Nnk2tạm thời,V[C]=σ2τk=1Nxk2,E[C] = \underbrace{\tfrac{1}{2}\gamma X^2}_{\text{vĩnh viễn}} + \underbrace{\epsilon X}_{\text{spread}} + \underbrace{\frac{\tilde{\eta}}{\tau} \sum_{k=1}^{N} n_k^2}_{\text{tạm thời}}, \qquad V[C] = \sigma^2 \tau \sum_{k=1}^{N} x_k^2,

với η~=η12γτ\tilde{\eta} = \eta - \tfrac{1}{2}\gamma\tau (một hiệu chỉnh rời rạc hóa biến mất khi τ0\tau \to 0).

Hai điểm quan sát mà đa số triển khai bỏ sót:

  • Chi phí vĩnh viễn 12γX2\tfrac{1}{2}\gamma X^2 không phụ thuộc vào quỹ đạo. Với impact vĩnh viễn tuyến tính, không suy giảm, bạn phải trả cùng một khoản phí vĩnh viễn bất kể lập lịch thế nào. Việc tối ưu hóa hoàn toàn là cuộc đấu giữa thành phần chi phí tạm thời (muốn giao dịch chậm, đều — được tối thiểu hóa bởi nk=X/Nn_k = X/N, tức TWAP) và thành phần phương sai (muốn tồn kho của bạn biến mất càng sớm càng tốt — được tối thiểu hóa bằng thanh lý ngay lập tức).
  • Thành phần phương sai được trọng số theo tồn kho, không theo lượng giao dịch. Rủi ro tích lũy trên những gì bạn vẫn còn nắm giữ, xkx_k, chứ không phải trên những gì bạn giao dịch. Đây là lý do vì sao tính khẩn cấp làm lịch trình dồn về phía đầu.

Dạng đóng: sinh, cosh, và tham số khẩn cấp

Almgren-Chriss tối thiểu hóa hàm mục tiêu mean-variance

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

trong đó λ0\lambda \geq 0 là mức ngại rủi ro tính theo đơn vị 1/đô-la. Đặt U/xj=0\partial U / \partial x_j = 0 cho các điểm nội bộ. Thành phần tạm thời đóng góp sai phân bậc hai của xx, thành phần phương sai đóng góp chính xjx_j, và ta thu được một phương trình sai phân tuyến tính bậc hai:

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}}.

Đây là tương tự rời rạc của x=κ2xx'' = \kappa^2 x, và với điều kiện biên x0=Xx_0 = X, xN=0x_N = 0, nghiệm có dạng hyperbolic:

  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,

trong đó κ\kappa nghiệm của 2τ2(cosh(κτ)1)=κ~2\tfrac{2}{\tau^2}\left(\cosh(\kappa\tau) - 1\right) = \tilde{\kappa}^2, mà với τ\tau nhỏ chỉ đơn giản là κκ~=λσ2/η\kappa \approx \tilde{\kappa} = \sqrt{\lambda\sigma^2/\eta}.

Quỹ đạo tồn kho tối ưu cho các giá trị kappa khác nhau, từ đường thẳng TWAP đến các đường cong dồn tải mạnh về phía đầu

Toàn bộ chiến lược được nén lại thành một con số duy nhất:

κ=λσ2η[đơn vị: 1/thời gian].\kappa = \sqrt{\frac{\lambda \sigma^2}{\eta}} \qquad [\text{đơn vị: } 1/\text{thời gian}].

κ\kappa chính là mức khẩn cấp. Nghịch đảo của nó θ=1/κ\theta = 1/\kappa là thời gian đặc trưng của lệnh: khung thời gian mà việc giữ rủi ro tồn kho để tiết kiệm chi phí impact là đáng giá. Lưu ý rằng κ\kappa không phụ thuộc vào: kích thước lệnh XX và hạn chót TT. Việc khung thời gian nội tại của lệnh của bạn là 20 phút hay 6 giờ được quyết định hoàn toàn bởi mức ngại rủi ro, độ biến động và thanh khoản. Nếu θT\theta \ll T, hạn chót của bạn không còn quan trọng — mô hình sẽ tự thanh lý theo lịch trình riêng của nó và phần đuôi của khung thời gian không được dùng đến. Nếu θT\theta \gg T, hạn chót trở thành ràng buộc chính và bạn thực chất đang chạy TWAP.

Giới hạn trung lập rủi ro chính là TWAP — đây là lý do TWAP tồn tại

Cho λ0\lambda \to 0, khi đó κ0\kappa \to 0. Rồi 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}.

Quỹ đạo tối ưu suy biến thành đường thẳng: lượng bằng nhau trong các khoảng thời gian bằng nhau. TWAP không phải là một heuristic tình cờ hiệu quả; nó chính là nghiệm tối ưu chính xác của mô hình Almgren-Chriss cho một trader trung lập rủi ro với impact tuyến tính. Mỗi khi ai đó chạy TWAP, họ đang ngầm khẳng định λ=0\lambda = 0: "Tôi không quan tâm đến phương sai của shortfall, chỉ quan tâm đến giá trị kỳ vọng của nó." Đó là một lập trường có thể biện hộ được cho các lệnh nhỏ và khung thời gian ngắn. Nhưng nó là một lập trường kỳ lạ khi thanh lý 5% khối lượng giao dịch hàng ngày trong 8 giờ đối với một tài sản có độ biến động hàng ngày 4%, mà đó lại chính xác là trường hợp người ta vẫn hay chạy TWAP. Giới hạn ngược lại λ\lambda \to \infty cho xj0x_j \to 0 với mọi j>0j > 0: xả hết toàn bộ trong khoảng đầu tiên, trả bất kể giá nào. Giữa hai thái cực này, κT\kappa T nội suy: κT0.5\kappa T \lesssim 0.5 gần như không phân biệt được với TWAP, κT3\kappa T \gtrsim 3 là dồn tải mạnh về phía đầu.

Đường biên hiệu quả của thực thi

Với mỗi λ\lambda, bạn thu được một quỹ đạo, một chi phí kỳ vọng E(λ)E(\lambda), và một phương sai V(λ)V(\lambda). Quét λ[0,)\lambda \in [0, \infty) vẽ nên một đường cong trên mặt phẳng (V,E)(V, E)đường biên hiệu quả của thực thi, tương tự trực tiếp với Markowitz. Nó lồi và giảm dần: phương sai thấp hơn luôn đồng nghĩa với chi phí shortfall kỳ vọng cao hơn, với lợi ích biên giảm dần rõ rệt. Tại điểm trên đường biên được chọn bởi một λ\lambda cho trước, mức ngại rủi ro chính là độ dốc (âm) của tiếp tuyến: λ=E/V\lambda = -\partial E / \partial V.

Đường biên hiệu quả giữa chi phí thực thi và phương sai với đường tiếp tuyến thể hiện lambda là độ dốc

Đường biên này định hình lại câu hỏi "λ\lambda là bao nhiêu?" — mà không ai có thể trả lời bằng trực giác nội tâm — thành "tôi muốn đánh đổi chi phí/rủi ro theo tỷ lệ nào?", một câu mà một desk giao dịch thực sự có thể trả lời được. Ba cách thực tế để chọn điểm đó:

  1. Lập luận theo chi phí biên. Đi dọc đường biên và tự hỏi: "chuyển từ điểm này sang điểm kế tiếp, tôi trả thêm ΔE\Delta E đô-la chi phí kỳ vọng để giảm Δstd\Delta\text{std} đô-la độ lệch chuẩn của shortfall — tôi có chấp nhận đánh đổi đó không?" Điểm gấp khúc của đường biên thường rõ ràng trong khoảng sai số hệ số 2, và quỹ đạo không nhạy với λ\lambda ở độ phân giải đó.
  2. Ngân sách rủi ro. Cố định một độ lệch chuẩn shortfall tối đa chấp nhận được (ví dụ "1-sigma một ngày của vị thế còn lại phải nằm dưới 15 bps của giá trị notional") và chọn quỹ đạo rẻ nhất thỏa mãn điều kiện đó. Đây là một bài toán có ràng buộc mà nhân tử Lagrange của nó chính là λ\lambda.
  3. Nhắm mục tiêu theo thời gian đặc trưng. Chọn trực tiếp θ=1/κ\theta = 1/\kappa ("lệnh này nên có half-life 90 phút") rồi suy ngược ra λ=η/(σ2θ2)\lambda = \eta/(\sigma^2\theta^2). Đây là điều mà đa số practitioner ngầm làm khi họ chỉnh thanh trượt "mức khẩn cấp".

Một ví dụ tính toán cụ thể với các con số ta sẽ biện minh trong phần hiệu chỉnh. Bán X=100X = 100 BTC ở S_0 = \100{,}000,khungthigian, khung thời gian T = 4gi,giờ,\sigma = $600mo^~iBTCmo^~imỗi BTC mỗi\sqrt{\text{giờ}}(tươngđươngkhong3(tương đương khoảng 3% độ biến động hàng ngày),\eta = 1.0\ $\cdot\text{giờ}/\text{BTC},, \lambda = 10^{-6}\ $^{-1}$. Khi đó

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

Lịch trình tối ưu bán 46.2 BTC trong giờ đầu tiên (TWAP: 25). Chi phí tạm thời: \eta \int_0^T v(t)^2 dt \approx \3{,}290soviso với$2{,}500caTWAP.Độlchchunshortfall:của TWAP. Độ lệch chuẩn shortfall:$53{,}000soviso với$69{,}300undefined10 triệu, bạn cắt giảm rủi ro shortfall đi 23%. Đó chính là toàn bộ nội dung của mô hình trong một câu: nó định giá bảo hiểm, và để bạn quyết định có mua hay không.

Bản thân quỹ đạo chỉ gọn trong mười dòng Python:

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}")

Quét lam trên np.logspace(-8, -4, 50) và vẽ EE theo V\sqrt{V} — đó chính là đường biên của bạn, và toàn bộ bề mặt quyết định gói gọn trong một biểu đồ có thể đưa cho một ủy ban rủi ro xem.

Hiệu chỉnh: η\eta, γ\gamma, σ\sigma từ dữ liệu Binance

Đây là chỗ 90% các triển khai âm thầm chết yểu. Công thức quỹ đạo là tầm thường; các tham số thì không. Ba đại lượng, ba bài toán ước lượng khác nhau.

Biểu đồ scatter hiệu chỉnh giữa slippage và tỷ lệ tham gia, và giữa thay đổi giá và dòng lệnh ròng từ dữ liệu Binance

σ\sigma: cái dễ

Độ biến động tuyệt đối trên căn bậc hai của giờ, từ lợi suất giá mid. Dùng nến 1 phút và scale lên; ở tần suất lấy mẫu mịn hơn, nhiễu vi cấu trúc (bid-ask bounce) làm phương sai thực hiện bị lệch lên trên. Ước lượng này khá vững — vol là tham số duy nhất bạn sẽ làm đúng.

η\eta: impact tạm thời từ sổ lệnh và từ các trade

Hai hướng bổ trợ nhau. Hướng A — đi qua sổ lệnh L2. Từ các snapshot độ sâu, tính chi phí của một cú quét marketable giả định với kích thước qq: VWAP của các mức bị tiêu thụ trừ đi mid. Fit cost(q)ϵ+ηinstq\text{cost}(q) \approx \epsilon + \eta_{\text{inst}}\, q cho ra impact tức thời trên mỗi BTC. Để chuyển sang η\eta theo tốc độ của mô hình, bạn phải giả định một thời gian bù đắp sổ lệnh Δtr\Delta t_r (thường vào khoảng 10–60 giây với BTCUSDT): giao dịch với tốc độ vv tiêu thụ vΔtrv \Delta t_r mỗi chu kỳ làm mới, vậy nên ηηinstΔtr\eta \approx \eta_{\text{inst}} \Delta t_r. Chính giả định đó — bù đắp tức thời, đầy đủ theo một đồng hồ cố định — là kẽ hở mà Obizhaeva-Wang chui vào; sẽ nói thêm bên dưới. Hướng B — hồi quy slippage thực hiện theo tỷ lệ tham gia. Chia dòng lệnh chủ động (taker) thành các bin 1 phút; với mỗi bin, hồi quy VWAP phía taker trừ mid mở đầu theo tốc độ khối lượng taker. Hướng B đo lường những gì thị trường thực sự tính phí đối với các aggressor; Hướng A đo lường những gì sổ lệnh nghỉ sẽ tính phí ngay lúc này. Khi hai kết quả chênh nhau tới hệ số 3, hãy tin B cho mức chi phí và A cho hình dạng trong ngày.

γ\gamma: impact vĩnh viễn qua hồi quy kiểu Kyle

Hồi quy thay đổi giá mid theo dòng lệnh taker ròng có dấu qua các cửa sổ 5 phút:

ΔS5m=γQnet+noise,Qnet=taker buytaker sell.\Delta S_{5m} = \gamma\, Q_{\text{net}} + \text{noise}, \qquad Q_{\text{net}} = \text{taker buy} - \text{taker sell}.

Sau đó kiểm tra xem impact có bị đảo ngược một cửa sổ sau đó không — thành phần không đảo ngược mới là "vĩnh viễn" ở khung thời gian giao dịch của bạn. Đây là thứ nhiễu nhất trong ba tham số, bỏ xa hai cái kia.

Code chạy được, chỉ dùng các endpoint REST công khai của Binance:

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")

Đối với production, thay trang aggTrades đơn lẻ bằng vài ngày dữ liệu từ historical dumps và chạy hồi quy γ\gamma trên hàng nghìn bin, chứ không phải vài chục.

Vì sao hiệu chỉnh trên crypto lại nhiễu, và nên làm gì với điều đó

Chạy hồi quy γ\gamma trên dữ liệu thực và bạn sẽ nhận được R2R^2 chỉ vài phần trăm và một hệ số dao động theo hệ số 2–5 giữa các ngày. Đây không phải lỗi trong code của bạn. Các lý do mang tính cấu trúc:

  • Nội sinh (endogeneity). Dòng lệnh phản ứng với giá cũng nhiều như giá phản ứng với dòng lệnh. Các trader theo momentum mua giá đã tăng; một hồi quy OLS ngây thơ của lợi suất theo dòng lệnh sẽ bắt được phản ứng của họ và gán nhầm nó cho impact. Cách khắc phục sạch sẽ là dùng chính các fill của bạn (ngoại sinh theo cấu trúc) — thứ mà bạn chỉ có sau khi đã giao dịch một thời gian.
  • Tính lõm (concavity). Impact thực tế là hàm lõm theo kích thước — thực nghiệm cho thấy gần với căn bậc hai (Almgren, Thum, Hauptmann và Li, 2005, "Direct estimation of equity market impact", tìm ra số mũ gần 0.6; tính lõm tương tự cũng vững chắc trong crypto). Fit một đường thẳng cho một hàm lõm nghĩa là η\etaγ\gamma của bạn phụ thuộc vào khoảng kích thước trong mẫu. Hãy hiệu chỉnh ở đúng các tỷ lệ tham gia mà bạn thực sự sẽ giao dịch.
  • Phân mảnh và vai trò dẫn dắt của phái sinh. BTCUSDT spot trên Binance chỉ là một trong nhiều venue, và price discovery thường xuyên diễn ra trên hợp đồng perpetual. Dòng lệnh mà bạn không bao giờ nhìn thấy vẫn di chuyển giá mà bạn đang hồi quy, làm phồng lên thành phần nhiễu.
  • Phụ thuộc chế độ thị trường. η\eta đo được trong phiên Á không mô tả phiên mở cửa Mỹ; impact tăng gần gấp đôi khi độ biến động tăng gấp đôi. Hãy hiệu chỉnh theo từng phiên, và fit lại ít nhất mỗi tuần một lần.

Điểm cứu vãn: quỹ đạo rất khoan dung. κ1/η\kappa \propto \sqrt{1/\eta}, nên một sai số hệ số 2 trong η\eta chỉ dịch chuyển κ\kappa đi 2\sqrt{2}, và hàm chi phí phẳng gần điểm tối ưu. Có được η\eta đúng trong khoảng sai số hệ số 2 và λ\lambda đúng trong khoảng một bậc độ lớn đã nắm bắt được phần lớn cải thiện khả dụng so với TWAP. Độ chính xác quan trọng cho ước lượng chi phí trước giao dịch; độ vững chắc là đủ cho việc lập lịch.

Mô hình gãy ở đâu, và những bài báo khắc phục nó

Almgren-Chriss là một khung sườn, và biết chính xác thanh dầm nào chịu lực sẽ cho bạn biết nên vươn tới phần mở rộng nào.

Impact phi tuyến — Almgren (2003). "Optimal execution with nonlinear impact functions and trading-enhanced risk" (Applied Mathematical Finance 10, 1–18) làm lại toàn bộ chương trình với impact tạm thời dạng lũy thừa h(v)=ηvαh(v) = \eta v^\alpha. Với α1/2\alpha \approx 1/2 được ưa chuộng bởi thực nghiệm — quy luật căn bậc hai — các quỹ đạo tối ưu thay đổi bản chất: impact lõm trừng phạt các đợt bùng nổ ít hơn so với impact tuyến tính, nên các lịch trình tối ưu trở nên dồn tải mạnh hơn về phía đầu ở cùng một λ\lambda. Cấu trúc định tính (tham số khẩn cấp, đường biên hiệu quả) vẫn tồn tại; công thức sinh thì không.

Độ đàn hồi và LOB — Obizhaeva và Wang (2013). "Optimal trading strategy and supply/demand dynamics" (Journal of Financial Markets 16(1), 1–32; working paper lưu hành từ 2005) thay thế phép nhị phân tạm thời/vĩnh viễn bằng một limit order book có độ sâu hữu hạn và impact suy giảm theo hàm mũ: lệnh của bạn ăn vào sổ lệnh, và sổ lệnh được nạp lại ở tốc độ đàn hồi ρ\rho. Giả định "impact tạm thời biến mất ngay lập tức" của AC chính là giới hạn ρ\rho \to \infty. Chiến lược tối ưu thay đổi hình dạng một cách kịch tính: một khối lệnh lớn ở đầu, một khối lệnh lớn ở cuối, và một tốc độ giao dịch không đổi ở giữa — các khối lệnh này khai thác sự phục hồi của sổ lệnh. Nếu khoảng thời gian child-order của bạn tương đương với thời gian bù đắp của venue (trên crypto, vài giây đến một phút — thường đúng như vậy), bạn đang ở lãnh địa Obizhaeva-Wang, không phải lãnh địa Almgren-Chriss, và cách xử lý tạm bợ Δtr\Delta t_r trong phần hiệu chỉnh ở trên chính là dấu hiệu cảnh báo của bạn.

Không-arbitrage-động — Gatheral (2010). "No-dynamic-arbitrage and market impact" (Quantitative Finance 10(7), 749–759) đặt câu hỏi tổ hợp nào của hàm impact tức thời f(v)f(v) và kernel suy giảm G(t)G(t) là nhất quán nội tại, tức không cho phép chiến lược round-trip nào có chi phí kỳ vọng âm. Kết quả rất sắc bén: suy giảm theo hàm mũ chỉ tương thích với impact tuyến tính — kết hợp suy giảm hàm mũ với impact căn bậc hai và mô hình có thể bị bơm tiền bởi một chuỗi giao dịch dao động; impact phi tuyến đòi hỏi suy giảm dạng lũy thừa, với một bất đẳng thức liên kết hai số mũ (với impact vδ\sim v^\delta và suy giảm tγd\sim t^{-\gamma_d}, xấp xỉ γd+δ1\gamma_d + \delta \geq 1). Đây là bài báo cần đọc trước khi bạn gắn một kernel suy giảm phức tạp vào mô hình impact của mình: phần lớn các tổ hợp tùy tiện đều bí mật có thể bị arbitrage, mà trong thực tế nghĩa là bộ tối ưu của bạn sẽ phát hiện ra khe hở arbitrage đó và tạo ra các lịch trình dao động phi lý. Nếu quỹ đạo "tối ưu" của bạn luân phiên mua và bán trong một lần thanh lý thuần túy, bạn đã vi phạm Gatheral, chứ không phải phát hiện ra alpha.

Các phần tiếp theo bằng ML. Hai mạch trong loạt bài này xây dựng trực tiếp trên khung sườn này. Thứ nhất, thực thi bằng reinforcement learning: một khi bạn chấp nhận rằng impact là phi tuyến, phụ thuộc trạng thái, và chỉ quan sát được một phần, dạng đóng biến mất, và RL (từ bài báo Q-learning năm 2006 của Nevmyvaka, Feng và Kearns trở đi) là một cách tự nhiên để tìm kiếm trong không gian quỹ đạo — nhưng mọi agent thực thi RL nghiêm túc đều được benchmark với, và thường được khởi tạo từ, nghiệm AC. Thứ hai, mô hình neural price-impact: thay h(v)=ηvh(v) = \eta v bằng một hàm học được từ trạng thái order book, trong khi vẫn giữ logic lập lịch mean-variance ở trên cùng. Không phần tiếp theo nào có ý nghĩa nếu không biết chính xác baseline tuyến tính-Gaussian là gì và tại sao nó có dạng như vậy.

Điều cần ghi nhớ

Mô hình là ba giả định, một phương trình sai phân, và một con số. Impact vĩnh viễn tuyến tính (bị ép buộc bởi nguyên tắc không-thao-túng), impact tạm thời tuyến tính (một xấp xỉ mà bạn hiệu chỉnh xung quanh), nhiễu Brownian số học. Điểm tối ưu đánh đổi phương sai tồn kho với chi phí impact, toàn bộ chiến lược sụp gọn thành mức khẩn cấp κ=λσ2/η\kappa = \sqrt{\lambda\sigma^2/\eta}, và TWAP rơi ra như trường hợp suy biến λ=0\lambda = 0 — đây là sự thật hữu ích nhất trong toàn bộ mô hình, bởi nó biến câu hỏi "chúng ta có nên TWAP lệnh này không?" từ một thói quen thành một khẳng định có thể kiểm chứng được về mức ngại rủi ro. Hiệu chỉnh mới là công việc thực sự: σ\sigma dễ, η\eta là trò chơi sai số hệ số 2, γ\gamma là một dự án nghiên cứu, và quỹ đạo thì khoan dung với cả ba. Triển khai nó trong một buổi chiều; dành phần còn lại của tháng cho các chẩn đoán hồi quy.

Tài liệu tham khảo

  • 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.
Tuyên bố miễn trừ trách nhiệm: Thông tin được cung cấp trong bài viết này chỉ nhằm mục đích giáo dục và thông tin, không cấu thành lời khuyên về tài chính, đầu tư hoặc giao dịch. Giao dịch tiền mã hóa tiềm ẩn rủi ro thua lỗ đáng kể.

Tác Giả

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

Đi Trước Thị Trường

Đăng ký nhận bản tin của chúng tôi để có những thông tin chuyên sâu độc quyền về AI trading, phân tích thị trường và các cập nhật nền tảng.

Chúng tôi tôn trọng quyền riêng tư của bạn. Hủy đăng ký bất kỳ lúc nào.