Strasmore Research
สรุปภาวะตลาด Matt Connorโดย Matt Connor · อัปเดตเมื่อ 2026-07-24 · data as of July 24, 2026 · refreshed weekly

กิจกรรมการซื้อขายออปชันที่ผิดปกติล่าสุด

สรุปรายการออปชันที่มีปริมาณการซื้อขายสูงกว่าค่าเฉลี่ย 20 รอบการซื้อขายล่าสุด โดยวิเคราะห์สัดส่วนระหว่างสัญญา Call และ Put จากข้อมูลตลาดสหรัฐฯ ทั้งหมด

กิจกรรมการซื้อขายออปชันที่ผิดปกติ (Unusual options activity) หมายถึงการที่สินทรัพย์อ้างอิงมีการซื้อขายสัญญาออปชันในหนึ่งรอบการซื้อขายมากกว่าระดับปกติที่เคยทำไว้ก่อนหน้านี้ ตารางนี้จัดอันดับกิจกรรมดังกล่าวสำหรับรอบการซื้อขายออปชันที่เสร็จสมบูรณ์ล่าสุดคือ Jul 22 โดยเปรียบเทียบจำนวนสัญญาที่ซื้อขายทั้งหมดกับค่าเฉลี่ยของสินทรัพย์อ้างอิงนั้นในช่วง 20 รอบการซื้อขายก่อนหน้า เนื่องจากข้อมูลการซื้อขายออปชันจะถูกบันทึกล่าช้ากว่าข้อมูลหุ้น รอบการซื้อขายที่ระบุในที่นี้จึงเป็นรอบล่าสุดที่มีข้อมูลครบถ้วนในระบบของเรา ไม่ใช่ข้อมูลของวันนี้

ข้อควรระวังก่อนดูตาราง: นี่คือการคัดกรองด้วยปริมาณการซื้อขาย (volume screen) การแจ้งเตือนออปชันผิดปกติส่วนใหญ่ที่เผยแพร่กันมักเปรียบเทียบปริมาณการซื้อขายรายวันกับสถานะคงค้าง (open interest) ซึ่งคือจำนวนสัญญาที่ยังคงค้างอยู่หลังปิดตลาด แต่ข้อมูลออปชันที่เราจัดเก็บนั้นเป็นข้อมูลการซื้อขาย (trades) ไม่ใช่ข้อมูลสถานะ (positions) และไม่มีฟิลด์ข้อมูลสถานะคงค้างในระบบ ดังนั้นทุกอัตราส่วนด้านล่างนี้จึงเป็นการเปรียบเทียบปริมาณการซื้อขายของสินทรัพย์อ้างอิงกับประวัติปริมาณการซื้อขายของตัวมันเอง ทั้งนี้ ปริมาณการซื้อขายออปชันเทียบกับสถานะคงค้าง จะอธิบายรายละเอียดของแต่ละการวัดผลไว้

กิจกรรมออปชันที่ผิดปกติ: เซสชันล่าสุดที่เสร็จสิ้น

