Almgren-Chriss แบบไม่กั๊กความรู้: Optimal Execution ที่คุณนำไปใช้จริงได้ในบ่ายวันเดียว
งานวิจัยของ Almgren และ Chriss (2001) เรื่อง "Optimal execution of portfolio transactions" (Journal of Risk 3(2), 5–39) น่าจะเป็นเปเปอร์ที่ถูกอ้างอิงมากที่สุดในงานวิจัยด้าน execution และเป็นหนึ่งในเปเปอร์ที่ถูกนำไป implement อย่างถูกต้องน้อยที่สุด โค้ด "Almgren-Chriss" ส่วนใหญ่ที่พบเห็นทั่วไปแท้จริงแล้วเป็น TWAP scheduler ที่มีบล็อกคอมเมนต์แปะไว้ บล็อกโพสต์ส่วนใหญ่ที่พูดถึงมันก็ข้ามส่วนอนุพัทธ์ไป โบกมือให้ฟังก์ชัน sinh อยู่ห่างๆ และไม่เคยแตะส่วนที่สำคัญจริงในระบบ production นั่นคือ พารามิเตอร์เหล่านั้นมาจากไหน
บทความนี้ทำครบทั้งหมด สมมติฐานของโมเดลที่ระบุอย่างตรงไปตรงมา เส้นทางในรูป closed-form ที่ถูกอนุพัทธ์ออกมา ไม่ใช่แค่หยิบยกมาอ้าง efficient frontier และวิธีเลือกพารามิเตอร์ risk-aversion และการ calibrate อินพุตทั้งสามตัว — temporary impact , permanent impact , volatility — จากข้อมูล order book และ trade ของ Binance พร้อมโค้ด Python ที่ใช้งานได้จริงและการอภิปรายอย่างตรงไปตรงมาว่าทำไมการ fit จึงมี noise สูง นี่คือแกนกลางทางความคิดของทุกสิ่งในงาน execution: TWAP, VWAP และ POV ล้วนเป็นกรณีพิเศษหรือญาติเชิง heuristic (ดู TWAP, VWAP, POV: อัลกอริทึม execution ที่ทุกคนใช้กัน) ส่วนแนวทาง ML สมัยใหม่ — reinforcement learning scheduler และ neural impact model — ก็คือความพยายามที่จะผ่อนคลายสมมติฐานเดียวกันกับที่เรากำลังจะเขียนลงไปนี่เอง
การตั้งโจทย์: โมเดลนี้สมมติอะไรจริงๆ
คุณถือสินทรัพย์อยู่ หน่วย (สมมติว่า 100 BTC) และต้อง liquidate ให้หมดภายในเวลา แบ่งช่วง ออกเป็น ช่วงย่อยความยาว ตัวแปรตัดสินใจของคุณคือเส้นทางการถือครอง โดยมี trade ที่ถูก execute ในช่วง
สมมติฐานสามข้อแบกรับโมเดลทั้งหมดเอาไว้:
1. Arithmetic random walk. ราคาที่ยังไม่ถูกรบกวนเป็นไปตาม
โดย เป็น i.i.d. standard normal และ คือ volatility แบบ สัมบูรณ์ (ดอลลาร์ต่อหน่วยเวลา ไม่ใช่เปอร์เซ็นต์) เป็น arithmetic ไม่ใช่ geometric — ในช่วงไม่กี่ชั่วโมง ความต่างนั้นแทบไม่มีนัยสำคัญ และ arithmetic walk ก็ทำให้พีชคณิตยังคงอยู่ในรูป linear-quadratic ไม่มี drift: Almgren และ Chriss อภิปรายเทอม drift ไว้ แต่สำหรับการ liquidate ภายในวัน ค่าประมาณ alpha ของคุณในกรอบ 4 ชั่วโมงแทบจะเป็น noise เสมอ และการตั้งให้มันเป็นศูนย์คือค่าเริ่มต้นที่ซื่อสัตย์ที่สุด
2. Linear permanent impact. : การเทรดที่ rate จะเลื่อนราคาอย่างถาวร เป็นสัดส่วน และการเลื่อนนั้นไม่มีวันจางหาย ทุกหน่วยที่คุณขายจะดันราคา mid ลงไป ตลอดกาล มันดูหยาบ แต่มีเหตุผลลึกซึ้งที่จะรักษามันให้เป็น linear ต่อไป: Huberman และ Stanzl (2004) พิสูจน์ว่า impact แบบ permanent ที่ไม่เป็นเชิงเส้นตามขนาด trade จะเปิดช่องให้เกิดกลยุทธ์ round-trip ที่มีกำไรคาดหวังเป็นบวก — นั่นคือการปั่นราคา (price manipulation) linear permanent impact ไม่ได้เป็นการทำให้ง่ายเพื่อความสะดวก แต่มันเป็นทางเลือกเดียวที่ปราศจาก arbitrage ในโมเดลกลุ่มนี้
3. Linear temporary impact. ราคาที่คุณได้รับจริงในช่วง คือ
จับครึ่งหนึ่งของ bid-ask spread บวกค่าธรรมเนียม ส่วน คือความชันของต้นทุนส่วนเพิ่มในการเรียกร้อง liquidity ที่ rate temporary impact ส่งผลต่อ fill ของคุณเองเท่านั้นและหายไปในทันที — order book เติมกลับเต็มก่อนที่ child order ตัวถัดไปของคุณจะมาถึง คำทั้งสามคำ "linear", "instantly", "fully" ล้วนผิดในตลาดจริง และส่วนสุดท้ายของบทความจะว่าด้วยว่ามันผิดแค่ไหน แต่ก่อนอื่น มาดูผลตอบแทนจากการยอมรับมันกันก่อน
ต้นทุนและความแปรปรวนของเส้นทาง
รวม fill ทั้งหมด ลบออกจาก mark ตั้งต้น แล้วคุณจะได้ implementation shortfall ค่าคาดหวังและความแปรปรวนของมันเหนือ noise คือ:
โดย (เทอมแก้ไขจากการ discretize ที่หายไปเมื่อ )
ข้อสังเกตสองข้อที่ implementation ส่วนใหญ่มองข้าม:
- ต้นทุน permanent ไม่ขึ้นกับเส้นทาง เมื่อ permanent impact เป็น linear และไม่จางหาย คุณจ่ายค่าธรรมเนียมถาวรเท่าเดิมไม่ว่าจะจัด schedule อย่างไร การ optimize จึงเป็นการต่อสู้ระหว่างเทอม temporary-cost (ซึ่งอยากให้เทรดช้าๆ สม่ำเสมอ — มันต่ำสุดที่ นั่นคือ TWAP) กับเทอม variance (ซึ่งอยากให้ inventory ของคุณหายไปตั้งแต่เมื่อวาน — มันต่ำสุดที่การ liquidate ทันที) ล้วนๆ
- เทอม variance ถ่วงน้ำหนักด้วย inventory ไม่ใช่ด้วย trade ความเสี่ยงสะสมบนสิ่งที่คุณยังถืออยู่ ไม่ใช่บนสิ่งที่คุณเทรด นี่คือเหตุผลว่าทำไมความเร่งด่วนจึงดัน schedule ไปกองไว้ข้างหน้า (front-load)
รูป closed form: sinh, cosh และพารามิเตอร์ความเร่งด่วน
Almgren-Chriss ทำการ minimize ฟังก์ชันเป้าหมายแบบ mean-variance
โดย คือ risk aversion ในหน่วย 1/ดอลลาร์ ตั้ง สำหรับจุดภายใน เทอม temporary จะให้ผลต่างอันดับสอง (second differences) ของ ส่วนเทอม variance จะให้ เองออกมา และคุณจะได้สมการผลต่างเชิงเส้นอันดับสอง:
นี่คือ analogue แบบ discrete ของ และเมื่อมีเงื่อนไขขอบเขต , ผลเฉลยจะออกมาในรูป hyperbolic:
โดย เป็นคำตอบของ ซึ่งสำหรับ ที่เล็กก็คือ นั่นเอง

