Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor ·

Adverse selection คืออะไร ทำไม Market Maker ถึงขาดทุน

ทำความเข้าใจสาเหตุที่ Market Maker ประสบภาวะขาดทุนจาก Adverse selection พร้อมวิธีวัดผลด้วย markout curves รวมถึงปัจจัยด้านความเสี่ยงจากสินค้าคงคลังและต้นทุนลำดับคิว

Market maker มักขาดทุนจาก adverse selection เนื่องจากเทรดเดอร์ที่เข้ามาจับคู่คำสั่งซื้อขาย (lift an offer) มักเป็นผู้ที่ทราบดีอยู่แล้วว่าราคาเสนอซื้อขายนั้นล้าสมัยไปแล้ว การจับคู่คำสั่งซื้อขาย (fill) แต่ละครั้งจะเริ่มต้นด้วยกำไรส่วนต่างเล็กน้อย ซึ่งโดยปกติจะอยู่ที่ประมาณครึ่งหนึ่งของ spread และวินาทีหลังจากนั้นจะเป็นตัวตัดสินว่ากำไรส่วนนี้จะเหลืออยู่เท่าใด เครื่องมือที่ใช้ในการวัดผลคือ markout ซึ่งเป็นการวัดการเปลี่ยนแปลงของราคาที่มีทิศทาง ณ ช่วงเวลาที่กำหนดหลังจากเกิดการจับคู่คำสั่งซื้อขาย และแผงข้อมูลด้านล่างนี้จะสร้างเส้นกราฟ markout จากข้อมูลการซื้อขายและราคาเสนอซื้อขายจริง บทความคู่ขนานของเราในหัวข้อ วิธีที่ market maker ทำกำไร จะอธิบายถึงฝั่งรายได้ของบัญชีประเภทเดียวกันนี้

Adverse selection ในการเทรดคืออะไร?

Market maker จะตั้งราคาเสนอซื้อและเสนอขายพร้อมกันสองด้าน โดยระบุจำนวนหุ้นที่ต้องการซื้อหรือขายในแต่ละราคา ช่องว่างระหว่างราคาเสนอซื้อและเสนอขายเรียกว่า bid ask spread และธุรกิจนี้คือเรื่องของตัวเลขทางคณิตศาสตร์ การซื้อที่ราคา bid และขายที่ราคา offer หากทำซ้ำหลายหมื่นครั้งต่อวัน ผลตอบแทนเฉลี่ยต่อรอบการซื้อขายจะใกล้เคียงกับค่า spread

คณิตศาสตร์ดังกล่าวตั้งอยู่บนสมมติฐานว่าคำสั่งซื้อและขายจะเข้ามาในปริมาณที่สมดุลกัน แต่ในความเป็นจริงไม่เป็นเช่นนั้น ราคาเสนอซื้อขายที่ค้างอยู่ในกระดานเปรียบเสมือนออปชันที่ใครก็ตามสามารถใช้สิทธิได้ทุกเมื่อที่ต้องการ และเทรดเดอร์ที่ติดตามตลาดอย่างใกล้ชิดที่สุดจะเป็นผู้เลือกจังหวะที่ดีที่สุด กองทุนที่กำลังทยอยส่งคำสั่งซื้อขนาดใหญ่จะเข้าซื้ออย่างต่อเนื่องในขณะที่ราคาเสนอขายยังคงถูกอยู่ หรือระบบที่ตรวจพบการเคลื่อนไหวของสินทรัพย์ที่มีความสัมพันธ์กันจะเลือกฝั่งที่ยังไม่ได้ปรับราคาตาม

Adverse selection คือชื่อเรียกของความไม่สมดุลในส่วนผสมนี้ กล่าวคือ การจับคู่คำสั่งซื้อขายที่ market maker ได้รับนั้น มักมาจากเทรดเดอร์ที่ต้องการจับคู่คำสั่งนั้นมากที่สุด สัญญาณบ่งชี้คือช่องว่างระหว่าง spread ที่ market maker เสนอ กับ spread ที่ market maker เก็บได้จริง

Markout ในการทำหน้าที่ market making คืออะไร?