คำสั่งดึงข้อมูลกิจกรรมออปชันที่ผิดปกติ: เซสชันล่าสุดเทียบกับค่าเฉลี่ย 20 เซสชันของหลักทรัพย์อ้างอิง
SQL เบื้องหลังตัวเลขแต่ละตัว
WITH tape AS (
    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS d,
           sum(toFloat64(volume)) AS vol
    FROM global_markets.options_minute_aggs
    WHERE window_start >= toDateTime(today() - 45, 'America/New_York')
    GROUP BY d
),
ranked AS (
    SELECT d, vol, row_number() OVER (ORDER BY d DESC) AS raw_rn
    FROM tape
),
cal AS (
    SELECT d, vol, rn, sum(if(rn BETWEEN 2 AND 21, 1, 0)) OVER () AS baseline_sessions
    FROM (
        SELECT d, vol, row_number() OVER (ORDER BY d DESC) AS rn
        FROM ranked
        WHERE vol >= 0.75 * (SELECT quantileExact(0.5)(vol) FROM ranked WHERE raw_rn > 1)
    )
),
day_root AS (
    SELECT substring(ticker, 3, length(ticker) - 17) AS root,
           toDate(toTimeZone(window_start, 'America/New_York')) AS d,
           sum(toFloat64(volume)) AS vol
    FROM global_markets.options_minute_aggs
    WHERE window_start >= toDateTime(today() - 45, 'America/New_York')
    GROUP BY root, d
),
scored AS (
    SELECT r.root AS root,
           sumIf(r.vol, c.rn = 1) AS last_vol,
           avgIf(r.vol, c.rn BETWEEN 2 AND 21) AS base_vol,
           maxIf(r.vol, c.rn BETWEEN 2 AND 21) AS prior_high,
           countIf(c.rn BETWEEN 2 AND 21) AS root_sessions,
           max(c.baseline_sessions) AS baseline_session_count,
           maxIf(toYYYYMMDD(c.d), c.rn = 1) AS session_id,
           maxIf(formatDateTime(c.d, '%b %e'), c.rn = 1) AS session_label
    FROM day_root r INNER JOIN cal c ON r.d = c.d
    WHERE c.rn <= 21
      AND r.root NOT IN ('SPCX')
      AND r.root NOT IN ('KORU','SOXL','SOXS','TQQQ','SQQQ','NVDL','NVDS','NVD','TSLL','TSLQ','TSLZ','SPXL','SPXS','UPRO','SPXU','LABU','LABD','FAS','FAZ','TNA','TZA','YINN','YANG','UDOW','SDOW','BOIL','KOLD','UCO','SCO','USD','SSO','SDS','QLD','QID','ERX','ERY','DRN','DRV','CURE','SOXY','MUU','SNXX','UVXY','SVXY','UVIX','SVIX','BULZ','WEBL','WEBS','DPST','DRIP','GUSH','AGQ','ZSL','BITX','ETHU','MSTX','MSTU','CONL','DUST','JNUG','JDST','NUGT')
    GROUP BY r.root
    HAVING last_vol >= 25000 AND base_vol >= 5000 AND root_sessions >= 18
)
SELECT root AS ticker,
       round(last_vol / base_vol, 1) AS vol_ratio,
       round(last_vol / 1000, 1) AS session_volume_k,
       round(base_vol / 1000, 1) AS baseline_volume_k,
       round(prior_high / 1000, 1) AS prior_high_volume_k,
       session_label,
       session_id,
       baseline_session_count
FROM scored
ORDER BY vol_ratio DESC, ticker ASC
LIMIT 10

ข้อมูลประกอบด้วยสามคอลัมน์หลัก อัตราส่วน (ratio) แสดงระดับการซื้อขายของสินทรัพย์อ้างอิงเมื่อเทียบกับค่าเฉลี่ยปกติ ค่าฐาน (baseline) คือค่าปกติที่ใช้เปรียบเทียบ โดยค่าพหุคูณที่สูงจากฐานที่มีปริมาณการซื้อขายต่ำจะถือเป็นเหตุการณ์ที่เล็กกว่าค่าพหุคูณที่สูงจากฐานที่มีปริมาณการซื้อขายหนาแน่น ส่วนค่าสูงสุดในรอบ 20-session จะระบุว่าเซสชันนี้มีปริมาณสูงกว่าค่าสูงสุดเดิมในเดือนที่ผ่านมาหรือไม่ สามคอลัมน์สุดท้ายคือข้อมูลตรวจสอบ (audit trail) ประกอบด้วยเซสชันที่ใช้เป็นฐานข้อมูลซึ่งแสดงทั้งในรูปแบบป้ายกำกับและตัวเลข รวมถึงจำนวนเซสชันที่นำมาคำนวณค่าฐาน ซึ่งต้องมีครบ 20 เซสชันเพื่อให้หน้าเว็บแสดงผลได้

CVS มีปริมาณสูงสุดที่ 7.2 เท่าของค่าเฉลี่ยตนเอง: จำนวน 138.2 พันสัญญา เทียบกับค่าฐาน 19.3 พัน โดยมีค่าสูงสุดเดิมในรอบ 20-session อยู่ที่ 59.3 พัน

  • INFY ที่ 4.2 เท่า: จำนวน 29.5 พันสัญญา เทียบกับค่าฐาน 7 พัน
  • GM ที่ 3.6 เท่า โดยมีจำนวน 67.1 พันสัญญา บนค่าฐาน 18.6 พัน
  • SMCI ที่ 3.6 เท่า โดยมีจำนวน 737 พันสัญญา เทียบกับค่าสูงสุดในรอบ 20-session ที่ 361.8 พัน
  • WDAY ที่ 3.6 เท่า บนจำนวน 28 พันสัญญา

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

Calls หรือ puts: ทิศทางของปริมาณการซื้อขาย