ทุกสิ่งเกี่ยวกับกลยุทธ์ถูกบีบอัดลงในตัวเลขเดียว:
คือ ความเร่งด่วน (urgency) ส่วนกลับของมัน คือเวลาลักษณะเฉพาะ (characteristic time) ของ trade: มาตราส่วนเวลาที่คุ้มค่าจะแบกความเสี่ยงของ inventory เพื่อประหยัดต้นทุน impact สังเกตว่า ไม่ ขึ้นกับอะไร: ขนาด order และเส้นตาย ไม่ว่ามาตราส่วนเวลาโดยธรรมชาติของ trade ของคุณจะเป็น 20 นาทีหรือ 6 ชั่วโมง มันถูกกำหนดโดย risk aversion, volatility และ liquidity เพียงลำพัง หาก เส้นตายของคุณก็ไม่เกี่ยวข้อง — โมเดลจะ liquidate ตาม schedule ของมันเองและหางของ horizon จะไม่ถูกใช้ หาก เส้นตายจะเป็นข้อผูกมัดและคุณกำลังทำ TWAP อยู่โดยปริยาย
ลิมิตแบบ risk-neutral คือ TWAP — นี่คือเหตุผลว่าทำไม TWAP จึงมีอยู่
ให้ ดังนั้น แล้ว และ
เส้นทางที่เหมาะสมยุบลงเป็นเส้นตรง: ปริมาณเท่ากันในช่วงเวลาที่เท่ากัน TWAP ไม่ใช่ heuristic ที่บังเอิญใช้ได้ผล แต่มันคือ optimum ที่แม่นยำของโมเดล Almgren-Chriss สำหรับเทรดเดอร์ที่เป็น risk-neutral ที่มี linear impact ทุกครั้งที่ใครสักคนรัน TWAP เขากำลังยืนยันโดยปริยายว่า : "ฉันไม่สนใจความแปรปรวนของ shortfall ของฉัน สนใจแค่ค่าเฉลี่ยของมัน" นั่นเป็นจุดยืนที่พอรับได้สำหรับ order เล็กและ horizon สั้น แต่มันเป็นจุดยืนที่แปลกประหลาดสำหรับการ liquidate ปริมาณ 5% ของ volume รายวันในเวลา 8 ชั่วโมงในสินทรัพย์ที่มี vol รายวัน 4% ซึ่งก็เป็นจุดที่คนเอาไปรันมันอยู่ดี ลิมิตตรงข้าม ให้ สำหรับทุก : เทขายทุกอย่างในช่วงแรก จ่ายเท่าที่มันจะแพง ระหว่างสองสุดขั้วนี้ เป็นตัว interpolate: แทบแยกไม่ออกจาก TWAP ส่วน เป็น front-load เชิงรุก
Efficient frontier ของ execution
สำหรับแต่ละ คุณจะได้เส้นทางหนึ่งเส้น ต้นทุนคาดหวังหนึ่งค่า และความแปรปรวนหนึ่งค่า การกวาด จะลากเส้นโค้งบนระนาบ ออกมา — นั่นคือ efficient frontier ของ execution ในลักษณะที่เปรียบเทียบตรงกับ Markowitz มันเป็นเส้นโค้งนูน (convex) และลดลง: variance ที่น้อยลงย่อมแลกมาด้วย shortfall คาดหวังที่มากขึ้นเสมอ โดยมีผลตอบแทนส่วนเพิ่มที่ลดลงอย่างชัน ณ จุดบน frontier ที่ถูกเลือกโดยค่า หนึ่งๆ risk aversion จะเท่ากับความชัน (เชิงลบ) ของเส้นสัมผัส:

frontier นี้เปลี่ยนกรอบคำถามจาก "อะไรคือ ?" — ซึ่งไม่มีใครตอบได้ด้วยการมองย้อนเข้าไปในใจ — ให้กลายเป็น "ฉันต้องการ trade-off ระหว่างต้นทุน/ความเสี่ยงแบบไหน?" ซึ่งเป็นสิ่งที่ desk ตอบได้จริง สามวิธีเชิงปฏิบัติในการเลือกจุด:
- การให้เหตุผลแบบ marginal-cost เดินไปตาม frontier แล้วถามว่า "การขยับจากจุดนี้ไปจุดถัดไป ฉันจ่ายต้นทุนคาดหวัง ดอลลาร์เพื่อกำจัดค่าเบี่ยงเบนมาตรฐานของ shortfall ออกไป ดอลลาร์ — ฉันจะรับ trade นี้ไหม?" หัวเข่า (knee) ของ frontier มักจะเห็นได้ชัดภายในความคลาดเคลื่อนราวเท่าตัว และเส้นทางก็ไม่ไวต่อ ที่ความละเอียดระดับนั้น
- Risk budget กำหนดค่า std ของ shortfall สูงสุดที่ยอมรับได้ (เช่น "1-sigma ของ position ที่เหลือในหนึ่งวันต้องอยู่ต่ำกว่า 15 bps ของ notional") แล้วเลือกเส้นทางที่ถูกที่สุดที่สอดคล้องกับเงื่อนไขนั้น นี่เป็นปัญหาแบบมีข้อจำกัด (constrained) ซึ่ง Lagrange multiplier ของมัน คือ
- การกำหนดเป้าเวลาลักษณะเฉพาะ (characteristic-time targeting) เลือก โดยตรง ("order นี้ควรมี half-life 90 นาที") แล้วย้อนหา นี่คือสิ่งที่ practitioner ส่วนใหญ่ทำโดยปริยายเมื่อพวกเขาตั้งค่าสไลเดอร์ "urgency"
ตัวอย่างการคำนวณด้วยตัวเลขที่เราจะให้เหตุผลในหัวข้อ calibration ขาย BTC ที่ S_0 = \100{,}000T = 4\sigma = $600\sqrt{\text{h}}\eta = 1.0\ $\cdot\text{h}/\text{BTC}\lambda = 10^{-6}\ $^{-1}$ จากนั้น
schedule ที่เหมาะสมขาย 46.2 BTC ในชั่วโมงแรก (TWAP: 25) ต้นทุน temporary: \eta \int_0^T v(t)^2 dt \approx \3{,}290$2{,}500$53{,}000$69{,}300 ของ TWAP ดังนั้นเพื่อแลกกับต้นทุนคาดหวังที่เพิ่มขึ้นอีก 0.8 bps บน notional \10M คุณลดความเสี่ยง shortfall ลงได้ 23% นั่นคือเนื้อหาทั้งหมดของโมเดลในประโยคเดียว: มันตั้งราคาของประกัน และปล่อยให้คุณตัดสินใจว่าจะซื้อมันหรือไม่
ตัวเส้นทางเองก็เป็น 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}")
กวาด lam ไปทั่ว np.logspace(-8, -4, 50) แล้วพล็อต เทียบกับ — นั่นคือ frontier ของคุณ และพื้นผิวการตัดสินใจทั้งหมดก็พอดีอยู่บนแผนภูมิเดียวที่คุณส่งให้คณะกรรมการความเสี่ยงได้
Calibration: , , จากข้อมูล Binance
นี่คือจุดที่ 90% ของ implementation ตายเงียบๆ สูตรเส้นทางนั้นง่ายมาก แต่พารามิเตอร์ไม่ใช่ สามปริมาณ สามปัญหาการประมาณค่าที่ต่างกัน