Markout ตอบคำถามหนึ่งข้อที่เกิดขึ้นหลังจากการจับคู่คำสั่งซื้อขายทุกครั้ง นั่นคือ ราคาอยู่ที่เท่าใดหลังจากผ่านไปจำนวนวินาทีที่กำหนด โดยวัดจากฝั่งที่ market maker ถือสถานะอยู่ สมมติว่า market maker ขายหุ้น 100 หุ้นที่ราคา $50.02 ในขณะที่ราคา midpoint อยู่ที่ $50.00 การจับคู่คำสั่งนี้เริ่มต้นด้วยกำไร 2 เซนต์ต่อหุ้น หรือ 20 mils ในหน่วยของ desk (โดย 1 mil เท่ากับหนึ่งในสิบของเซนต์) หากราคา midpoint ขยับไปอยู่ที่ $50.04 ในอีก 60 วินาทีต่อมา markout ที่ 60 วินาทีจะเท่ากับลบ 20 mils ซึ่งหมายความว่ากำไรเริ่มต้นได้หายไปหมดแล้วและยังขาดทุนเพิ่มอีกเท่าตัว

เมื่อนำค่าเฉลี่ยของทุกการจับคู่คำสั่งซื้อขายในช่วงเวลาหนึ่งมาพล็อตเทียบกับช่วงเวลาที่กำหนด ผลลัพธ์ที่ได้คือเส้นกราฟ markout แผงข้อมูลด้านล่างนี้สร้างกราฟสำหรับ AAPL ในช่วงเวลาสามชั่วโมงช่วงกลางวันของวันพฤหัสบดีที่ 14 มิถุนายน 2026 โดยการซื้อขายแต่ละรายการจะถูกระบุทิศทางเทียบกับราคา midpoint ในวินาทีที่เกิดการซื้อขายนั้น: การซื้อขายที่สูงกว่าราคา midpoint ถือว่า taker เป็นฝ่ายซื้อ ซึ่งทำให้ market maker อยู่ในฝั่งขาย

คำสั่งดึงข้อมูลส่วนต่างที่คงเหลือ: เส้น Markout ของ AAPL ตั้งแต่ 1 วินาทีถึง 5 นาที
SQL เบื้องหลังตัวเลขแต่ละตัว
WITH
  qs AS (
    SELECT toUnixTimestamp(toDateTime(sip_timestamp)) AS ts,
           avg((toFloat64(bid_price) + toFloat64(ask_price)) / 2) AS mid
    FROM global_markets.cache_stocks_quotes
    WHERE ticker = 'AAPL'
      AND sip_timestamp >= '2026-05-14 14:00:00'
      AND sip_timestamp <  '2026-05-14 17:06:00'
      AND bid_price > 0 AND ask_price > bid_price
    GROUP BY ts
  ),
  fills AS (
    SELECT t.ts AS ts, t.px AS px, t.shares AS shares, q.mid AS mid_at_fill,
           if(t.px > q.mid, 1, -1) AS taker_side
    FROM (
      SELECT toUnixTimestamp(toDateTime(sip_timestamp)) AS ts,
             toFloat64(price) AS px, toUInt64(size) AS shares
      FROM global_markets.stocks_trades
      WHERE ticker = 'AAPL'
        AND sip_timestamp >= '2026-05-14 14:00:00'
        AND sip_timestamp <  '2026-05-14 17:00:00'
        AND size > 0
    ) AS t
    INNER JOIN qs AS q ON q.ts = t.ts
    WHERE t.px != q.mid AND abs(t.px / q.mid - 1) < 0.02
  )
SELECT
  concat('+', toString(e.secs), 's')                          AS horizon,
  round(1000 * avg(e.taker_side * (e.px - e.mid_at_fill)), 2) AS edge_at_fill_mils,
  round(1000 * avg(e.taker_side * (e.px - f.mid)), 2)         AS edge_after_mils
FROM (
  SELECT toUInt32(ts + secs) AS future_ts, secs, px, mid_at_fill, taker_side
  FROM (SELECT *, arrayJoin([1, 5, 15, 30, 60, 300]) AS secs FROM fills)
) AS e
INNER JOIN qs AS f ON f.ts = e.future_ts
GROUP BY e.secs
ORDER BY e.secs
Run this yourself

