投资组合 Delta 与贝塔加权详解
原始期权 Delta 无法跨 ticker 直接相加。本文通过一个小型组合演示贝塔加权,说明如何将组合 Delta 换算为等效 SPY 股数。
投资组合 Delta 是一个能够回答单一问题的数字:如果大盘波动 1%,整个组合大致会变动多少?把每个头寸的 Delta 相加可以得到一个数字,但未必是这个数字。Beta 加权是一种调整方法,可使相加结果具有实际意义:将每项持仓重新表示为相当于持有多少股 SPY。
为什么跨不同 ticker 的投资组合 Delta 无法直接相加
Delta 衡量标的价格变动一美元时,头寸价值的变化幅度。一股股票的 Delta 为 1。一个期权合约对应 100 股,因此,Delta 显示为 0.30 的看涨期权,代表 30 点 Delta 敞口。这个单一头寸视角,正是期权 Delta 衡量的内容。
问题出现在第二个 ticker 上。一只高价、高 Beta 股票的 100 点 Delta,与一只低价防御型股票的 100 点 Delta,数量相同,但敞口相差甚远。前者代表数万美元的股票敞口,其历史波动幅度高于指数。后者仅代表几千美元的股票敞口,其历史波动幅度低于指数。将两者相加得到 200,但这个数字没有可供投资者据此采取行动的实际单位。
什么是贝塔加权Delta?
贝塔加权会将持仓中的每个Delta都换算为相对于某一选定基准的Delta。对于美国股票持仓,通常使用SPY作为基准。整个换算由两个乘数完成。
第一个乘数是贝塔系数。它衡量股票对基准的历史敏感度,具体是指在选定时间窗口内,以指数每日收益率为自变量、股票每日收益率为因变量进行回归时的斜率。贝塔为1.4,意味着在该时间窗口内,指数每变动1%,该股票平均变动约1.4%。
第二个乘数是价格比,即股票价格除以基准价格。Delta按股数计算,而不同价格的股票对应的资金金额不同。价格比可将它们换算到同一尺度。
将一个持仓的原始Delta同时乘以这两个乘数,结果就是其贝塔加权Delta:在测量窗口内,表现会与该持仓相同的SPY股数。下表根据截至2026年6月30日的一年期每日收盘收益率,计算各标的的贝塔,并列出其相对SPY的价格比以及两者的乘积。SPY作为锚定标的列在表中,贝塔为1,价格比为1,因此一股SPY正好对应一个贝塔加权Delta。
每个数字背后的完整 SQL
WITH
sessions AS
(
SELECT
ticker AS ticker,
toDate(toTimeZone(window_start, 'America/New_York')) AS d,
toFloat64(argMax(close, window_start)) AS px
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('SPY', 'NVDA', 'AAPL', 'MSFT', 'XOM', 'JNJ', 'KO')
AND window_start >= toDateTime('2025-07-01 04:00:00')
AND window_start < toDateTime('2026-07-01 04:00:00')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) >= 570
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) < 960
GROUP BY ticker, d
),
steps AS
(
SELECT
ticker,
d,
px,
any(px) OVER (PARTITION BY ticker ORDER BY d ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) AS prev_px
FROM sessions
),
daily_ret AS
(
SELECT ticker, d, (px / prev_px) - 1 AS r
FROM steps
WHERE prev_px > 0
),
bench AS
(
SELECT d, r AS spy_r
FROM daily_ret
WHERE ticker = 'SPY'
),
betas AS
(
SELECT
s.ticker AS ticker,
covarPop(s.r, b.spy_r) / varPop(b.spy_r) AS beta_vs_spy,
1 AS k
FROM daily_ret AS s
INNER JOIN bench AS b ON b.d = s.d
GROUP BY s.ticker
),
prices AS
(
SELECT ticker, argMax(px, d) AS close_px
FROM sessions
GROUP BY ticker
),
spy_price AS
(
SELECT argMax(px, d) AS spy_close, 1 AS k
FROM sessions
WHERE ticker = 'SPY'
)
SELECT
betas.ticker AS ticker,
round(betas.beta_vs_spy, 2) AS beta_vs_spy,
round(prices.close_px / spy_price.spy_close, 3) AS price_vs_spy,
round(betas.beta_vs_spy * prices.close_px / spy_price.spy_close, 3) AS spy_shares_per_share
FROM betas
INNER JOIN prices ON prices.ticker = betas.ticker
INNER JOIN spy_price ON spy_price.k = betas.k
ORDER BY beta_vs_spy DESCNVDA的贝塔最高,为1.86,其交易价格为SPY的0.268倍。将两者相乘后,该标的一股对应0.498股SPY的指数敞口。列表末端的7个标的贝塔低于零。在这一时间窗口内,XOM的贝塔为-0.36,相对指数呈现温和的反向斜率,而不是波动较小的同向走势;一股该标的可换算为-0.067股SPY。两种情况下,账面上都是一个Delta,但该Delta所承担的敞口差异很大。这也初步说明,显示到小数点后两位的贝塔只是带有时间窗口条件的估计值。本文末尾将进一步讨论这一点。
期权Delta的来源
股票每股的Delta固定为1。期权的Delta并非固定不变,会随行权价、剩余到期时间、标的价格和隐含波动率变化。下方图表显示了2026年6月30日交易的所有AAPL合约中,剩余到期时间为20至45天的合约Delta,并按行权价与收盘价的距离分为每档2%的区间。
每个数字背后的完整 SQL
SELECT
concat(if(bucket_pct > 0, '+', ''), toString(bucket_pct), '%') AS strike_vs_spot,
round(avgIf(contract_delta, contract_delta > 0), 3) AS call_delta,
round(avgIf(contract_delta, contract_delta < 0), 3) AS put_delta,
count() AS contract_count
FROM
(
SELECT
toInt32(round((toFloat64(strike_price) / toFloat64(underlying_close) - 1) * 50)) * 2 AS bucket_pct,
toFloat64(delta) AS contract_delta
FROM global_markets.options_greeks
WHERE underlying_symbol = 'AAPL'
AND date >= toDate('2026-06-30')
AND date < toDate('2026-07-01')
AND iv_converged = 1
AND volume > 0
AND days_to_expiry BETWEEN 20 AND 45
AND abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) <= 0.12
)
GROUP BY bucket_pct
HAVING countIf(contract_delta > 0) > 0 AND countIf(contract_delta < 0) > 0
ORDER BY bucket_pct在-12%区间内,看涨期权在4份成交合约中的平均Delta为0.924,看跌期权的平均Delta为-0.084。在+10%区间内,看涨期权的平均Delta为0.106,看跌期权为-0.834。相同行权价的看涨期权和看跌期权,其Delta符号相反。因此,卖出看涨期权和买入看跌期权都能抵消多头股票头寸的部分风险。随着到期日临近,整条曲线如何移动,详见期权希腊值如何随时间变化。
将一小组合并为一个数字
假设有一个由三个头寸组成、按手工设定规模的组合:做多300股 AAPL;做空3张 AAPL 看涨期权,执行价约高于现价5%,距到期约一个月,这是标准的备兑看涨期权策略;做多5张接近平值、到期时间相近的 KO 看跌期权,作为对第二只股票的对冲。股票和合约数量均为假设值。面板中的每个 delta 和 beta 均为测算结果。
每个数字背后的完整 SQL
WITH
sessions AS
(
SELECT
ticker AS ticker,
toDate(toTimeZone(window_start, 'America/New_York')) AS d,
toFloat64(argMax(close, window_start)) AS px
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('SPY', 'AAPL', 'KO')
AND window_start >= toDateTime('2025-07-01 04:00:00')
AND window_start < toDateTime('2026-07-01 04:00:00')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) >= 570
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) < 960
GROUP BY ticker, d
),
steps AS
(
SELECT
ticker,
d,
px,
any(px) OVER (PARTITION BY ticker ORDER BY d ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) AS prev_px
FROM sessions
),
daily_ret AS
(
SELECT ticker, d, (px / prev_px) - 1 AS r
FROM steps
WHERE prev_px > 0
),
bench AS
(
SELECT d, r AS spy_r
FROM daily_ret
WHERE ticker = 'SPY'
),
betas AS
(
SELECT
s.ticker AS ticker,
covarPop(s.r, b.spy_r) / varPop(b.spy_r) AS beta_vs_spy
FROM daily_ret AS s
INNER JOIN bench AS b ON b.d = s.d
GROUP BY s.ticker
),
prices AS
(
SELECT ticker, argMax(px, d) AS close_px, 1 AS k
FROM sessions
GROUP BY ticker
),
spy_price AS
(
SELECT argMax(px, d) AS spy_close, 1 AS k
FROM sessions
WHERE ticker = 'SPY'
),
opt_delta AS
(
SELECT
underlying_symbol AS ticker,
if(toFloat64(delta) > 0, 'call', 'put') AS kind,
avg(toFloat64(delta)) AS per_share_delta
FROM global_markets.options_greeks
WHERE date >= toDate('2026-06-30')
AND date < toDate('2026-07-01')
AND iv_converged = 1
AND volume > 0
AND days_to_expiry BETWEEN 25 AND 40
AND (
(underlying_symbol = 'AAPL' AND toFloat64(delta) > 0
AND toFloat64(strike_price) / toFloat64(underlying_close) BETWEEN 1.03 AND 1.07)
OR (underlying_symbol = 'KO' AND toFloat64(delta) < 0
AND toFloat64(strike_price) / toFloat64(underlying_close) BETWEEN 0.97 AND 1.03)
)
GROUP BY ticker, kind
),
legs AS
(
SELECT
tupleElement(leg, 1) AS leg_no,
tupleElement(leg, 2) AS position,
tupleElement(leg, 3) AS ticker,
tupleElement(leg, 4) AS kind,
tupleElement(leg, 5) AS qty,
tupleElement(leg, 6) AS multiplier
FROM
(
SELECT arrayJoin([
(1, 'Long 300 AAPL', 'AAPL', 'stock', 300., 1.),
(2, 'Short 3 AAPL calls', 'AAPL', 'call', -3., 100.),
(3, 'Long 5 KO puts', 'KO', 'put', 5., 100.)
]) AS leg
)
)
SELECT
position AS position,
round(raw_share_delta) AS raw_share_delta,
round(beta_vs_spy, 2) AS beta_vs_spy,
round(bw_delta) AS beta_weighted_delta,
round(sum(bw_delta) OVER (ORDER BY leg_no ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)) AS running_book_delta,
round(sum(bw_delta) OVER (ORDER BY leg_no ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) * spy_close / 100.) AS dollars_per_1pct_spy
FROM
(
SELECT
l.leg_no AS leg_no,
l.position AS position,
l.qty * l.multiplier * if(l.kind = 'stock', 1., o.per_share_delta) AS raw_share_delta,
bt.beta_vs_spy AS beta_vs_spy,
sp.spy_close AS spy_close,
raw_share_delta * bt.beta_vs_spy * pr.close_px / sp.spy_close AS bw_delta
FROM legs AS l
LEFT JOIN opt_delta AS o ON o.ticker = l.ticker AND o.kind = l.kind
INNER JOIN betas AS bt ON bt.ticker = l.ticker
INNER JOIN prices AS pr ON pr.ticker = l.ticker
INNER JOIN spy_price AS sp ON sp.k = pr.k
)
ORDER BY leg_no股票头寸带来 300 个原始 delta,即每股一个。做空看涨期权带来 -98 个,做多看跌期权带来 -217 个。将这三项相加,可得到一个数字。按 beta 加权后,结果则不同。
在该时间窗口内,AAPL 的 beta 为 0.88,KO 为 -0.27;后者表示其在这十二个月内相对指数呈负斜率。根据每个头寸的 beta,以及其相对于 SPY 的价格,对各头寸进行缩放后,股票头寸相当于 103 股 SPY,做空看涨期权相当于 -34 股,做空看跌期权相当于 6 股。看跌期权头寸尤其值得注意。其 -217 个原始 delta 代表 KO 空头敞口;空头敞口乘以负 beta 后,在账面上转为 6 股 SPY 的正敞口,即小幅做多指数。撇开方向不谈,关键在于规模:从原始 delta 看似可观的对冲,换算成指数敞口后只相当于其中很小一部分,而且它对冲的是 KO,而不是整个市场。累计总计栏按顺序列出各个头寸,最终该组合的 beta 加权 delta 为 76。
这种规模的贝塔加权Delta实际意味着什么
在测量窗口内,贝塔加权Delta为76的组合,其表现如同持有同等数量的SPY股票。正数表示组合做多指数。负数表示组合做空指数,这就是交易员所说的将Delta向空头方向倾斜。最后一列将累计数值换算成金额。在其他条件不变的情况下,SPY上涨1%,组合价值将变动565美元。
要将该数值归零,就要加入大小相等、方向相反的抵消性贝塔加权Delta。做空SPY股票可以一比一地实现这一点:按定义,1股SPY对应1个贝塔加权Delta。SPY期权则按比例实现,具体取决于所选合约的Delta。减少标的股票持仓,则按第一部分所示该股票自身的换算比例实现。每种方式都有各自的成本和Greeks。
Beta加权失效的情况
Beta是通过回归估算得出的,测算区间不同,结果也会不同。下方表格在六个回溯区间内重新计算了同一组两个Beta,所有区间均截至同一日期。
每个数字背后的完整 SQL
WITH
sessions AS
(
SELECT
ticker AS ticker,
toDate(toTimeZone(window_start, 'America/New_York')) AS d,
toFloat64(argMax(close, window_start)) AS px
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('SPY', 'AAPL', 'KO')
AND window_start >= toDateTime('2024-04-01 04:00:00')
AND window_start < toDateTime('2026-07-01 04:00:00')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) >= 570
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) < 960
GROUP BY ticker, d
),
steps AS
(
SELECT
ticker,
d,
px,
any(px) OVER (PARTITION BY ticker ORDER BY d ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) AS prev_px
FROM sessions
),
daily_ret AS
(
SELECT ticker, d, (px / prev_px) - 1 AS r
FROM steps
WHERE prev_px > 0
),
bench AS
(
SELECT d, r AS spy_r
FROM daily_ret
WHERE ticker = 'SPY'
),
paired AS
(
SELECT
s.ticker AS ticker,
s.r AS r,
b.spy_r AS spy_r,
row_number() OVER (PARTITION BY s.ticker ORDER BY s.d DESC) AS rn
FROM daily_ret AS s
INNER JOIN bench AS b ON b.d = s.d
WHERE s.ticker IN ('AAPL', 'KO')
),
windows AS
(
SELECT arrayJoin([30, 60, 90, 180, 252, 504]) AS lookback
)
SELECT
w.lookback AS lookback_sessions,
round(covarPopIf(p.r, p.spy_r, p.ticker = 'AAPL') / varPopIf(p.spy_r, p.ticker = 'AAPL'), 2) AS aapl_beta,
round(covarPopIf(p.r, p.spy_r, p.ticker = 'KO') / varPopIf(p.spy_r, p.ticker = 'KO'), 2) AS ko_beta
FROM paired AS p
CROSS JOIN windows AS w
WHERE p.rn <= w.lookback
GROUP BY w.lookback
HAVING countIf(p.ticker = 'AAPL') > 0 AND countIf(p.ticker = 'KO') > 0
ORDER BY lookback_sessions在最近30个交易日内,AAPL的Beta为0.54;在504个交易日内,相对于1.14的Beta为该值。KO在较短区间内的Beta为-1.04,在较长区间内为-0.03。所有6个估算值在算术上都正确。它们回答的是不同问题,而Beta加权组合Delta会继承平台实际采用的那个区间。某个防御型标的在一个区间内显示出略为负值的Beta,在下一个区间内又显示出略为正值,这是常见情况,并非异常。上文示例组合中的每个正负号,都取决于这一选择。
相关性行为是第二个限制。Beta是普通交易日表现的平均值。在市场普遍抛售期间,平时按自身节奏波动的标的往往会同步下跌,测得的Beta也会聚拢至1附近。在平静市场中看似平衡的组合,在真正需要对冲的交易日可能远非平衡。集中度风险从另一个角度描述了同一盲点:汇总统计量反映的是分布中部,而不是尾部。
第三,这一计算是一阶近似,不包含Gamma。Beta加权Delta表示组合价值在当前价格下的斜率,并假设该斜率保持不变。Gamma表示Delta自身的变化速度,但计算中完全没有体现。持有空头期权的组合,即使显示出适度的Beta加权Delta,在指数变动3%时仍可能迅速改变特征。为计算提供输入的Delta不再能描述这些头寸在新价格下的情况。应将该数值视为小幅波动下的描述。用于应对尾部风险的头寸,例如保护性看跌期权,在Beta加权指标中看起来很小,但在这一波动范围内本来也尚未发挥作用。
基准指数同样是一种选择。将小盘股组合与SPY进行加权比较,会掩盖其中一部分源于公司规模、而非广泛市场走势的波动。Delta只是希腊字母指标之一,其余指标见期权希腊字母详解。
常见问题
什么是贝塔加权Delta?
贝塔加权Delta会将投资组合中的每个头寸,换算为基于某一基准资产的等效股数,通常是SPY。计算时,将每个头寸的原始Delta乘以标的相对于该基准的贝塔,再乘以两者的价格比,最后将整个投资组合的结果相加。
如何手动计算贝塔加权Delta?
先计算头寸的股票等效Delta:股票每股为1;期权每张合约则为期权Delta乘以100。将其乘以标的相对于基准资产的贝塔,再乘以标的价格除以基准资产价格。对所有头寸分别计算后,将结果相加。
贝塔加权Delta为负意味着什么?
这表示该投资组合在基准资产下跌时倾向于增值,在基准资产上涨时倾向于贬值。其变化幅度大致相当于做空相应数量的基准资产。交易员将其称为Delta偏空。该指标仅适用于幅度较小的价格变动。
股票的贝塔可以为负吗?
可以,但取决于所选观察区间。贝塔是根据股票日收益率相对于指数日收益率的回归斜率计算的。某只防御型股票在一个十二个月区间内的贝塔可能略低于零,而在下一个区间内略高于零。贝塔为负会改变该头寸贝塔加权Delta的符号,因此解读该指标时,也要结合其测算区间。
哪个回溯区间能得到正确的贝塔?
不存在唯一正确的区间。30个交易日的贝塔更能反映近期表现,但波动也会很大;一年或两年的贝塔更稳定,对标的基本面变化的反映也更慢。上方的稳定性面板显示,同一只股票在同一日期使用两个区间计算时,结果可能相差多远。
贝塔加权是否考虑Gamma或波动率?
不考虑。贝塔加权Delta是一项一阶指标,由当前Delta和历史贝塔构成。Gamma、Vega、Theta和Rho不会受到影响。因此,一个卖出期权的投资组合在贝塔加权Delta口径下可能接近中性,但在大幅波动时仍可能承担较大风险。
上方每个面板都附有生成结果的SQL。打开任意一个面板,替换ticker或测算区间,即可对您在Strasmore终端中描述的任何投资组合运行相同的贝塔加权计算。