ความแตกต่างระหว่างปริมาณการซื้อขาย call และ put คือประเด็นสำคัญที่การแจ้งเตือนต้องการชี้ให้เห็น ข้อมูลจากกระดานเดียวกัน ในเซสชันเดียวกัน โดยเรียงลำดับตามสัดส่วน call:

คำสั่งดึงข้อมูลCalls หรือ puts: ปริมาณสัญญา call และ put ในเซสชันเดียวกัน
SQL เบื้องหลังตัวเลขแต่ละตัว
WITH tape AS (
    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS d,
           sum(toFloat64(volume)) AS vol
    FROM global_markets.options_minute_aggs
    WHERE window_start >= toDateTime(today() - 45, 'America/New_York')
    GROUP BY d
),
ranked AS (
    SELECT d, vol, row_number() OVER (ORDER BY d DESC) AS raw_rn
    FROM tape
),
cal AS (
    SELECT d, vol, rn, sum(if(rn BETWEEN 2 AND 21, 1, 0)) OVER () AS baseline_sessions
    FROM (
        SELECT d, vol, row_number() OVER (ORDER BY d DESC) AS rn
        FROM ranked
        WHERE vol >= 0.75 * (SELECT quantileExact(0.5)(vol) FROM ranked WHERE raw_rn > 1)
    )
),
day_root AS (
    SELECT substring(ticker, 3, length(ticker) - 17) AS root,
           toDate(toTimeZone(window_start, 'America/New_York')) AS d,
           sum(toFloat64(volume)) AS vol,
           sumIf(toFloat64(volume), substring(ticker, length(ticker) - 8, 1) = 'C') AS calls,
           sumIf(toFloat64(volume), substring(ticker, length(ticker) - 8, 1) = 'P') AS puts
    FROM global_markets.options_minute_aggs
    WHERE window_start >= toDateTime(today() - 45, 'America/New_York')
    GROUP BY root, d
),
scored AS (
    SELECT r.root AS root,
           round(sumIf(r.vol, c.rn = 1) / avgIf(r.vol, c.rn BETWEEN 2 AND 21), 1) AS vol_ratio,
           sumIf(r.calls, c.rn = 1) AS calls,
           sumIf(r.puts, c.rn = 1) AS puts,
           maxIf(toYYYYMMDD(c.d), c.rn = 1) AS session_id
    FROM day_root r INNER JOIN cal c ON r.d = c.d
    WHERE c.rn <= 21
      AND r.root NOT IN ('SPCX')
      AND r.root NOT IN ('KORU','SOXL','SOXS','TQQQ','SQQQ','NVDL','NVDS','NVD','TSLL','TSLQ','TSLZ','SPXL','SPXS','UPRO','SPXU','LABU','LABD','FAS','FAZ','TNA','TZA','YINN','YANG','UDOW','SDOW','BOIL','KOLD','UCO','SCO','USD','SSO','SDS','QLD','QID','ERX','ERY','DRN','DRV','CURE','SOXY','MUU','SNXX','UVXY','SVXY','UVIX','SVIX','BULZ','WEBL','WEBS','DPST','DRIP','GUSH','AGQ','ZSL','BITX','ETHU','MSTX','MSTU','CONL','DUST','JNUG','JDST','NUGT')
    GROUP BY r.root
    HAVING sumIf(r.vol, c.rn = 1) >= 25000
       AND avgIf(r.vol, c.rn BETWEEN 2 AND 21) >= 5000
       AND countIf(c.rn BETWEEN 2 AND 21) >= 18
),
board AS (
    SELECT root, vol_ratio, calls, puts, session_id
    FROM scored
    ORDER BY vol_ratio DESC, root ASC
    LIMIT 10
)
SELECT root AS ticker,
       round(calls / 1000, 1) AS call_volume_k,
       round(puts / 1000, 1) AS put_volume_k,
       round(100.0 * calls / (calls + puts), 0) AS call_share_pct,
       session_id
FROM board
WHERE calls + puts > 0
ORDER BY call_share_pct DESC, ticker ASC

ในกลุ่มที่มีปริมาณ call สูงสุด CVS เปลี่ยนสัญญาเป็น call จำนวน 95% ของทั้งหมด: โดยมี call จำนวน 130.7 พัน สัญญา เทียบกับ put จำนวน 7.5 พัน สัญญา ในขณะที่อีกด้านหนึ่งของตารางเดียวกัน WDAY มีปริมาณ call จำนวน 30% โดยมี call จำนวน 8.3 พัน สัญญา เทียบกับ put จำนวน 19.7 พัน สัญญา

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