ชุดข้อมูลแรกคือส่วนต่างกำไร ณ วินาทีที่เกิดการจับคู่คำสั่งซื้อขาย ซึ่งเป็นระยะห่างระหว่างราคาซื้อขายกับราคา midpoint โดยมีค่าเฉลี่ยอยู่ที่ 19.66 mils ต่อหุ้น ชุดข้อมูลที่สองคือมูลค่าของคำสั่งซื้อขายเหล่านั้นเมื่อราคา midpoint มีเวลาปรับตัว: 20.5 mils ที่หนึ่งวินาทีถัดมา และ 9.81 mils ที่ห้านาทีถัดมา ระยะห่างระหว่างสองชุดข้อมูลนี้ ณ ช่วงเวลาใดก็ตามคือค่า markout ซึ่งเป็นส่วนที่ถูกหักออกจาก spread ที่ market maker เสนอไว้

เส้นกราฟที่ตกลงอย่างรวดเร็วแล้วค่อยราบเรียบแสดงถึง market maker ที่กำลังจ่ายต้นทุนสำหรับการปรับราคาในทันทีและเก็บส่วนที่เหลือไว้ ส่วนเส้นกราฟที่ยังคงลาดเอียงไปในทิศทางเดิมในทุกช่วงเวลาแสดงถึงการจับคู่คำสั่งซื้อขายที่ตกอยู่ในฝั่งที่ผิดของราคาที่ยังคงเคลื่อนที่ต่อไป รูปแบบแรกคือต้นทุนในการทำธุรกิจ ส่วนรูปแบบที่สองคือราคาเสนอที่จำเป็นต้องปรับเปลี่ยน

คำสั่งซื้อขายแบบใดที่เป็น toxic flow?

คำว่า toxic ในที่นี้มีความหมายในเชิงเทคนิค Flow จะถือว่าเป็น toxic เมื่อเส้นกราฟ markout มีความลาดเอียงสวนทางกับ market maker ที่รับคำสั่งนั้นในทุกช่วงเวลาจากการสุ่มตัวอย่างจำนวนมาก ฝ่ายเทรดจะคัดแยกคำสั่งซื้อขายตามป้ายกำกับที่มองเห็นได้ เช่น ขนาดการซื้อขาย, สถานที่ซื้อขาย, ประเภทคำสั่ง และรหัสคู่สัญญา โดยขนาดการซื้อขายเป็นป้ายกำกับที่ปรากฏในข้อมูลการซื้อขายสาธารณะ

คำสั่งดึงข้อมูลการจับคู่คำสั่งซื้อขายของ AAPL ตามขนาด: กำไร ณ จุดจับคู่และมูลค่าในอีก 60 วินาทีต่อมา
SQL เบื้องหลังตัวเลขแต่ละตัว
WITH
  qs AS (
    SELECT toUnixTimestamp(toDateTime(sip_timestamp)) AS ts,
           avg((toFloat64(bid_price) + toFloat64(ask_price)) / 2) AS mid
    FROM global_markets.cache_stocks_quotes
    WHERE ticker = 'AAPL'
      AND sip_timestamp >= '2026-05-14 14:00:00'
      AND sip_timestamp <  '2026-05-14 17:06:00'
      AND bid_price > 0 AND ask_price > bid_price
    GROUP BY ts
  ),
  fills AS (
    SELECT t.ts AS ts, t.px AS px, t.shares AS shares, q.mid AS mid_at_fill,
           if(t.px > q.mid, 1, -1) AS taker_side
    FROM (
      SELECT toUnixTimestamp(toDateTime(sip_timestamp)) AS ts,
             toFloat64(price) AS px, toUInt64(size) AS shares
      FROM global_markets.stocks_trades
      WHERE ticker = 'AAPL'
        AND sip_timestamp >= '2026-05-14 14:00:00'
        AND sip_timestamp <  '2026-05-14 17:00:00'
        AND size > 0
    ) AS t
    INNER JOIN qs AS q ON q.ts = t.ts
    WHERE t.px != q.mid AND abs(t.px / q.mid - 1) < 0.02
  )
SELECT
  multiIf(s.shares < 100, 'under 100 shares',
          s.shares < 500, '100 to 499',
          s.shares < 1000, '500 to 999',
          '1,000 or more')                                    AS size_bucket,
  count()                                                     AS fills_count,
  round(1000 * avg(s.taker_side * (s.px - s.mid_at_fill)), 2) AS edge_at_fill_mils,
  round(1000 * avg(s.taker_side * (s.px - f.mid)), 2)         AS edge_after_60s_mils
FROM (SELECT *, toUInt32(ts + 60) AS future_ts FROM fills) AS s
INNER JOIN qs AS f ON f.ts = s.future_ts
GROUP BY size_bucket
ORDER BY min(s.shares)
Run this yourself

