上一交易日异常期权活动与看涨看跌期权分布
根据完整美国期权成交数据,查看哪些标的成交量远超自身20个交易日均值,以及看涨期权与看跌期权如何分布,快速识别值得关注的异动。
异常期权活动,是指某个标的在一个交易时段内的期权合约成交量,远高于其近期正常水平。本榜单针对最近一个已结束的期权交易时段进行排名,Oct 15:将期权合约总成交量与同一标的过去20个交易时段的平均成交量进行比较。期权成交数据的结算时间晚于股票成交数据,因此这里所称的交易时段,是我们数据中最新的完整交易时段,而不是今天。
在查看表格前,需要明确一点:这是一个成交量筛选工具。大多数已发布的异常期权活动提醒,会将当日成交量与未平仓量进行比较。未平仓量是指收盘后仍未平仓的合约数量。我们存储的期权成交数据记录的是交易,而不是持仓,且其中没有未平仓量字段。下方每个比率,都是将某个标的的成交量与其自身的历史成交量进行比较。期权成交量与未平仓量的区别介绍了这两项指标分别反映什么。
异常期权活动:上一交易日
| 股票代码 | 成交量比率 | 交易日成交量(千) | 基准成交量(千) | 前高成交量(千) | 交易日标签 | 交易日 ID | 基准交易日数 |
|---|---|---|---|---|---|---|---|
| URA | 9.6 | 105.5 | 11 | 45.5 | Oct 15 | 20261015 | 20 |
| ARKG | 9.2 | 147 | 15.9 | 50.2 | Oct 15 | 20261015 | 20 |
| KNX | 6.2 | 35.5 | 5.7 | 81.4 | Oct 15 | 20261015 | 20 |
| XLP | 5.4 | 159.2 | 29.7 | 174.5 | Oct 15 | 20261015 | 20 |
| GILD | 5.3 | 28.5 | 5.4 | 14 | Oct 15 | 20261015 | 20 |
| WULF | 4.5 | 816.5 | 182.2 | 505.3 | Oct 15 | 20261015 | 20 |
| XLV | 4.1 | 68.7 | 16.7 | 54.7 | Oct 15 | 20261015 | 20 |
| CRWV | 4 | 1347.7 | 339.9 | 1330.8 | Oct 15 | 20261015 | 20 |
| CCJ | 3.8 | 87.8 | 22.9 | 57.8 | Oct 15 | 20261015 | 20 |
| CORZ | 3.8 | 191.1 | 49.8 | 147.6 | Oct 15 | 20261015 | 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,页面才会发布。
URA 位居榜首,成交量达到自身平均水平的 9.6 倍:成交 105.5 千张合约,基准值为 11 千张,此前20个交易日高点为 45.5 千张。
- ARKG 达到 9.2 倍:成交 147 千张合约,基准值为 15.9 千张。
- KNX 达到 6.2 倍,成交 35.5 千张合约,基准值为 5.7 千张。
- XLP 达到 5.4 倍,成交 159.2 千张合约,此前20个交易日高点为 174.5 千张。
- GILD 达到 5.3 倍,成交 28.5 千张合约。
榜单最后一行的 CORZ 仍达到自身平均成交量的 3.8 倍。倍数和成交规模反映的是两个不同维度,因此榜单同时列出二者。股票市场中对应的指标见本周异常成交量股票;具体计算方法见相对成交量。
看涨期权还是看跌期权:成交方向
看涨期权与看跌期权的成交量占比,基本就是预警真正指向的内容。同一份榜单、同一交易时段,按看涨期权占比排序:
| 股票代码 | 看涨期权成交量(千) | 看跌期权成交量(千) | 看涨期权占比(%) | 交易日 ID |
|---|---|---|---|---|
| KNX | 35.2 | 0.3 | 99 | 20261015 |
| CORZ | 174.5 | 16.6 | 91 | 20261015 |
| GILD | 20.9 | 7.6 | 73 | 20261015 |
| CRWV | 768.2 | 579.5 | 57 | 20261015 |
| WULF | 436.9 | 379.6 | 54 | 20261015 |
| XLV | 34.4 | 34.3 | 50 | 20261015 |
| ARKG | 72.4 | 74.6 | 49 | 20261015 |
| URA | 31.1 | 74.5 | 29 | 20261015 |
| XLP | 29.5 | 129.7 | 19 | 20261015 |
| CCJ | 13.6 | 74.2 | 15 | 20261015 |
每个数字背后的完整 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在看涨期权占比较高的一端,KNX将99%的合约成交量集中在看涨期权上:看涨期权成交量为35.2千张,看跌期权成交量为0.3千张。在同一表格的另一端,CCJ的看涨期权成交量为15%,其中看涨期权为13.6千张,看跌期权为74.2千张。
这一占比值得关注,但也很容易被过度解读。每张已成交合约都有买方和卖方,而成交记录不会显示哪一方发起交易。看涨期权成交量较大,可能代表直接买入看涨期权的多头仓位,也可能代表卖方针对其已持有的股票卖出备兑看涨期权。买入和卖出看涨期权将介绍交易双方分别承担的风险与义务。成交活跃时,期权价格通常也会较高;相关内容请参阅隐含波动率最高的股票榜单。
本交易日合约的构成
| 距到期日分组 | 合约数(百万) | 成交量占比(%) | 交易日 ID |
|---|---|---|---|
| same day | 18.4 | 22.7 | 20261015 |
| 1 to 7 days | 26.87 | 33.1 | 20261015 |
| 8 to 30 days | 12.67 | 15.6 | 20261015 |
| 31 to 90 days | 12.67 | 15.6 | 20261015 |
| 91 to 365 days | 8.07 | 10 | 20261015 |
| over a year | 2.4 | 3 | 20261015 |
每个数字背后的完整 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当日到期合约占整个交易日的 22.7%,共计 18.4 百万张。另有 33.1% 的合约在一周内到期。期限最远的一端,剩余期限超过一年的合约占 3%。
这一构成会影响异常活动标题的解读。此类榜单背后的大部分成交量都来自短期限合约,而当日到期合约会在收盘铃响前结算,不会被持有至下一交易日。0DTE期权涵盖的就是期权链中这一端。
这是否为到期日交易时段?
月度到期日当天,整个市场的期权成交量都会上升,因为规模最大的上市合约批次会同时到期。一份在到期日运行的比率筛选结果会标记市场中的一半交易时段,因此下方面板会标出该窗口内的每个交易时段。
| 交易日 | 合约数(百万) | 交易日类型 | 月度到期日(m) | 交易日 ID |
|---|---|---|---|---|
| Sep 11 | 68.3 | ordinary | 76.1 | 20260911 |
| Sep 14 | 67.5 | ordinary | 76.1 | 20260914 |
| Sep 15 | 56.6 | ordinary | 76.1 | 20260915 |
| Sep 16 | 65.4 | ordinary | 76.1 | 20260916 |
| Sep 17 | 68.2 | ordinary | 76.1 | 20260917 |
| Sep 18 | 76.1 | monthly expiration | 76.1 | 20260918 |
| Sep 21 | 80.3 | ordinary | 76.1 | 20260921 |
| Sep 22 | 63.6 | ordinary | 76.1 | 20260922 |
| Sep 23 | 69 | ordinary | 76.1 | 20260923 |
| Sep 24 | 67.3 | ordinary | 76.1 | 20260924 |
| Sep 25 | 72.6 | ordinary | 76.1 | 20260925 |
| Sep 28 | 66.6 | ordinary | 76.1 | 20260928 |
| Sep 29 | 58.6 | ordinary | 76.1 | 20260929 |
| Sep 30 | 61.8 | ordinary | 76.1 | 20260930 |
| Oct 1 | 69.9 | ordinary | 76.1 | 20261001 |
| Oct 2 | 78.7 | ordinary | 76.1 | 20261002 |
| Oct 5 | 69.4 | ordinary | 76.1 | 20261005 |
| Oct 6 | 63.1 | ordinary | 76.1 | 20261006 |
| Oct 7 | 63 | ordinary | 76.1 | 20261007 |
| Oct 8 | 74.8 | ordinary | 76.1 | 20261008 |
每个数字背后的完整 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。当天全美市场成交了 81.1百万张合约。同一窗口内最近一次月度到期日成交了 76.1百万张合约。面板中每个比率所依据的20个交易时段基准通常恰好包含一个月度到期日,因此分母在各交易时段中都包含同一笔集中影响。到期日还引出一个成交量筛选无法回答的行权价问题:最大痛点计算的是合约结算时让期权持有人获得金额最少的行权价;其计算依据是未平仓合约量,而不是本文衡量的成交量。
异常期权活动会引领股价吗?
值得回答的问题是:期权交易活跃的交易日之后,标的资产是否会出现较大波动。统计区间为过去200个交易日:选取每个股票-交易日中达到相同成交量门槛的样本,按其成交量相对于自身基准的倍数分组,再与标的股票下一交易日收盘价的绝对变动进行匹配。表中的“典型值”是每只股票在该区间内每日变动的自身中位数,因此每个分组都与同一只股票自身进行比较。
| 相对成交量区间 | 事件数 | 后续变动中位数(%) | 典型变动中位数(%) | 差距(百分点) | 后续带符号变动中位数(%) |
|---|---|---|---|---|---|
| 5x or more | 606 | 2.47 | 1.9 | 0.57 | -0.12 |
| 3x to 5x | 1166 | 2.28 | 1.94 | 0.34 | -0.19 |
| 2x to 3x | 1839 | 2.07 | 1.95 | 0.11 | -0.24 |
| 1x to 2x | 8350 | 1.87 | 2.01 | -0.14 | -0.1 |
| below 1x | 11375 | 1.82 | 2 | -0.18 | -0.06 |
每个数字背后的完整 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.47%;同一批股票在普通交易日的对应数值为1.9%,两者相差0.57个百分点。在表格较为平静的一端,两列数值分别为1.82%和2%,相差-0.18个百分点。
坦率地说,影响幅度很小,而且体现的是波动幅度,而非方向。期权交易更活跃的交易日之后,股价绝对变动略大,但中位数差异只有零点几个百分点。五倍成交量交易日后的中位数涨跌幅为-0.12%,低于自身基准的交易日之后为-0.06%。这两者都不像醒目标题所暗示的那样构成显著行情。还应考虑这类情况的稀少程度:在研究区间内,有606个股票-交易日的期权成交量达到自身基准的五倍,而低于自身基准的有11375个。
该筛选器的衡量方法
如果筛选器隐藏规则,表面上是数据,实质上就是观点。因此,本文列出全部规则。
- 数据来源。完整的美国期权分钟级成交数据。系统从每份合约的 OCC 代码中解析标的,因此指数期权代码和当日到期合约,都会与普通股票及基金期权链一并纳入。
- 比率。上一交易日已完成交易时段的合约总成交量,除以同一标的在此前 20 个符合条件交易时段的平均成交量。其中至少 18 个时段必须有成交量。榜单会在单独一列显示窗口长度。如果有效时段不足 20 个,页面会暂缓发布,而不会在标注为 20 个交易时段的情况下使用更短窗口计算平均值。
- 最低门槛。当日成交量至少为 25,000 张合约,基准平均成交量至少为 5,000 张合约。没有这些门槛,榜单会被某条订单就达到 10 倍读数的期权链占满。
- 交易时段资格。本页每个面板都从同一份成交数据的一个 45 天窗口中读取交易时段,并采用同一条规则:当某交易日的全市场成交量达到该窗口内较早交易日中位数的 75% 时,该交易日才计入。计算中位数时会排除最新交易日,因此部分数据尚未加载完整的交易日,不能通过压低自身的基准来满足门槛。成交数据会分批抵达窗口前端;成交量不足正常交易时段四分之三的交易日,会在数据补齐前暂不列入榜单。每个面板都会标出其采用的交易日,因此四个面板可以相互对照。
- 排除项。按名称剔除杠杆型和反向型基金:三倍产品的期权链会随其杠杆倍数波动,每周都会挤占榜单。另有一个重复使用的 ticker symbol 也被排除,因为供应商的历史数据将两家公司拼接在了同一代码下。
- 不使用未平仓合约。数据仓库没有未平仓合约字段,因此本页没有任何内容会将成交量与未平仓头寸进行比较。竞争对手的筛选器可能显示成交量超过未平仓量;本筛选器显示的是成交量超过自身 20 个交易时段的平均值。
- 到期日。月度到期会推高全市场期权成交量。交易时段面板会标注这一情况;如果榜单基于到期日交易时段,应与其他到期日交易时段进行比较。
后续表现研究使用第二张表,即每日期权 Greeks 数据文件。该文件包含规范的标的代码和标的收盘价。它排除当日到期合约和指数期权,并且结算时间比分钟级成交数据晚几个交易日,因此其覆盖范围小于榜单。研究窗口内发生股票拆分的标的也会被排除,因为拆分会制造虚假的巨大涨跌。
常见问题
什么是异常期权活动?
指某个标的在一个交易日内交易的期权合约数量,远高于其近期自身平均水平。本页面采用算术阈值,而非编辑判断:用该交易日的合约成交量除以同一标的前20个交易日的平均成交量,同时设定交易日成交量至少为25,000张,基准均值至少为5,000张。
异常期权活动能预测股票走势吗?
预测能力较弱,也无法判断方向。在我们过去200天的数据中,期权成交量达到某标的自身基准的五倍后,下一交易日的绝对涨跌幅中位数为2.47%;相比之下,同一批股票在普通交易日后的中位数为1.9%。下一交易日的涨跌幅中位数为-0.12%,这意味着成交量对股价波动幅度有一定信息,但几乎无法说明涨跌方向。
期权成交量数据何时更新?
交易时段内,合约成交量会通过统一期权行情系统实时显示。支撑本页面的已存储行情数据存在延迟,因此看板显示的是最新完整交易日的数据,而不是进行中的交易日数据,并会标注日期。本页面不提供实时行情。
为什么这个异常期权活动扫描器不使用未平仓合约数?
结算机构会在收盘后公布未平仓合约数,而我们持有的数据中没有未平仓合约数字段。将某交易日的成交量与同一标的自身的历史成交量进行比较,可以直接从行情数据中测算,也能回答类似问题:该期权链的交易是否比平时更活跃。
以上每个数字均来自已存储且带版本记录的查询。您可以打开任意面板下方的 SQL,审核相关测算;也可以在 Strasmore terminal 上按任意时间窗口运行相同筛选。