องค์ประกอบของสัญญาในเซสชันนี้

คำสั่งดึงข้อมูลองค์ประกอบของสัญญาในเซสชัน: ปริมาณออปชันแบ่งตามจำนวนวันจนถึงวันหมดอายุ
SQL เบื้องหลังตัวเลขแต่ละตัว
WITH tape AS (
    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS d,
           sum(toFloat64(volume)) AS vol
    FROM global_markets.options_minute_aggs
    WHERE window_start >= toDateTime(today() - 45, 'America/New_York')
    GROUP BY d
),
ranked AS (
    SELECT d, vol, row_number() OVER (ORDER BY d DESC) AS raw_rn
    FROM tape
),
cal AS (
    SELECT d, vol, rn, sum(if(rn BETWEEN 2 AND 21, 1, 0)) OVER () AS baseline_sessions
    FROM (
        SELECT d, vol, row_number() OVER (ORDER BY d DESC) AS rn
        FROM ranked
        WHERE vol >= 0.75 * (SELECT quantileExact(0.5)(vol) FROM ranked WHERE raw_rn > 1)
    )
),
bars AS (
    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS d,
           toFloat64(volume) AS v,
           toDate(concat('20', substring(ticker, length(ticker) - 14, 2), '-',
                         substring(ticker, length(ticker) - 12, 2), '-',
                         substring(ticker, length(ticker) - 10, 2))) AS expiry
    FROM global_markets.options_minute_aggs
    WHERE window_start >= toDateTime(today() - 12, 'America/New_York')
      AND toDate(toTimeZone(window_start, 'America/New_York')) IN (SELECT d FROM cal WHERE rn = 1)
),
scored AS (
    SELECT multiIf(expiry - d <= 0, 1, expiry - d <= 7, 2, expiry - d <= 30, 3,
                   expiry - d <= 90, 4, expiry - d <= 365, 5, 6) AS bk,
           v, d
    FROM bars
)
SELECT arrayElement(['same day', '1 to 7 days', '8 to 30 days', '31 to 90 days', '91 to 365 days', 'over a year'], bk) AS dte_bucket,
       round(sum(v) / 1e6, 2) AS contracts_m,
       round(100.0 * sum(v) / sum(sum(v)) OVER (), 1) AS pct_of_volume,
       toYYYYMMDD(max(d)) AS session_id
FROM scored
GROUP BY bk
ORDER BY bk ASC

สัญญาที่มีวันหมดอายุภายในวันเดียวมีสัดส่วน 36.3% ของทั้งหมด หรือคิดเป็น 20.1 ล้านสัญญา นอกจากนี้ยังมีสัญญาอีก 27.1% ที่หมดอายุภายในหนึ่งสัปดาห์ ส่วนสัญญาที่มีอายุคงเหลือมากกว่าหนึ่งปีมีสัดส่วนอยู่ที่ 1.2%

สัดส่วนดังกล่าวส่งผลต่อการตีความพาดหัวข่าวเกี่ยวกับกิจกรรมที่ผิดปกติ เนื่องจากปริมาณการซื้อขายส่วนใหญ่ในกระดานลักษณะนี้เป็นสัญญาที่มีอายุสั้น โดยสัญญาที่หมดอายุภายในวันเดียวจะถูกชำระราคาเมื่อปิดตลาดแทนที่จะเป็นการถือครองต่อไป 0DTE options คือส่วนที่ครอบคลุมสัญญาประเภทนี้

นี่คือช่วงวันหมดอายุสัญญา (expiration session) หรือไม่?

ปริมาณการซื้อขาย Options เพิ่มขึ้นทั่วทั้งตลาดในช่วงวันหมดอายุรายเดือน ซึ่งเป็นช่วงที่สัญญาที่มีขนาดใหญ่ที่สุดในตลาดจะสิ้นสุดลงพร้อมกัน การใช้เครื่องมือคัดกรองด้วยอัตราส่วน (ratio screen) ในวันหมดอายุสัญญาจะตรวจพบความผิดปกติในครึ่งหนึ่งของตลาด ดังนั้นตารางด้านล่างจึงระบุข้อมูลของทุกเซสชันในช่วงเวลาดังกล่าว