คำสั่งซื้อขายที่ต่ำกว่า 100 หุ้นเริ่มต้นด้วยกำไร 19.47 mils ต่อหุ้น และมีมูลค่า 15.22 mils ในหนึ่งนาทีถัดมา ส่วนคำสั่งซื้อขายที่ 1,000 หุ้นขึ้นไปเริ่มต้นด้วย 36.26 mils และมีมูลค่า 21.34 mils ในช่วงเวลาเดียวกัน สินทรัพย์เดียวกัน ช่วงเวลาสามชั่วโมงเดียวกัน แต่มีผลตอบแทนต่อหุ้นที่แตกต่างกัน คำสั่งซื้อขายขนาดใหญ่ที่สุดมักหลีกเลี่ยงคิวสาธารณะโดยสิ้นเชิง ซึ่งเป็นสิ่งที่ block trade ถูกจัดขึ้นเพื่อดำเนินการ

ความเสี่ยงด้านสินค้าคงคลัง สถานะที่ไม่สามารถป้องกันความเสี่ยงได้ทันเวลา

ช่วงเวลา markout เปรียบเสมือนนาฬิกาเช่นกัน Market maker ที่ซื้อหุ้น 5,000 หุ้นที่ราคา bid จะถือหุ้น 5,000 หุ้นนั้นไว้ และจนกว่าสถานะจะถูกป้องกันความเสี่ยงหรือขายออกไป ก็จะมีความเสี่ยงต่อการเคลื่อนไหวของราคาในลำดับถัดไป การป้องกันความเสี่ยงมักไม่เกิดขึ้นในทันที สถานะหุ้นตัวเดียวสามารถชดเชยได้ด้วย ETF ที่มีความสัมพันธ์กันหรือสถานะออปชัน ซึ่งแต่ละอย่างก็มีค่า spread ของตัวเอง ความเสี่ยงด้านสินค้าคงคลังคือขนาดของการเคลื่อนไหวที่เกิดขึ้นภายในช่วงเวลานั้น และวัดด้วยวิธีเดียวกันสำหรับทุกหลักทรัพย์ ราคาเคลื่อนที่ไปไกลแค่ไหนโดยปกติในช่วงนาทีถัดไปและชั่วโมงถัดไป?

คำสั่งดึงข้อมูลการเคลื่อนไหวของราคาขณะถือสถานะ: SPY และ NVDA ประจำเดือนพฤษภาคม 2026
SQL เบื้องหลังตัวเลขแต่ละตัว
WITH
  bars AS (
    SELECT ticker, window_start,
           toDate(toTimeZone(window_start, 'America/New_York')) AS et_date,
           toFloat64(close) AS px
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('SPY', 'NVDA')
      AND window_start >= '2026-05-01 00:00:00'
      AND window_start <  '2026-06-01 00:00:00'
      AND transactions >= 50
      AND close > 0
  ),
  starts AS (
    SELECT ticker, et_date, px, mins,
           window_start + toIntervalMinute(mins) AS future_start
    FROM (SELECT *, arrayJoin([1, 2, 5, 15, 30, 60]) AS mins FROM bars)
  )
SELECT
  concat(toString(s.mins), ' min')                                AS hold_horizon,
  round(avgIf(abs(f.px / s.px - 1) * 10000, s.ticker = 'SPY'), 1)  AS spy_drift_bps,
  round(avgIf(abs(f.px / s.px - 1) * 10000, s.ticker = 'NVDA'), 1) AS nvda_drift_bps
FROM starts AS s
INNER JOIN bars AS f
  ON f.ticker = s.ticker AND f.et_date = s.et_date AND f.window_start = s.future_start
GROUP BY s.mins
HAVING countIf(s.ticker = 'SPY') > 0 AND countIf(s.ticker = 'NVDA') > 0
ORDER BY s.mins
Run this yourself

ตลอดเดือนพฤษภาคม 2026 การเคลื่อนไหวสัมบูรณ์เฉลี่ยของ SPY ในหนึ่งนาทีอยู่ที่ 1.9 basis points (โดย 1 basis point เท่ากับหนึ่งในร้อยของหนึ่งเปอร์เซ็นต์) ส่วน NVDA อยู่ที่ 5.5 ในช่วงเวลาหนึ่งนาทีเดียวกัน หากขยายเวลาเป็นหนึ่งชั่วโมง ตัวเลขทั้งสองจะกลายเป็น 14.1 และ 40.4 Market maker ที่สามารถปิดสถานะได้ภายในหนึ่งนาทีจะอยู่กับคู่ตัวเลขแรก ส่วน market maker ที่ถือสถานะนานหนึ่งชั่วโมงจะอยู่กับคู่ตัวเลขที่สอง โดยที่กำไรที่เก็บได้จากการจับคู่คำสั่งซื้อขายนั้นเท่ากันไม่ว่าจะกรณีใดก็ตาม

