上一交易日异常期权活动与看涨看跌期权分布
根据完整美国期权成交数据,查看哪些标的成交量远超自身20个交易日均值,以及看涨期权与看跌期权如何分布,快速识别值得关注的异动。
异常期权活动,是指某个标的在一个交易时段内的期权合约成交量,远高于其近期正常水平。本榜单针对最近一个已结束的期权交易时段进行排名,Sep 3:将期权合约总成交量与同一标的过去20个交易时段的平均成交量进行比较。期权成交数据的结算时间晚于股票成交数据,因此这里所称的交易时段,是我们数据中最新的完整交易时段,而不是今天。
在查看表格前,需要明确一点:这是一个成交量筛选工具。大多数已发布的异常期权活动提醒,会将当日成交量与未平仓量进行比较。未平仓量是指收盘后仍未平仓的合约数量。我们存储的期权成交数据记录的是交易,而不是持仓,且其中没有未平仓量字段。下方每个比率,都是将某个标的的成交量与其自身的历史成交量进行比较。期权成交量与未平仓量的区别介绍了这两项指标分别反映什么。
异常期权活动:上一交易日
| 股票代码 | 成交量比率 | 交易日成交量(千) | 基准成交量(千) | 前高成交量(千) | 交易日标签 | 交易日 ID | 基准交易日数 |
|---|---|---|---|---|---|---|---|
| DPRO | 27.9 | 204.9 | 7.4 | 96.4 | Sep 3 | 20260903 | 20 |
| IOT | 9.1 | 45.9 | 5 | 16.6 | Sep 3 | 20260903 | 20 |
| ZS | 7.5 | 123.7 | 16.5 | 29.6 | Sep 3 | 20260903 | 20 |
| DOCU | 7 | 59 | 8.4 | 21.2 | Sep 3 | 20260903 | 20 |
| SNOW | 7 | 274.5 | 39 | 184.7 | Sep 3 | 20260903 | 20 |
| VFC | 6.3 | 48.9 | 7.8 | 16.2 | Sep 3 | 20260903 | 20 |
| CPB | 5.9 | 47.2 | 8 | 48.7 | Sep 3 | 20260903 | 20 |
| LULU | 5.4 | 153.1 | 28.3 | 47 | Sep 3 | 20260903 | 20 |
| PL | 5.1 | 92.8 | 18.2 | 35.9 | Sep 3 | 20260903 | 20 |
| HPE | 4.6 | 254.4 | 55.2 | 213.3 | Sep 3 | 20260903 | 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三列数据构成这份榜单。倍数表示标的成交量高于自身正常水平的幅度。基准值表示正常水平;在低流动性期权链上出现的大倍数,其事件规模可能小于活跃期权链上的较小倍数。20个交易日高点则表示本交易日是否超过上个月的任何一个交易日。最后三列是审计记录:榜单所依据的交易日,分别以标签和普通数字显示;以及基准值所基于的有效交易日数量。该数量必须达到20,页面才会发布。
DPRO 位居榜首,成交量达到自身平均水平的 27.9 倍:成交 204.9 千张合约,基准值为 7.4 千张,此前20个交易日高点为 96.4 千张。
- IOT 达到 9.1 倍:成交 45.9 千张合约,基准值为 5 千张。
- ZS 达到 7.5 倍,成交 123.7 千张合约,基准值为 16.5 千张。
- DOCU 达到 7 倍,成交 59 千张合约,此前20个交易日高点为 21.2 千张。
- SNOW 达到 7 倍,成交 274.5 千张合约。
榜单最后一行的 HPE 仍达到自身平均成交量的 4.6 倍。倍数和成交规模反映的是两个不同维度,因此榜单同时列出二者。股票市场中对应的指标见本周异常成交量股票;具体计算方法见相对成交量。
看涨期权还是看跌期权:成交方向
看涨期权与看跌期权的成交量占比,基本就是预警真正指向的内容。同一份榜单、同一交易时段,按看涨期权占比排序:
| 股票代码 | 看涨期权成交量(千) | 看跌期权成交量(千) | 看涨期权占比(%) | 交易日 ID |
|---|---|---|---|---|
| DPRO | 201.1 | 3.8 | 98 | 20260903 |
| IOT | 36 | 9.9 | 78 | 20260903 |
| HPE | 182.3 | 72.1 | 72 | 20260903 |
| PL | 57.3 | 35.5 | 62 | 20260903 |
| SNOW | 163.6 | 110.9 | 60 | 20260903 |
| ZS | 73.7 | 49.9 | 60 | 20260903 |
| CPB | 25.8 | 21.4 | 55 | 20260903 |
| DOCU | 31 | 28 | 53 | 20260903 |
| LULU | 72.7 | 80.4 | 47 | 20260903 |
| VFC | 5.5 | 43.4 | 11 | 20260903 |
每个数字背后的完整 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在看涨期权占比较高的一端,DPRO将98%的合约成交量集中在看涨期权上:看涨期权成交量为201.1千张,看跌期权成交量为3.8千张。在同一表格的另一端,VFC的看涨期权成交量为11%,其中看涨期权为5.5千张,看跌期权为43.4千张。
这一占比值得关注,但也很容易被过度解读。每张已成交合约都有买方和卖方,而成交记录不会显示哪一方发起交易。看涨期权成交量较大,可能代表直接买入看涨期权的多头仓位,也可能代表卖方针对其已持有的股票卖出备兑看涨期权。买入和卖出看涨期权将介绍交易双方分别承担的风险与义务。成交活跃时,期权价格通常也会较高;相关内容请参阅隐含波动率最高的股票榜单。
本交易日合约的构成
| 距到期日分组 | 合约数(百万) | 成交量占比(%) | 交易日 ID |
|---|---|---|---|
| same day | 18 | 25 | 20260903 |
| 1 to 7 days | 22.59 | 31.4 | 20260903 |
| 8 to 30 days | 17.1 | 23.7 | 20260903 |
| 31 to 90 days | 7.52 | 10.4 | 20260903 |
| 91 to 365 days | 5.51 | 7.7 | 20260903 |
| over a year | 1.29 | 1.8 | 20260903 |
每个数字背后的完整 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当日到期合约占整个交易日的 25%,共计 18 百万张。另有 31.4% 的合约在一周内到期。期限最远的一端,剩余期限超过一年的合约占 1.8%。
这一构成会影响异常活动标题的解读。此类榜单背后的大部分成交量都来自短期限合约,而当日到期合约会在收盘铃响前结算,不会被持有至下一交易日。0DTE期权涵盖的就是期权链中这一端。
这是否为到期日交易时段?
月度到期日当天,整个市场的期权成交量都会上升,因为规模最大的上市合约批次会同时到期。一份在到期日运行的比率筛选结果会标记市场中的一半交易时段,因此下方面板会标出该窗口内的每个交易时段。
| 交易日 | 合约数(百万) | 交易日类型 | 月度到期日(m) | 交易日 ID |
|---|---|---|---|---|
| Jul 31 | 75.5 | ordinary | 75.1 | 20260731 |
| Aug 3 | 72.7 | ordinary | 75.1 | 20260803 |
| Aug 4 | 78.9 | ordinary | 75.1 | 20260804 |
| Aug 5 | 69.5 | ordinary | 75.1 | 20260805 |
| Aug 6 | 63.2 | ordinary | 75.1 | 20260806 |
| Aug 7 | 73.2 | ordinary | 75.1 | 20260807 |
| Aug 10 | 61.4 | ordinary | 75.1 | 20260810 |
| Aug 11 | 54.6 | ordinary | 75.1 | 20260811 |
| Aug 12 | 55.4 | ordinary | 75.1 | 20260812 |
| Aug 13 | 66.6 | ordinary | 75.1 | 20260813 |
| Aug 14 | 66 | ordinary | 75.1 | 20260814 |
| Aug 17 | 60.9 | ordinary | 75.1 | 20260817 |
| Aug 18 | 56.9 | ordinary | 75.1 | 20260818 |
| Aug 19 | 67.2 | ordinary | 75.1 | 20260819 |
| Aug 20 | 64.9 | ordinary | 75.1 | 20260820 |
| Aug 21 | 75.1 | monthly expiration | 75.1 | 20260821 |
| Aug 24 | 61 | ordinary | 75.1 | 20260824 |
| Aug 25 | 52.8 | ordinary | 75.1 | 20260825 |
| Aug 26 | 49.4 | ordinary | 75.1 | 20260826 |
| Aug 27 | 66.1 | ordinary | 75.1 | 20260827 |
每个数字背后的完整 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。当天全美市场成交了 72百万张合约。同一窗口内最近一次月度到期日成交了 75.1百万张合约。面板中每个比率所依据的20个交易时段基准通常恰好包含一个月度到期日,因此分母在各交易时段中都包含同一笔集中影响。到期日还引出一个成交量筛选无法回答的行权价问题:最大痛点计算的是合约结算时让期权持有人获得金额最少的行权价;其计算依据是未平仓合约量,而不是本文衡量的成交量。
异常期权活动会引领股价吗?
值得回答的问题是:期权交易活跃的交易日之后,标的资产是否会出现较大波动。统计区间为过去200个交易日:选取每个股票-交易日中达到相同成交量门槛的样本,按其成交量相对于自身基准的倍数分组,再与标的股票下一交易日收盘价的绝对变动进行匹配。表中的“典型值”是每只股票在该区间内每日变动的自身中位数,因此每个分组都与同一只股票自身进行比较。
| 相对成交量区间 | 事件数 | 后续变动中位数(%) | 典型变动中位数(%) | 差距(百分点) | 后续带符号变动中位数(%) |
|---|---|---|---|---|---|
| 5x or more | 624 | 2.51 | 1.96 | 0.55 | -0.16 |
| 3x to 5x | 1212 | 2.35 | 2.15 | 0.2 | -0.21 |
| 2x to 3x | 1852 | 2.28 | 2.21 | 0.07 | -0.22 |
| 1x to 2x | 8380 | 1.98 | 2.23 | -0.25 | -0.05 |
| below 1x | 11559 | 1.89 | 2.06 | -0.17 | -0.01 |
每个数字背后的完整 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在期权成交量达到自身基准五倍或以上的交易日之后,下一交易日绝对变动的中位数为2.51%;同一批股票在普通交易日的对应数值为1.96%,两者相差0.55个百分点。在表格较为平静的一端,两列数值分别为1.89%和2.06%,相差-0.17个百分点。
坦率地说,影响幅度很小,而且体现的是波动幅度,而非方向。期权交易更活跃的交易日之后,股价绝对变动略大,但中位数差异只有零点几个百分点。五倍成交量交易日后的中位数涨跌幅为-0.16%,低于自身基准的交易日之后为-0.01%。这两者都不像醒目标题所暗示的那样构成显著行情。还应考虑这类情况的稀少程度:在研究区间内,有624个股票-交易日的期权成交量达到自身基准的五倍,而低于自身基准的有11559个。
该筛选器的衡量方法
如果筛选器隐藏规则,表面上是数据,实质上就是观点。因此,本文列出全部规则。
- 数据来源。完整的美国期权分钟级成交数据。系统从每份合约的 OCC 代码中解析标的,因此指数期权代码和当日到期合约,都会与普通股票及基金期权链一并纳入。
- 比率。上一交易日已完成交易时段的合约总成交量,除以同一标的在此前 20 个符合条件交易时段的平均成交量。其中至少 18 个时段必须有成交量。榜单会在单独一列显示窗口长度。如果有效时段不足 20 个,页面会暂缓发布,而不会在标注为 20 个交易时段的情况下使用更短窗口计算平均值。
- 最低门槛。当日成交量至少为 25,000 张合约,基准平均成交量至少为 5,000 张合约。没有这些门槛,榜单会被某条订单就达到 10 倍读数的期权链占满。
- 交易时段资格。本页每个面板都从同一份成交数据的一个 45 天窗口中读取交易时段,并采用同一条规则:当某交易日的全市场成交量达到该窗口内较早交易日中位数的 75% 时,该交易日才计入。计算中位数时会排除最新交易日,因此部分数据尚未加载完整的交易日,不能通过压低自身的基准来满足门槛。成交数据会分批抵达窗口前端;成交量不足正常交易时段四分之三的交易日,会在数据补齐前暂不列入榜单。每个面板都会标出其采用的交易日,因此四个面板可以相互对照。
- 排除项。按名称剔除杠杆型和反向型基金:三倍产品的期权链会随其杠杆倍数波动,每周都会挤占榜单。另有一个重复使用的 ticker symbol 也被排除,因为供应商的历史数据将两家公司拼接在了同一代码下。
- 不使用未平仓合约。数据仓库没有未平仓合约字段,因此本页没有任何内容会将成交量与未平仓头寸进行比较。竞争对手的筛选器可能显示成交量超过未平仓量;本筛选器显示的是成交量超过自身 20 个交易时段的平均值。
- 到期日。月度到期会推高全市场期权成交量。交易时段面板会标注这一情况;如果榜单基于到期日交易时段,应与其他到期日交易时段进行比较。
后续表现研究使用第二张表,即每日期权 Greeks 数据文件。该文件包含规范的标的代码和标的收盘价。它排除当日到期合约和指数期权,并且结算时间比分钟级成交数据晚几个交易日,因此其覆盖范围小于榜单。研究窗口内发生股票拆分的标的也会被排除,因为拆分会制造虚假的巨大涨跌。
常见问题
什么是异常期权活动?
指某个标的在一个交易日内交易的期权合约数量,远高于其近期自身平均水平。本页面采用算术阈值,而非编辑判断:用该交易日的合约成交量除以同一标的前20个交易日的平均成交量,同时设定交易日成交量至少为25,000张,基准均值至少为5,000张。
异常期权活动能预测股票走势吗?
预测能力较弱,也无法判断方向。在我们过去200天的数据中,期权成交量达到某标的自身基准的五倍后,下一交易日的绝对涨跌幅中位数为2.51%;相比之下,同一批股票在普通交易日后的中位数为1.96%。下一交易日的涨跌幅中位数为-0.16%,这意味着成交量对股价波动幅度有一定信息,但几乎无法说明涨跌方向。
期权成交量数据何时更新?
交易时段内,合约成交量会通过统一期权行情系统实时显示。支撑本页面的已存储行情数据存在延迟,因此看板显示的是最新完整交易日的数据,而不是进行中的交易日数据,并会标注日期。本页面不提供实时行情。
为什么这个异常期权活动扫描器不使用未平仓合约数?
结算机构会在收盘后公布未平仓合约数,而我们持有的数据中没有未平仓合约数字段。将某交易日的成交量与同一标的自身的历史成交量进行比较,可以直接从行情数据中测算,也能回答类似问题:该期权链的交易是否比平时更活跃。
以上每个数字均来自已存储且带版本记录的查询。您可以打开任意面板下方的 SQL,审核相关测算;也可以在 Strasmore terminal 上按任意时间窗口运行相同筛选。