คำสั่งดึงข้อมูลปริมาณออปชันทั่วทั้งตลาดแบ่งตามเซสชัน พร้อมระบุเดือนที่หมดอายุ
SQL เบื้องหลังตัวเลขแต่ละตัว
WITH tape AS (
    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS d,
           sum(toFloat64(volume)) AS vol
    FROM global_markets.options_minute_aggs
    WHERE window_start >= toDateTime(today() - 45, 'America/New_York')
    GROUP BY d
),
ranked AS (
    SELECT d, vol, row_number() OVER (ORDER BY d DESC) AS raw_rn
    FROM tape
),
cal AS (
    SELECT d, vol, rn, sum(if(rn BETWEEN 2 AND 21, 1, 0)) OVER () AS baseline_sessions
    FROM (
        SELECT d, vol, row_number() OVER (ORDER BY d DESC) AS rn
        FROM ranked
        WHERE vol >= 0.75 * (SELECT quantileExact(0.5)(vol) FROM ranked WHERE raw_rn > 1)
    )
),
w AS (
    SELECT d, vol,
           toStartOfMonth(d) + toIntervalDay(((5 - toDayOfWeek(toStartOfMonth(d)) + 7) % 7) + 14) AS third_friday
    FROM cal
    WHERE rn <= 25
),
marked AS (
    SELECT d, vol,
           (d = max(if(d <= third_friday, d, toDate('1970-01-01'))) OVER (PARTITION BY toStartOfMonth(d)))
             AND (third_friday <= max(d) OVER ()) AS is_expiry
    FROM w
),
latest AS (
    SELECT d, vol, is_expiry,
           max(if(is_expiry, d, toDate('1970-01-01'))) OVER () AS last_expiry_d
    FROM marked
)
SELECT formatDateTime(d, '%b %e') AS session,
       round(vol / 1e6, 1) AS contracts_m,
       multiIf(is_expiry, 'monthly expiration', 'ordinary') AS session_type,
       round(max(if(d = last_expiry_d, vol, 0)) OVER () / 1e6, 1) AS monthly_expiry_m,
       toYYYYMMDD(d) AS session_id
FROM latest
ORDER BY d ASC

เซสชันล่าสุดในตารางนี้คือเซสชันที่รายงานในกระดาน ซึ่งเป็นวันที่เดียวกันในทั้งสองตาราง และมีป้ายกำกับคือ ordinary โดยมีปริมาณการซื้อขายรวมทั้งตลาดสหรัฐฯ อยู่ที่ 55.4 ล้านสัญญา สำหรับการหมดอายุรายเดือนครั้งล่าสุดในช่วงเวลาเดียวกันมีปริมาณอยู่ที่ 76.8 ล้านสัญญา โดยปกติแล้วค่าฐาน 20-session ที่ใช้คำนวณอัตราส่วนในกระดานจะประกอบด้วยวันหมดอายุรายเดือนเพียงหนึ่งครั้ง ดังนั้นตัวหารจึงมีค่าเท่ากันในแต่ละเซสชัน

กิจกรรมการซื้อขายออปชันที่ผิดปกติเป็นตัวบ่งชี้ทิศทางราคาหุ้นหรือไม่?

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