เหตุใด market maker จึงขาดทุนที่ปลายแถวของคิว

ตลาดหลักทรัพย์จะจับคู่คำสั่งซื้อขายที่ค้างอยู่ในกระดานในราคาเดียวตามลำดับเวลาที่เข้ามา: ราคามาก่อน เวลามาก่อน คำสั่งซื้อที่อยู่ท้ายคิว 40,000 หุ้นที่ราคา bid จะต้องรอให้หุ้น 40,000 หุ้นข้างหน้าถูกจับคู่ไปก่อน และ การประมาณตำแหน่งในคิว เป็นวินัยเฉพาะทางอย่างหนึ่ง

ส่วนที่ยุ่งยากคือความหมายของการเคลียร์คิว คิวจะว่างลงได้สองทาง คือผู้ขายเทขายใส่ราคา bid จนหมดระดับราคา หรือราคาเคลื่อนที่ต่ำลงผ่านระดับนั้นไป คำสั่งซื้อที่อยู่ใกล้ต้นแถวจะมีส่วนร่วมในทั้งสองกรณี ส่วนคำสั่งซื้อที่อยู่ท้ายแถวจะถูกจับคู่ส่วนใหญ่ในกรณีที่สอง ในจังหวะที่ระดับราคานั้นกำลังจะกลายเป็นราคาเก่า Market maker สองรายสามารถเทรดสินทรัพย์เดียวกันในราคาเดียวกันแต่เก็บกำไรได้ไม่เท่ากัน ตำแหน่งในคิวไม่เคยปรากฏใน spread ที่เสนอ เนื่องจากทั้งสองรายเสนอราคาเดียวกัน แต่จะปรากฏในเส้นกราฟ markout

เหตุใดการขยาย spread จึงไม่ใช่ทางแก้ที่ฟรี

คำตอบที่ชัดเจนสำหรับเส้นกราฟ markout ที่แย่คือการเสนอราคาที่กว้างขึ้น ราคาเสนอที่กว้างขึ้นจะทำกำไรต่อการจับคู่คำสั่งซื้อขายได้มากขึ้น แต่จะได้รับคำสั่งซื้อขายที่น้อยลง ทั้งสองส่วนของการเทรดนี้อยู่ในข้อมูลการซื้อขายของวันเดียวกัน โดยคัดแยกตามระยะห่างที่แต่ละคำสั่งซื้อขายเกิดขึ้นจากราคา midpoint

คำสั่งดึงข้อมูลการซื้อขายของ AAPL ตามระยะห่างจากราคา Midpoint: สัดส่วนปริมาณการซื้อขายและ Markout ใน 60 วินาที
SQL เบื้องหลังตัวเลขแต่ละตัว
WITH
  qs AS (
    SELECT toUnixTimestamp(toDateTime(sip_timestamp)) AS ts,
           avg((toFloat64(bid_price) + toFloat64(ask_price)) / 2) AS mid
    FROM global_markets.cache_stocks_quotes
    WHERE ticker = 'AAPL'
      AND sip_timestamp >= '2026-05-14 14:00:00'
      AND sip_timestamp <  '2026-05-14 17:06:00'
      AND bid_price > 0 AND ask_price > bid_price
    GROUP BY ts
  ),
  fills AS (
    SELECT t.ts AS ts, t.px AS px, t.shares AS shares, q.mid AS mid_at_fill,
           if(t.px > q.mid, 1, -1) AS taker_side
    FROM (
      SELECT toUnixTimestamp(toDateTime(sip_timestamp)) AS ts,
             toFloat64(price) AS px, toUInt64(size) AS shares
      FROM global_markets.stocks_trades
      WHERE ticker = 'AAPL'
        AND sip_timestamp >= '2026-05-14 14:00:00'
        AND sip_timestamp <  '2026-05-14 17:00:00'
        AND size > 0
    ) AS t
    INNER JOIN qs AS q ON q.ts = t.ts
    WHERE t.px != q.mid AND abs(t.px / q.mid - 1) < 0.02
  )