: ตัวที่ง่าย
volatility สัมบูรณ์ต่อรากที่สองของชั่วโมง จาก return ของราคา mid ใช้ bar ระดับ 1 นาทีแล้วสเกล ที่ความถี่การ sample ละเอียดกว่านั้น microstructure noise (bid-ask bounce) จะทำให้ realized variance เอนเอียงสูงเกินจริง ค่าประมาณนี้แน่นหนา — vol คือพารามิเตอร์ตัวเดียวที่คุณจะได้ถูกต้อง
: temporary impact จาก book และจาก trade
สองเส้นทางที่เสริมกัน เส้นทาง A — เดินไปตาม L2 book จาก snapshot ของ depth คำนวณต้นทุนของการ sweep แบบ marketable เชิงสมมติที่ขนาด : VWAP ของ level ที่ถูกกินไปลบด้วย mid การ fit จะให้ instantaneous impact ต่อ BTC เพื่อแปลงให้เป็น แบบอิง rate ของโมเดล คุณต้องสมมติเวลาเติมกลับของ book (อยู่ในลำดับ 10–60 วินาทีสำหรับ BTCUSDT): การเทรดที่ rate จะกิน ต่อรอบการเติมกลับหนึ่งครั้ง ดังนั้น สมมติฐานนั้น — การเติมกลับที่ทันทีและเต็มจำนวนบนนาฬิกาคงที่ — คือรอยแตกที่ Obizhaeva-Wang เดินเข้ามาพอดี รายละเอียดอยู่ด้านล่าง เส้นทาง B — regress slippage ที่เกิดขึ้นจริงบน participation จับ flow ที่เป็นฝ่ายรุก (taker) ใส่ bin ระดับ 1 นาที สำหรับแต่ละ bin ให้ regress ค่า VWAP ฝั่ง taker ลบ mid ตอนเปิด เทียบกับ rate ของ volume ฝั่ง taker เส้นทาง B วัดสิ่งที่ตลาดเก็บค่าจากฝ่ายรุกจริงๆ ส่วนเส้นทาง A วัดสิ่งที่ resting book จะเก็บค่า ณ ตอนนี้ เมื่อทั้งสองไม่ตรงกันถึงราว 3 เท่า จงเชื่อ B สำหรับระดับ (level) และเชื่อ A สำหรับรูปทรงภายในวัน (intraday shape)
: permanent impact ผ่าน regression แบบ Kyle
regress การเปลี่ยนแปลงราคา mid บน signed net taker flow ในหน้าต่าง 5 นาที:
จากนั้นตรวจสอบว่า impact ไม่ได้กลับตัว (revert) ในหน้าต่างถัดไป — ส่วนประกอบที่ไม่กลับตัวคือส่วนที่ "permanent" ที่มาตราส่วนเวลาการเทรดของคุณ นี่คือตัวที่ noise มากที่สุดในสามตัวแบบทิ้งห่าง
โค้ดที่ใช้งานได้จริง โดยใช้แค่ public Binance REST endpoint:
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")
สำหรับ production ให้แทนที่หน้า aggTrades หน้าเดียวด้วย ข้อมูล dump ย้อนหลัง ไม่กี่วัน แล้วรัน regression ของ บน bin หลายพันตัว ไม่ใช่แค่ไม่กี่ตัว
ทำไม calibration ของ crypto จึงมี noise สูง และควรทำอย่างไร
รัน regression ของ บนข้อมูลจริงแล้วคุณจะได้ แค่ไม่กี่เปอร์เซ็นต์ และค่าสัมประสิทธิ์ที่ขยับไปมาราว 2–5 เท่าระหว่างวัน นี่ไม่ใช่บั๊กในโค้ดของคุณ เหตุผลนั้นเป็นเชิงโครงสร้าง:
- Endogeneity flow ตอบสนองต่อราคาพอๆ กับที่ราคาตอบสนองต่อ flow เทรดเดอร์สาย momentum ซื้อ เพราะ ราคาขึ้น การทำ OLS ของ return บน flow อย่างซื่อๆ จะไปจับปฏิกิริยาของพวกเขาแล้วเข้าใจผิดว่ามันคือ impact ทางแก้ที่สะอาดคือใช้ fill ของ ตัวเอง (ซึ่งเป็น exogenous โดยโครงสร้าง) — ซึ่งคุณจะมีก็ต่อเมื่อเทรดไปสักพักแล้วเท่านั้น
- Concavity impact จริงเป็น concave ตามขนาด — ในเชิงประจักษ์ใกล้เคียงกับ square-root (Almgren, Thum, Hauptmann และ Li, 2005, "Direct estimation of equity market impact" พบเลขชี้กำลังใกล้ 0.6 ความ concave แบบเดียวกันนี้ก็แน่นหนาใน crypto) การ fit เส้นตรงเข้ากับฟังก์ชัน concave หมายความว่า และ ของคุณจะขึ้นกับช่วงขนาดในตัวอย่าง จง calibrate ที่ participation rate ที่คุณจะเทรดจริง
- Fragmentation และการนำโดย derivative BTCUSDT spot บน Binance เป็นเพียงหนึ่งใน venue จำนวนมาก และ price discovery มักเกิดขึ้นบน perps flow ที่คุณไม่เคยเห็นเป็นตัวขยับราคาที่คุณ regress อยู่ ทำให้เทอม noise พองขึ้น
- การขึ้นกับ regime ที่วัดในเซสชันเอเชียไม่ได้อธิบายช่วงเปิดตลาดสหรัฐฯ impact เพิ่มขึ้นราวเท่าตัวเมื่อ volatility เพิ่มเป็นสองเท่า จง calibrate แยกตามเซสชัน และ re-fit อย่างน้อยสัปดาห์ละครั้ง
จุดผ่อนปรน: เส้นทาง นั้นให้อภัย ดังนั้นความคลาดเคลื่อน 2 เท่าใน ขยับ เพียง และฟังก์ชันต้นทุนก็แบนราบใกล้ๆ optimum การได้ ถูกต้องภายในราว 2 เท่าและ ถูกต้องภายในหนึ่ง order of magnitude ก็จับส่วนที่ปรับปรุงได้จริงเหนือ TWAP ไว้ได้เกือบหมดแล้ว ความแม่นยำสำคัญสำหรับ การประมาณต้นทุนก่อนเทรด (pre-trade cost estimate) ส่วนความทนทานก็เพียงพอสำหรับ การจัด schedule
จุดที่โมเดลพัง และเปเปอร์ที่ซ่อมมัน
Almgren-Chriss เป็นโครงนั่งร้าน และการรู้แน่ชัดว่าคานอันไหนรับน้ำหนักอยู่ ก็บอกคุณได้ว่าควรหยิบส่วนขยายอันไหนมาใช้
Nonlinear impact — Almgren (2003) "Optimal execution with nonlinear impact functions and trading-enhanced risk" (Applied Mathematical Finance 10, 1–18) ทำโปรแกรมนี้ใหม่ด้วย temporary impact แบบ power-law สำหรับ ที่ได้รับความนิยมในเชิงประจักษ์ — กฎ square-root — เส้นทางที่เหมาะสมจะเปลี่ยนลักษณะ: impact แบบ concave ลงโทษการเทรดกระชากน้อยกว่า linear impact ดังนั้น schedule ที่เหมาะสมจึง front-load มากขึ้นที่ค่า เดียวกัน โครงสร้างเชิงคุณภาพ (พารามิเตอร์ urgency, efficient frontier) ยังคงอยู่ แต่สูตร sinh ไม่รอด
Resilience และ LOB — Obizhaeva และ Wang (2013) "Optimal trading strategy and supply/demand dynamics" (Journal of Financial Markets 16(1), 1–32; working paper เผยแพร่ตั้งแต่ปี 2005) แทนที่การแบ่งขั้ว temporary/permanent ด้วย limit order book ที่มี depth จำกัดและ impact ที่ สลายตัวแบบเอ็กซ์โพเนนเชียล: trade ของคุณกิน book และ book ก็เติมกลับที่ resilience rate สมมติฐาน "temporary impact หายไปทันที" ของ AC คือลิมิต กลยุทธ์ที่เหมาะสมเปลี่ยนรูปทรงอย่างมาก: block trade ที่ตอนต้น อีก block ที่ตอนท้าย และ rate การเทรดคงที่ตรงกลาง — block เหล่านั้นใช้ประโยชน์จากการฟื้นตัวของ book หากช่วง child-order ของคุณเทียบเท่ากับเวลาเติมกลับของ venue (บน crypto คือวินาทีถึงหนึ่งนาที ซึ่งมักเป็นเช่นนั้น) คุณกำลังอยู่ในดินแดนของ Obizhaeva-Wang ไม่ใช่ดินแดนของ Almgren-Chriss และค่า ที่ปรับๆ ลูบๆ ใน calibration ข้างต้นก็คือสัญญาณเตือนของคุณ
No-dynamic-arbitrage — Gatheral (2010) "No-dynamic-arbitrage and market impact" (Quantitative Finance 10(7), 749–759) ถามว่าการผสมกันแบบใดระหว่างฟังก์ชัน instantaneous impact กับ decay kernel ที่สอดคล้องกันภายใน กล่าวคือไม่เปิดช่องให้กลยุทธ์ round-trip ที่มีต้นทุนคาดหวังเป็นลบ ผลลัพธ์นั้นคมชัด: การสลายตัวแบบเอ็กซ์โพเนนเชียลเข้ากันได้ เฉพาะ กับ linear impact — ผสม exponential decay เข้ากับ square-root impact แล้วโมเดลจะถูกปั๊มเงินออกมาได้ด้วยลำดับ trade ที่แกว่งไปมา ส่วน nonlinear impact ต้องการ power-law decay โดยมีอสมการเชื่อมเลขชี้กำลังทั้งสอง (สำหรับ impact และ decay คร่าวๆ คือ ) นี่คือเปเปอร์ที่ต้องอ่านก่อนจะเอา decay kernel เก๋ๆ มาแปะเข้ากับ impact model ของคุณ: การผสมแบบ ad-hoc ส่วนใหญ่แอบมี arbitrage ซึ่งในทางปฏิบัติหมายความว่า optimizer ของคุณจะไปค้นเจอ arbitrage นั้นแล้วผลิต schedule ที่แกว่งไปมาอย่างไร้สาระออกมา หากเส้นทาง "ที่เหมาะสม" ของคุณสลับซื้อสลับขายระหว่างการ liquidate ล้วนๆ คุณได้ละเมิด Gatheral ไม่ใช่ค้นพบ alpha
ภาคต่อสาย ML สองเส้นเรื่องในซีรีส์นี้ต่อยอดจากโครงนั่งร้านนี้โดยตรง เส้นแรกคือ reinforcement-learning execution: เมื่อคุณยอมรับว่า impact เป็น nonlinear, ขึ้นกับ state และสังเกตได้เพียงบางส่วน (partially observable) รูป closed form ก็หายไป และ RL (ตั้งแต่เปเปอร์ Q-learning ของ Nevmyvaka, Feng และ Kearns ปี 2006 เป็นต้นมา) ก็เป็นวิธีธรรมชาติในการค้นหาปริภูมิเส้นทาง — แต่ RL execution agent ที่จริงจังทุกตัวล้วนถูก benchmark เทียบกับ และมักถูก initialize จาก คำตอบของ AC เส้นที่สองคือ neural price-impact model: แทนที่ ด้วย functional ที่เรียนรู้จาก state ของ order book ในขณะที่ยังคงตรรกะการจัด schedule แบบ mean-variance ไว้ด้านบน ภาคต่อทั้งสองไม่มีความหมายเลยหากไม่รู้แน่ชัดว่า baseline แบบ linear-Gaussian คืออะไรและทำไมมันจึงมีรูปแบบเช่นนั้น
สิ่งที่ควรจดจำ
โมเดลนี้คือสมมติฐานสามข้อ สมการผลต่างหนึ่งสมการ และตัวเลขหนึ่งตัว linear permanent impact (ถูกบังคับโดยการห้าม manipulation), linear temporary impact (การประมาณที่คุณ calibrate อยู่รอบๆ), arithmetic Brownian noise optimum นั้น trade-off ระหว่าง variance ของ inventory กับต้นทุน impact กลยุทธ์ทั้งหมดยุบลงเป็น urgency และ TWAP ก็หล่นออกมาในฐานะกรณี degenerate ที่ — ซึ่งเป็นข้อเท็จจริงที่มีประโยชน์ที่สุดเพียงข้อเดียวในโมเดล เพราะมันเปลี่ยน "เราควร TWAP ตัวนี้ไหม?" จากเรื่องของความเคยชิน ให้กลายเป็นข้ออ้างเกี่ยวกับ risk aversion ที่ตรวจสอบได้ calibration คืองานจริง: ง่าย, เป็นเกมความคลาดเคลื่อน 2 เท่า, เป็นโปรเจกต์วิจัย และเส้นทางก็ให้อภัยทั้งสามตัว implement มันในบ่ายวันเดียว แล้วใช้เวลาที่เหลือของเดือนไปกับ regression diagnostics
References
- 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.
ผู้เขียน
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.