คำสั่งดึงข้อมูลสิ่งที่เกิดขึ้นหลังเซสชันที่มีปริมาณออปชันสูง: การเคลื่อนไหวสุทธิในเซสชันถัดไปเทียบกับวันปกติ
SQL เบื้องหลังตัวเลขแต่ละตัว
WITH daily AS (
    SELECT underlying_symbol AS sym,
           date AS d,
           sum(volume) AS vol,
           max(underlying_close) AS px
    FROM global_markets.options_greeks
    WHERE date >= today() - 200
      AND underlying_close > 0
      AND underlying_symbol NOT IN ('SPCX')
      AND underlying_symbol NOT IN ('KORU','SOXL','SOXS','TQQQ','SQQQ','NVDL','NVDS','NVD','TSLL','TSLQ','TSLZ','SPXL','SPXS','UPRO','SPXU','LABU','LABD','FAS','FAZ','TNA','TZA','YINN','YANG','UDOW','SDOW','BOIL','KOLD','UCO','SCO','USD','SSO','SDS','QLD','QID','ERX','ERY','DRN','DRV','CURE','SOXY','MUU','SNXX','UVXY','SVXY','UVIX','SVIX','BULZ','WEBL','WEBS','DPST','DRIP','GUSH','AGQ','ZSL','BITX','ETHU','MSTX','MSTU','CONL','DUST','JNUG','JDST','NUGT')
      AND underlying_symbol NOT IN (SELECT ticker FROM global_markets.stocks_splits
                                    WHERE execution_date BETWEEN today() - 230 AND today())
    GROUP BY sym, d
),
seq AS (
    SELECT sym, d, vol, px,
           avg(vol) OVER (PARTITION BY sym ORDER BY d ROWS BETWEEN 20 PRECEDING AND 1 PRECEDING) AS base,
           count() OVER (PARTITION BY sym ORDER BY d ROWS BETWEEN 20 PRECEDING AND 1 PRECEDING) AS base_n,
           any(px) OVER (PARTITION BY sym ORDER BY d ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING) AS next_px,
           any(px) OVER (PARTITION BY sym ORDER BY d ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) AS prev_px
    FROM daily
),
moves AS (
    SELECT sym, vol, base, base_n,
           if(next_px > 0, 100 * abs(next_px / px - 1), -1) AS next_abs,
           if(next_px > 0, 100 * (next_px / px - 1), -999) AS next_signed,
           if(prev_px > 0, 100 * abs(px / prev_px - 1), -1) AS own_abs
    FROM seq
),
typical AS (
    SELECT sym, quantileExact(0.5)(own_abs) AS typ
    FROM moves
    WHERE own_abs >= 0
    GROUP BY sym
)
SELECT arrayElement(['5x or more', '3x to 5x', '2x to 3x', '1x to 2x', 'below 1x'], bk) AS rvol_bucket,
       count() AS event_count,
       round(quantileExact(0.5)(next_abs), 2) AS median_next_move_pct,
       round(quantileExact(0.5)(typ), 2) AS median_typical_move_pct,
       round(quantileExact(0.5)(next_abs) - quantileExact(0.5)(typ), 2) AS gap_pp,
       round(quantileExact(0.5)(next_signed), 2) AS median_next_signed_pct
FROM (
    SELECT m.sym AS sym,
           multiIf(m.vol / m.base >= 5, 1, m.vol / m.base >= 3, 2, m.vol / m.base >= 2, 3,
                   m.vol / m.base >= 1, 4, 5) AS bk,
           m.next_abs AS next_abs,
           m.next_signed AS next_signed,
           t.typ AS typ
    FROM moves m INNER JOIN typical t ON m.sym = t.sym
    WHERE m.base_n = 20 AND m.base >= 5000 AND m.vol >= 25000 AND m.next_abs >= 0
)
GROUP BY bk
ORDER BY bk ASC

หลังจากเซสชันที่มีปริมาณการซื้อขายสูงกว่าค่าฐานเดิมตั้งแต่ห้าเท่าขึ้นไป ค่ามัธยฐานของการเปลี่ยนแปลงสัมบูรณ์ (absolute change) ในเซสชันถัดไปอยู่ที่ 2.52% เมื่อเทียบกับ 1.92% ในวันปกติ ซึ่งมีความแตกต่างกัน 0.6 percentage points สำหรับกลุ่มที่มีปริมาณการซื้อขายต่ำ ค่าในทั้งสองคอลัมน์คือ 1.87% และ 2.09% ซึ่งมีความแตกต่างกัน -0.22 points

ข้อสรุปที่แท้จริงคือความแตกต่างนั้นมีเพียงเล็กน้อย และเป็นเรื่องของขนาดการเคลื่อนไหวมากกว่าทิศทาง การซื้อขายออปชันที่หนาแน่นมักตามมาด้วยการเคลื่อนไหวของราคาที่ใหญ่ขึ้นเล็กน้อยในเชิงสัมบูรณ์ โดยส่วนต่างของค่ามัธยฐานนั้นคิดเป็นเพียงเศษเสี้ยวของหนึ่งเปอร์เซ็นต์เท่านั้น ค่ามัธยฐานของการเปลี่ยนแปลงที่มีเครื่องหมาย (signed change) ในเซสชันหลังจากวันที่ปริมาณการซื้อขายสูงกว่าค่าฐานห้าเท่าคือ -0.34% และหลังจากวันที่ปริมาณการซื้อขายต่ำกว่าค่าฐานคือ -0.05% ซึ่งทั้งสองค่าไม่ได้มีการเคลื่อนไหวที่รุนแรงอย่างที่พาดหัวข่าวระบุไว้ นอกจากนี้ควรพิจารณาถึงความถี่ในการเกิดเหตุการณ์ด้วย: มีเพียง 652 เซสชันที่มีปริมาณการซื้อขายสูงกว่าค่าฐานเดิมห้าเท่าตลอดช่วงเวลาที่ศึกษา เมื่อเทียบกับ 11781 เซสชันที่มีปริมาณการซื้อขายต่ำกว่าค่าฐานเดิม

