Strasmore Research
学习 Matt Connor作者: Matt Connor · 更新于 2026-08-08

投资组合 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。

查询每持有一股对应的Beta、价格比率和SPY等价股数
每个数字背后的完整 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 DESC
Run this yourself

NVDA的贝塔最高,为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%的区间。

查询AAPL看涨期权和看跌期权的Delta(执行价梯度),距到期20至45天
每个数字背后的完整 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
Run this yourself

-12%区间内,看涨期权在4份成交合约中的平均Delta为0.924,看跌期权的平均Delta为-0.084。在+10%区间内,看涨期权的平均Delta为0.106,看跌期权为-0.834。相同行权价的看涨期权和看跌期权,其Delta符号相反。因此,卖出看涨期权和买入看跌期权都能抵消多头股票头寸的部分风险。随着到期日临近,整条曲线如何移动,详见期权希腊值如何随时间变化

将一小组合并为一个数字

假设有一个由三个头寸组成、按手工设定规模的组合:做多300股 AAPL;做空3张 AAPL 看涨期权,执行价约高于现价5%,距到期约一个月,这是标准的备兑看涨期权策略;做多5张接近平值、到期时间相近的 KO 看跌期权,作为对第二只股票的对冲。股票和合约数量均为假设值。面板中的每个 delta 和 beta 均为测算结果。

查询三腿组合:原始Delta与Beta加权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', '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
Run this yourself

股票头寸带来 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,所有区间均截至同一日期。

查询同两个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
Run this yourself

在最近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终端中描述的任何投资组合运行相同的贝塔加权计算。

#beta weighting#portfolio greeks#delta#hedging#期权