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