SELECT
  multiIf(s.cents <= 0.5, '0.5 cents or less',
          s.cents <= 1.0, '0.5 to 1 cent',
          s.cents <= 2.0, '1 to 2 cents',
          'over 2 cents')                                  AS distance_from_mid,
  round(100 * sum(s.shares) / sum(sum(s.shares)) OVER (), 2) AS share_of_volume_pct,
  round(1000 * avg(s.taker_side * (s.px - f.mid)), 2)        AS edge_after_60s_mils
FROM (
  SELECT *, toUInt32(ts + 60) AS future_ts, abs(px - mid_at_fill) * 100 AS cents
  FROM fills
) AS s
INNER JOIN qs AS f ON f.ts = s.future_ts
GROUP BY distance_from_mid
ORDER BY min(s.cents)
Run this yourself

คำสั่งซื้อขายที่อยู่ภายในครึ่งเซนต์จากราคา midpoint คิดเป็น 27.58 เปอร์เซ็นต์ของหุ้นในช่วงเวลานั้น และมีมูลค่า 0.95 mils ต่อหุ้นในหนึ่งนาทีถัดมา คำสั่งซื้อขายที่ห่างออกไปมากกว่าสองเซนต์คิดเป็น 33.19 เปอร์เซ็นต์ของหุ้น ที่มูลค่า 46.86 mils ราคาเสนอที่ตั้งห่างจากราคา midpoint มากขึ้นจะถูกเข้าถึงโดยปริมาณการซื้อขายที่น้อยลงของวัน

อัตราการจับคู่คำสั่งซื้อขาย (fill rate) คือต้นทุนแรกของการขยับราคาออกไป ส่วน Rebate จากตลาดหลักทรัพย์คือต้นทุนที่สอง เนื่องจากสถานที่ซื้อขายหลายแห่งจ่ายค่าตอบแทนให้ market maker ต่อหุ้นที่จับคู่ได้ และรายได้นั้นจะแปรผันตามจำนวนหุ้นมากกว่าความกว้างของราคาเสนอ ระดับปริมาณการซื้อขายที่กำหนดอัตรา Rebate จะถูกนับเป็นรายเดือน ดังนั้นเดือนที่ตลาดเงียบเหงาจะส่งผลต่อราคาของทุกการจับคู่คำสั่งซื้อขายในเดือนถัดไป การสละตำแหน่งในคิวคือต้นทุนสุดท้าย ซึ่งต้องจ่ายทั้งในตอนที่ถอยออกมาและต้องจ่ายอีกครั้งที่ท้ายแถวตอนที่กลับเข้าไปใหม่ Market maker ทุกรายอยู่บนเส้นกราฟนี้ และผู้ที่วัดค่า markout ของตนเองได้อย่างแม่นยำที่สุดจะสามารถอยู่ใกล้ราคาตลาดได้มากที่สุดและยังคงเก็บกำไรไว้ได้ การวัดผลนั้นคือความได้เปรียบที่ market maker รายใหญ่ที่สุด ปกป้องไว้

คำถามที่พบบ่อย

Market maker ขาดทุนจากการเทรดรายรายการหรือไม่?

เป็นเรื่องปกติ บัญชีของ market maker คือการกระจายตัวของกำไรเล็กน้อยและขาดทุนเล็กน้อย โดยคำสั่งซื้อขายที่ขาดทุนจะกระจุกตัวอยู่ในช่วงเวลาก่อนที่ราคาจะเคลื่อนไหว ธุรกิจนี้ตั้งอยู่บนค่าเฉลี่ยจากการจับคู่คำสั่งซื้อขายหลายล้านครั้ง

Markout ในการเทรดคืออะไร?

Markout คือการเปลี่ยนแปลงของราคาตลาด ณ ช่วงเวลาที่กำหนดหลังจากเกิดการจับคู่คำสั่งซื้อขาย โดยวัดจากมุมมองของฝั่งหนึ่ง ซึ่งตัวเลขที่เป็นบวกหมายความว่าฝั่งนั้นได้กำไร ฝ่ายเทรดหุ้นจะระบุ markout เป็น mils ต่อหุ้น และฝ่ายเทรดออปชันจะระบุเป็น ticks ต่อสัญญา

Toxic order flow หมายถึงอะไร?