วิธีการวัดผลของหน้าจอนี้

หน้าจอที่มีกฎเกณฑ์ซ่อนอยู่จะอ่านค่าเป็นข้อมูล แต่ในความเป็นจริงคือความเห็น ดังนั้นเราจึงแสดงกฎทุกข้อไว้ที่นี่

  1. แหล่งข้อมูล. ข้อมูล minute tape ของ US options ทั้งหมด โดยมีการแยกสินทรัพย์อ้างอิงออกจากสัญลักษณ์ OCC ของแต่ละสัญญา ดังนั้นจึงรวมทั้งรากของ index option และสัญญาที่มีวันหมดอายุภายในวันเดียว ควบคู่ไปกับหุ้นและกองทุนทั่วไป
  2. อัตราส่วน. ปริมาณสัญญาซื้อขายรวม (total contract volume) ของเซสชันล่าสุดที่เสร็จสมบูรณ์ หารด้วยค่าเฉลี่ยของสินทรัพย์อ้างอิงเดียวกันในช่วง 20 เซสชันที่มีคุณสมบัติครบถ้วนก่อนหน้า โดยอย่างน้อย 18 จาก 20 เซสชันนั้นต้องมีปริมาณการซื้อขาย หากช่วงเวลาไม่ครบ 20 เซสชัน ระบบจะแสดงผลค้างไว้แทนที่จะแสดงค่าเฉลี่ยที่สั้นกว่าภายใต้ป้ายกำกับ 20 เซสชัน
  3. เกณฑ์ขั้นต่ำ. กำหนดไว้ที่ 25,000 สัญญาต่อเซสชัน และมีค่าพื้นฐาน (baseline) ที่ 5,000 สัญญา หากไม่มีเกณฑ์นี้ หน้าจอจะเต็มไปด้วยชุดข้อมูลที่คำสั่งซื้อเพียงรายการเดียวอาจทำให้ค่าที่อ่านได้สูงถึง 10 เท่า
  4. คุณสมบัติของเซสชัน. ทุกแผงบนหน้านี้อ่านข้อมูลเซสชันจากหน้าต่างเวลา 45 วันของ tape ชุดเดียวกัน ภายใต้กฎข้อเดียวคือ: เซสชันจะถูกนับเมื่อปริมาณการซื้อขายทั่วทั้งตลาดมีค่าถึง 75% ของค่ามัธยฐานของเซสชันเก่าๆ ในหน้าต่างเวลานั้น วันล่าสุดจะถูกยกเว้นจากการคำนวณค่ามัธยฐานที่ต้องผ่านเกณฑ์ เพื่อป้องกันไม่ให้ข้อมูลของวันที่ยังโหลดไม่เสร็จทำให้ค่ามัธยฐานลดต่ำลง ข้อมูล tape จะทยอยส่งมาถึง ข้อมูลวันที่มีปริมาณน้อยกว่าสามในสี่ของเซสชันปกติจะไม่แสดงบนหน้าจอจนกว่าข้อมูลจะครบถ้วน แต่ละแผงจะระบุเซสชันที่ข้อมูลลงตัว เพื่อให้สามารถเปรียบเทียบทั้งสี่แผงระหว่างกันได้
  5. การยกเว้น. กองทุน Leveraged และ Inverse จะถูกคัดออกตามชื่อ เนื่องจากชุดข้อมูลของผลิตภัณฑ์แบบ 3x จะเคลื่อนที่ตามตัวคูณและจะทำให้รายการหนาแน่นทุกสัปดาห์ นอกจากนี้มีการยกเว้นสัญลักษณ์ ticker ที่มีการใช้ซ้ำ เนื่องจากประวัติจากผู้ให้บริการมีการรวมสองบริษัทเข้าด้วยกันภายใต้สัญลักษณ์เดียว
  6. ไม่มี open interest. ในฐานข้อมูลไม่มีฟิลด์ open-interest ดังนั้นไม่มีข้อมูลใดในหน้านี้ที่เปรียบเทียบ volume กับสถานะคงค้าง (outstanding positions) ในขณะที่หน้าจอของคู่แข่งระบุว่า volume สูงกว่า open interest แต่ของเราจะระบุว่า volume สูงกว่าค่าเฉลี่ย 20 เซสชันของตัวมันเอง
  7. วันหมดอายุ. การหมดอายุรายเดือนจะส่งผลให้ปริมาณการซื้อขาย options ทั่วทั้งตลาดเพิ่มขึ้น แผงข้อมูลเซสชันจะระบุเงื่อนไขนี้ และข้อมูลที่สร้างขึ้นในเซสชันวันหมดอายุควรถูกนำไปเปรียบเทียบกับเซสชันวันหมดอายุอื่นๆ