หมายถึง flow ของคำสั่งซื้อขายที่มีเส้นกราฟ markout ลาดเอียงสวนทางกับ market maker ที่รับคำสั่งนั้นอย่างต่อเนื่อง ซึ่งหมายความว่าราคาเคลื่อนที่ห่างออกไปเรื่อยๆ หลังจากจับคู่คำสั่งซื้อขายแต่ละครั้ง ป้ายกำกับนี้เป็นคุณสมบัติทางสถิติของกระแสคำสั่งซื้อขาย และไม่ได้เป็นการตัดสินเทรดเดอร์รายใดรายหนึ่ง

เหตุใด market maker จึงขยาย spread แทนที่จะถอนราคาเสนอ?

ราคาเสนอที่กว้างขึ้นช่วยให้ market maker ยังคงอยู่ในตลาดที่ราคาซึ่งคุ้มค่ากับเส้นกราฟ markout ที่แย่ลง การถอนราคาเสนอออกไปไม่ได้รายได้ใดๆ และยังต้องเสียตำแหน่งในคิวไปด้วย ฝ่ายเทรดมักทำทั้งสองอย่าง โดยการตัดสินใจขึ้นอยู่กับว่าราคาเสนอคาดว่าจะล้าสมัยนานแค่ไหน

Adverse selection วัดได้อย่างไร?

วัดด้วย markout โดยระบุทิศทางของคำสั่งซื้อขายแต่ละรายการตามฝั่งที่ market maker ถือสถานะอยู่ จากนั้นหาค่าเฉลี่ยการเปลี่ยนแปลงของราคา midpoint ณ ช่วงเวลาที่กำหนดหลังจากนั้น ช่องว่างระหว่างกำไรที่จุดจับคู่คำสั่งซื้อขายกับมูลค่า ณ แต่ละช่วงเวลาคือต้นทุนของ adverse selection ในหน่วยเดียวกับ spread

วิธีการคำนวณตัวเลขเหล่านี้

แผงข้อมูล AAPL ทุกแผงอ่านบันทึกสาธารณะสองรายการ: ข้อมูลการซื้อขาย (trade tape) และข้อมูลราคาเสนอ (quote tape) คำสั่งซื้อขายแต่ละรายการระหว่างเวลา 14:00 ถึง 17:00 UTC ของวันที่ 14 มิถุนายน 2026 จะถูกจับคู่กับค่าเฉลี่ย national best bid and offer midpoint ของวินาทีที่เกิดการซื้อขายนั้น จากนั้นจึงระบุทิศทาง การซื้อขายที่สูงกว่า midpoint นั้นถือเป็น taker buy ซึ่งทำให้ market maker อยู่ในฝั่งขาย คำสั่งซื้อขายที่ราคา midpoint พอดีจะไม่มีการระบุฝั่งและถูกตัดออก รวมถึงคำสั่งซื้อขายใดๆ ที่ห่างจาก midpoint มากกว่า 2 เปอร์เซ็นต์ บันทึกราคาเสนอที่ราคา bid เท่ากับหรือสูงกว่าราคา offer จะถูกยกเว้น เนื่องจาก locked or crossed market ไม่มีราคา midpoint ที่ใช้งานได้

การจับคู่ระดับวินาทีจะประมาณราคาเสนอที่เกิดขึ้น ณ ไมโครวินาทีของการจับคู่คำสั่งซื้อขาย และช่วยให้การอัปเดตที่รวดเร็วที่สุดมีความราบรื่น ราคา ณ ช่วงเวลาที่กำหนดมาจาก midpoint ระดับวินาทีเดียวกัน แผงข้อมูลสินค้าคงคลังใช้แท่งกราฟหนึ่งนาทีและเก็บเฉพาะแท่งที่มีคำสั่งซื้อขายอย่างน้อย 50 รายการ ซึ่งเป็นการรวมกลุ่มตัวอย่างในช่วงเวลาที่มีการซื้อขายหนาแน่นที่สุดของวัน


แผงข้อมูลทุกแผงที่นี่มี SQL ที่สร้างมันขึ้นมา ดังนั้นคณิตศาสตร์ของ markout จึงเปิดเผยให้ตรวจสอบได้ทีละบรรทัด หากต้องการสร้างเส้นกราฟใหม่สำหรับหลักทรัพย์อื่นหรือวันอื่น สามารถขอได้โดยใช้ภาษาอังกฤษทั่วไปที่เทอร์มินัล Strasmore