การศึกษาผลต่อเนื่อง (follow-through study) ใช้ตารางที่สอง คือไฟล์ daily options greeks ซึ่งมีสัญลักษณ์สินทรัพย์อ้างอิงที่ชัดเจนและราคาปิดของสินทรัพย์อ้างอิง ข้อมูลนี้จะยกเว้นสัญญาที่มีวันหมดอายุภายในวันเดียวและ index options และมีการสรุปผลช้ากว่า minute tape เล็กน้อย ดังนั้นขอบเขตข้อมูลจึงแคบกว่าหน้าจอนี้ ชื่อหุ้นที่มีการแตกหุ้น (stock split) ภายในช่วงเวลาที่ศึกษาจะถูกคัดออก เนื่องจากสัดส่วนการแตกหุ้นทำให้เกิดการเคลื่อนไหวที่ผิดปกติอย่างมาก

FAQ

Unusual options activity คืออะไร?

คือการที่สินทรัพย์อ้างอิงมีการซื้อขายสัญญา options ในหนึ่งวันสูงกว่าค่าเฉลี่ยในช่วงที่ผ่านมาอย่างผิดปกติ เกณฑ์ที่ใช้ในหน้านี้เป็นเกณฑ์ทางคณิตศาสตร์ไม่ใช่เกณฑ์จากการคัดเลือกโดยบรรณาธิการ โดยคำนวณจากปริมาณสัญญาของวันนั้นหารด้วยค่าเฉลี่ยของสินทรัพย์อ้างอิงตัวเดียวกันในช่วง 20 วันก่อนหน้า โดยมีเงื่อนไขขั้นต่ำคือปริมาณสัญญาในวันนั้นต้องไม่น้อยกว่า 25,000 สัญญา และค่าเฉลี่ยต้องไม่น้อยกว่า 5,000 สัญญา

Unusual options activity สามารถทำนายการเคลื่อนไหวของหุ้นได้หรือไม่?

ทำนายได้เพียงเล็กน้อยและไม่สามารถระบุทิศทางได้ จากข้อมูลย้อนหลัง 200 วันของเรา พบว่าวันที่ปริมาณการซื้อขาย options สูงเป็นห้าเท่าของค่าเฉลี่ยเดิม มีค่ามัธยฐานของการเคลื่อนไหวสัมบูรณ์อยู่ที่ 2.52% เมื่อเทียบกับ 1.92% ในวันปกติ โดยค่ามัธยฐานของการเปลี่ยนแปลงทิศทางในวันถัดไปคือ -0.34% ดังนั้น ปริมาณการซื้อขายบอกได้เพียงว่าหุ้นจะเคลื่อนไหวไปไกลแค่ไหน แต่แทบไม่ได้บอกทิศทางเลย

ข้อมูลปริมาณการซื้อขาย options อัปเดตเมื่อใด?

ปริมาณสัญญาจะปรากฏบน consolidated options tape ในขณะที่ตลาดกำลังดำเนินการ ข้อมูลที่จัดเก็บไว้เบื้องหลังหน้านี้จะมีการหน่วงเวลาในการสรุปผล ดังนั้นกระดานจะรายงานข้อมูลของวันที่เสร็จสมบูรณ์ล่าสุดแทนที่จะเป็นข้อมูลที่กำลังดำเนินอยู่ พร้อมระบุวันที่ไว้ ข้อมูลทั้งหมดในที่นี้ไม่ใช่ข้อมูลแบบ real-time

ทำไมเครื่องมือสแกน unusual options activity นี้จึงไม่ใช้ open interest?

Open interest จะถูกเผยแพร่โดย clearinghouse หลังปิดตลาด และข้อมูลที่เรามีไม่มีฟิลด์สำหรับ open-interest การเปรียบเทียบปริมาณการซื้อขายในหนึ่งวันกับประวัติปริมาณการซื้อขายของสินทรัพย์อ้างอิงตัวเดียวกันสามารถวัดผลได้โดยตรงจาก tape ซึ่งเป็นการตอบคำถามในลักษณะเดียวกันว่า ตลาดของสินทรัพย์นี้มีความคึกคักกว่าปกติหรือไม่


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

#options#unusual options activity#options volume#market structure