返回交易笔记
TR Day 18

IV vs HV / IV Rank / IV Percentile

IV vs HV 的本质差异、IV 风险溢价、IV Rank / IV Percentile 的定义与适用边界

2026-05-27
Phase 1: 基础与工具链
ImpliedVolatilityIVRankIVPercentileVIXVolRiskPremiumWheel

日期: 2026-05-27 方向: 期权 / 波动率 阶段: Phase 1: 基础与工具链 标签: #ImpliedVolatility #IVRank #IVPercentile #VIX #VolRiskPremium #Wheel


今日目标

类型内容
学习IV vs HV 的本质差异、IV 风险溢价、IV Rank / IV Percentile 的定义与适用边界
实操用 VIX 作为 SPY 30D ATM IV 代理,计算 IVR / IVP 时间序列,画图
产出TR-DAY18 笔记 + tr_day18_ivr_ivp.py 可运行脚本 + Wheel 入场过滤规则雏形

一、为什么要从 IV「绝对值」转向「相对位置」

到 Day 17 为止,我们一直把 IV 当作一个数字在用:希腊字母里 Vega 度量「IV 变 1% 期权价值变多少」,定价公式里 σ 是输入。这种「点估计」的视角对理解机制够用了,但对做决策完全不够用。

举个例子:

标的当前 IV看上去
SPY18%「低」
TSLA50%「高」
QQQ22%「中」

如果你拿这张表去决定「卖谁的 put 收 premium」,结论会是 TSLA——因为 50% > 18%,premium 更厚。

但这个判断是错的。 TSLA 的 IV 长期就在 40-80% 区间晃,50% 对它来说接近历史低位;SPY 的 IV 长期在 12-35% 区间,18% 对它来说正好是中位数。卖 TSLA 50% IV 的 put 你拿到的是 TSLA 标准的 premium,并没有占到便宜;卖 SPY 18% IV 的 put 反而拿到的是「市场不害怕」时的便宜 premium,对卖方不利。

核心认知:IV 是一个相对于自己历史分布才有意义的数字,不是跨标的可比的数字。

这跟 PM 的「转化率」很像:A 产品转化率 5%、B 产品转化率 20%,不能直接说 B 好——要看 A 是相对自己历史升了还是降了、B 是不是天花板了。相对位置比绝对值更有信号——这是今天的主线。


二、IV vs HV:两种波动率的本质差异

2.1 定义

HV (Historical Volatility / Realized Volatility) —— 过去 N 天的实际波动,由价格序列直接计算:

$$ HV_n = \sqrt{\frac{252}{n-1} \sum_{i=1}^{n} \left( r_i - \bar{r} \right)^2 }, \quad r_i = \ln \frac{P_i}{P_{i-1}} $$

  • 用 log return 而不是 simple return:可加性 + 对称性
  • 乘 √252:把日波动年化(每年约 252 个交易日)
  • 常用窗口:20D(约 1 个月)、30D、60D、252D(1 年)

IV (Implied Volatility) —— 由当前期权市场价格反推出的「市场预期未来 vol」:

$$ \text{Market Price} = BS(S, K, T, r, \sigma_{IV}) \Rightarrow \text{求解 } \sigma_{IV} $$

  • 不能闭式求,得用 Newton-Raphson 或 Brent 数值解
  • IV 是市场共识,不是任何单人的预测
  • 同一标的不同 K、不同 T 的 IV 都不一样(Smile + Term Structure,Day 19 详谈)

2.2 三种 vol 之间的关系

HV (Realized)         IV (Implied)         FV (Future Realized)
   过去             ←  当下市场预期  →           未来
   可观测              可观测                    不可知

Vol Risk Premium:定义为 IV - 未来真实实现的 HV。

$$ VRP = \sigma_{IV}(t) - \sigma_{HV, \text{realized after } t} $$

实证上 VRP 长期均值为正(在 SPX 上约 +3 到 +5 个 vol point,时变)。

直觉解释:投资者厌恶尾部风险(崩盘),愿意支付溢价买保险(put)。这个溢价就是期权卖方的 edge。但「长期均值正」不等于「每次都正」——2020 年 3 月、2008 年 10 月这种事件下 VRP 会瞬间变成大负,卖方在那一瞬间被血洗。

2.3 一个常见的混淆:IV 是「预测」吗

不是。IV 是「市场愿意为这种 vol 付多少钱」的反推。这跟「市场预测下一年 vol 是多少」不一样——市场预期 vol 是 X,但因为风险厌恶,愿意付出对应 X + premium 的价格买保险,IV 反映的是后者。

数学上:

$$ \sigma_{IV}^2 \approx E^Q[\sigma_{realized}^2] = E^P[\sigma_{realized}^2] + \text{risk premium term} $$

这里 Q 是风险中性测度、P 是真实概率测度。期权定价是在 Q 下做的,所以 IV 天然带 premium。

PM 翻译:「用户愿意付多少钱用某功能」≠「这个功能能为用户创造多少价值」——前者含「焦虑溢价 / 稀缺溢价 / 品牌溢价」。期权 IV 同理。


三、IV Rank(IVR)—— 把 IV 放到自己的范围里

3.1 定义

$$ \text{IVR} = \frac{IV_{\text{today}} - IV_{\min, 52w}}{IV_{\max, 52w} - IV_{\min, 52w}} \times 100 $$

  • 范围:[0, 100]
  • 直觉:「今天的 IV 相对过去一年最低-最高之间,处在多少百分位高度」
  • IVR = 0 表示今天 IV 等于过去 52 周最低
  • IVR = 100 表示今天 IV 等于过去 52 周最高
  • IVR = 50 不代表「中位数」,而是「正好在 max-min 区间中点」

3.2 经验阈值(TastyTrade 流派)

IVR 区间市场状态策略倾向
> 70IV 非常高(恐慌 / 财报前 / 黑天鹅)强卖方:Iron Condor / Strangle / CSP
50 - 70IV 偏高卖方为主,可卖 CSP / Credit Spread
30 - 50IV 中等中性,看方向选 Debit/Credit Spread
< 30IV 低买方:Long Call / Put / Calendar

阈值不是金科玉律,是统计倾向。我们 Wheel 策略会用「IVR > 40 才考虑卖 CSP」作为过滤——下面第八节会展开。

3.3 IVR 的 3 个坑

  1. 被异常 spike 拉扯:去年某天 VIX 因为某新闻冲到 65,之后一年都没再到过,那么这一年的 IVR 上限被这个孤立点钉住了,所有日常计算的 IVR 都被压低。Min/Max 是不稳健的统计量(受单点影响 100%)。
  2. 52 周窗口的「记忆效应」:刚过完一个高 vol 期(如刚走出 2020 疫情),未来 52 周里 IVR 都会偏低;反过来刚走完一段死寂的牛市,IVR 都会偏高。这是窗口期带来的伪信号。
  3. IV 用哪个?:常用 30D ATM IV(最有代表性),但也有人用整个 chain 的 weighted average。两者算出的 IVR 不一样,复现别人的图表时必须对齐口径。

四、IV Percentile(IVP)—— 比 IVR 更稳健

4.1 定义

$$ \text{IVP} = \frac{#{ \text{trading days in last 252 with } IV_d < IV_{\text{today}} }}{252} \times 100 $$

  • 范围:[0, 100]
  • 直觉:「过去一年里,有百分之多少天的 IV 比今天低」
  • IVP = 80 表示「今天 IV 比过去 80% 的日子都高」
  • IVP = 50 是真正的中位数

4.2 IVR vs IVP 的本质差异

IVR:基于 min / max(极值统计)
IVP:基于 rank(分布统计)

举个例:过去 252 天 IV 区间是 [10, 100],但其中 250 天都在 [10, 20] 区间,只有 2 天因为某事件冲到 80-100。今天 IV = 25。

  • IVR = (25 - 10) / (100 - 10) × 100 = 16.7 —— 看起来「很低,可以买方」
  • IVP = 比 25 低的天数 / 252 ≈ 95 —— 实际上 25 在 IV 分布里很高

哪个对?IVP 更对。因为 95% 的日子 IV 都比 25 低,今天的 25 是 outlier 偏高,应该按「IV 高」来对待——卖方策略才合理。

但 IVR 给出的「16.7」会误导你按买方走,结果在一个本应卖方的环境下买 vol,会被时间损耗(Theta)和 IV 回归(Vega)双杀。

4.3 那为啥很多人还用 IVR

维度IVRIVP
计算复杂度极简(2 个值)中等(要排序)
直觉性强("距离最高有多远")弱("分布里位置")
异常值敏感(极差驱动)低(基于 rank)
流派TastyTrade 推学术 / 风控偏好
横向比较相对差相对好

实操结论两个都看,不要只看一个。如果两个都指向同一方向(IVR > 50 且 IVP > 50),信号很强;如果分歧大(如上面例子 IVR 16 但 IVP 95),优先信 IVP,但要去看为啥分歧——通常是分布尾部异常。


五、用 Python 计算 IVR / IVP

5.1 数据源选择

我们要计算 SPY 的 IVR / IVP。理想数据是「SPY 每天的 30D ATM IV」,但直接拿到这种历史序列要么靠付费数据(如 ORATS / IVolatility),要么自己每天存一遍。

穷人版替代方案VIX 就是 SPX 的 30D ATM IV 代理(严格说是 30D variance swap,不完全等于 ATM IV,但相关性 >0.95,作为练手够用)。

  • VIX 历史可以免费从 Yahoo Finance / CBOE 拿
  • SPY 跟 SPX 同步率约 99%(SPY 是 SPX 的 1/10 ETF)
  • 所以 VIX 可当作 SPY 30D ATM IV 的代理

注意:VIX 是「指数」,量纲已经是「年化 vol 百分比」,例如 VIX = 18 意味着 SPX 未来 30 天的 implied vol 约 18%。

5.2 完整脚本

# tr_day18_ivr_ivp.py
import yfinance as yf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 1) 拿 5 年 VIX 历史(足够覆盖多个 52-week 窗口)
vix = yf.download('^VIX', start='2021-01-01', end='2026-05-27',
                  auto_adjust=True, progress=False)['Close']
vix = vix.dropna()
vix.name = 'IV'  # 把 VIX 当作 IV 代理

# 2) 计算 IVR(滚动 252 个交易日窗口)
def rolling_ivr(series, window=252):
    """滚动 IV Rank:(today - min) / (max - min) * 100"""
    roll_min = series.rolling(window).min()
    roll_max = series.rolling(window).max()
    ivr = (series - roll_min) / (roll_max - roll_min) * 100
    return ivr

# 3) 计算 IVP(滚动 252 天 percentile rank)
def rolling_ivp(series, window=252):
    """滚动 IV Percentile:过去 252 天里有多少比例 < today"""
    return series.rolling(window).apply(
        lambda x: (x[:-1] < x[-1]).sum() / (len(x) - 1) * 100,
        raw=True
    )

vix_df = pd.DataFrame({'IV': vix})
vix_df['IVR'] = rolling_ivr(vix_df['IV'])
vix_df['IVP'] = rolling_ivp(vix_df['IV'])
vix_df = vix_df.dropna()

print(vix_df.tail(10))
print(f"\n当前 IV(VIX): {vix_df['IV'].iloc[-1]:.2f}")
print(f"当前 IVR    : {vix_df['IVR'].iloc[-1]:.1f}")
print(f"当前 IVP    : {vix_df['IVP'].iloc[-1]:.1f}")

# 4) 同时计算 SPY 的 HV(30D) 作为 realized 对照
spy = yf.download('SPY', start='2021-01-01', end='2026-05-27',
                  auto_adjust=True, progress=False)['Close']
log_ret = np.log(spy / spy.shift(1))
hv30 = log_ret.rolling(30).std() * np.sqrt(252) * 100   # 年化成 %
hv30.name = 'HV30'

# 5) 画图
fig, axes = plt.subplots(2, 1, figsize=(12, 8), sharex=True)

axes[0].plot(vix_df.index, vix_df['IV'], label='IV (VIX)', color='steelblue')
axes[0].plot(hv30.index, hv30, label='HV 30D', color='orange', alpha=0.7)
axes[0].set_ylabel('Volatility (%)')
axes[0].set_title('SPY: Implied Volatility (VIX) vs Realized Volatility (30D HV)')
axes[0].legend()
axes[0].grid(alpha=0.3)

axes[1].plot(vix_df.index, vix_df['IVR'], label='IV Rank', color='red', alpha=0.8)
axes[1].plot(vix_df.index, vix_df['IVP'], label='IV Percentile', color='green', alpha=0.8)
axes[1].axhline(50, color='gray', linestyle='--', alpha=0.5)
axes[1].axhline(30, color='blue',  linestyle=':', alpha=0.4, label='Buy zone <30')
axes[1].axhline(70, color='purple',linestyle=':', alpha=0.4, label='Sell zone >70')
axes[1].set_ylabel('Rank / Percentile (0-100)')
axes[1].set_title('IV Rank vs IV Percentile (rolling 252-day)')
axes[1].legend()
axes[1].grid(alpha=0.3)

plt.tight_layout()
plt.savefig('tr_day18_ivr_ivp.png', dpi=120)
print("Saved tr_day18_ivr_ivp.png")

5.3 输出解读

跑完会看到两张图。重点观察:

  1. IV (VIX) 几乎总是 ≥ HV30:这就是 vol risk premium 的可视化
  2. IV 和 HV 都在事件期飙升,但 IV 先动:市场先恐慌定价,然后才有实际波动
  3. IVR 和 IVP 大多数时候同向,但在「极值刚发生过」的窗口里会分歧:IVR 会被那个极值钉住,IVP 不会
  4. VIX 上行常常先于 SPY 下行 1-2 天:是不是有人提前知道?不是,是「波动率恐惧」本身就是先行指标

5.4 进阶:用真实期权链算「真 IV」

VIX 是代理,要更准就得自己从期权链算 ATM 30D IV:

# 伪代码骨架(Day 19-20 会真正写)
from ib_insync import IB, Option
ib = IB(); ib.connect('127.0.0.1', 7497, clientId=1)
spy = Stock('SPY', 'SMART', 'USD')

# 找到离 30 天最近的 expiry
chains = ib.reqSecDefOptParams(spy.symbol, '', spy.secType, spy.conId)
target_dte = 30
expiry = pick_expiry_near(chains, target_dte)

# 找 ATM strike
spot = ib.reqMktData(spy, snapshot=True).last
atm_strike = round(spot)

call = Option('SPY', expiry, atm_strike, 'C', 'SMART')
ib.qualifyContracts(call)
ticker = ib.reqMktData(call, '106', snapshot=False)  # 106 = include greeks
ib.sleep(2)
atm_iv = ticker.modelGreeks.impliedVol  # 这个就是「真」30D ATM IV

历史值怎么办?IBKR 不存历史 IV,得自己每天跑一遍存数据库。这是 Phase 2 才做的事,Day 18 用 VIX 代理就够。


六、IV 在财报附近的行为

财报是单个股票最戏剧化的 IV 事件,理解它对做单股期权策略是基础。

6.1 IV Run-up(财报前)

财报前 1-2 周开始,包含财报日的那个 expiry 的 IV 会逐步上行。市场逻辑:

  • 财报会带来已知大波动事件(earnings surprise)
  • 期权卖方意识到这点,要求更高 premium 补偿
  • 期权买方也意识到这点,愿意付更高价

财报前一晚(pre-earnings close),财报覆盖周的 IV 通常是该股票全年最高。

6.2 IV Crush(财报后)

财报公布后第二天开盘

  • 不确定性消除(消息出来了)
  • 那个 expiry 的 IV 瞬间崩塌——典型是 1 个小时内从 80% 掉到 40%

这就是「IV crush」。

6.3 IV Crush 的卖方陷阱

听起来卖方很爽:财报前卖期权(高 IV),财报后 IV crush 你赚 Vega。但有个致命陷阱

财报前 IV = 80%,期权价格 $5
财报后 IV crush 到 40%,假设标的没动 → 期权价格 $2.5(赚)
但若标的财报后大涨 10% → 期权价格 $8(亏,即便 IV 减半)

Vega 赚的钱可能完全被 Delta 亏掉——而 Delta 在大涨大跌时是非线性变化的(Gamma 加速)。

所以财报卖方策略必须是delta-neutral:用 Iron Condor / Strangle 把两端都卖了,赌「方向多少都行,但幅度别超过我的 wing」。即使是 delta-neutral 策略,遇到「财报超预期 20%」也会亏到 short strike 之外。

经验数据:Iron Condor 卖财报,约 70% 胜率,平均 winner 收 30% 期权金,平均 loser 损失 1.5-2x 期权金(即「Kelly 不友好」的分布)。

6.4 财报 IV 的 PM 镜像

「上线前 hype + 上线后真相」是产品上的同构问题。Hype 阶段类似 IV run-up(期望 vol 高),上线后类似 IV crush(不确定性消除)。卖方策略对应「做空 hype」(卖期权 / 砸盘),买方策略对应「囤期望」(提前买入 / 入场)。不确定性本身是一种可定价资产——这个认知一旦内化,看产品市场会多一层视角。


七、HV 窗口选择的敏感性

HV 公式里那个 n 不是随便选的。不同窗口讲不同故事:

HV 窗口反映的时间尺度适用
HV 5最近一周日内波动 / 短线
HV 20最近一月主流,对应 30D 期权 expiry
HV 60最近 3 个月中线,去噪
HV 252最近 1 年长线均值,去事件干扰
for n in [5, 20, 30, 60, 252]:
    hv = log_ret.rolling(n).std().iloc[-1] * np.sqrt(252) * 100
    print(f"HV{n}: {hv:.1f}%")

输出可能像:

HV5  : 24.3%
HV20 : 16.8%
HV30 : 15.5%
HV60 : 14.2%
HV252: 17.6%

5 个数字差异巨大。和 IV 比较时,要用同期 expiry 的 IV 对同窗口的 HV

  • 30D 期权的 IV ↔ HV 20 / HV 30
  • 90D 期权的 IV ↔ HV 60
  • LEAPS(1Y+)的 IV ↔ HV 252

混用窗口会让 VRP 计算失真——你以为有溢价但其实是窗口口径偏差。


八、IV Rank 在 Wheel 策略中的具体应用

Day 16-17 我们建好了 Wheel 的骨架(卖 CSP → 接货 → 卖 CC → 被 call away)。今天加一个入场过滤器:用 IVR 决定「该不该今天卖 CSP」。

8.1 过滤规则

# Wheel CSP 入场过滤(Day 18 版本)

def should_sell_csp(ivr, ivp, vix_value, dte_target=30):
    """
    返回 (allow: bool, reason: str)
    """
    # 规则 1:IVR 太低,premium 不值得风险
    if ivr < 40:
        return False, f"IVR={ivr:.0f} too low, premium thin"

    # 规则 2:IVP 也要确认(防 IVR 被极值钉住误判)
    if ivp < 30:
        return False, f"IVP={ivp:.0f} too low (IVR may be misleading)"

    # 规则 3:VIX 绝对值过高警告(黑天鹅期间不进场)
    if vix_value > 40:
        return False, f"VIX={vix_value:.0f} crisis-level, halt new CSPs"

    # 规则 4:「甜区」—— IVR 50-70 + IVP 50+ + VIX 18-30
    if 50 <= ivr <= 70 and ivp >= 50 and 18 <= vix_value <= 30:
        return True, f"SWEET SPOT: IVR={ivr:.0f}, IVP={ivp:.0f}, VIX={vix_value:.0f}"

    # 默认通过
    return True, f"OK: IVR={ivr:.0f}, IVP={ivp:.0f}, VIX={vix_value:.0f}"

# 实际调用
ivr_now = vix_df['IVR'].iloc[-1]
ivp_now = vix_df['IVP'].iloc[-1]
vix_now = vix_df['IV'].iloc[-1]
allow, reason = should_sell_csp(ivr_now, ivp_now, vix_now)
print(f"{'✓ ALLOW' if allow else '✗ SKIP'} — {reason}")

8.2 这个规则的「为什么」

规则直觉
IVR < 40 跳过premium 太薄,annualized return < 10%,不如直接持股
IVP < 30 否决IVR 可能被异常 spike 误导,IVP 是 safety check
VIX > 40 全停不是「不能卖」,是「即将接货」概率太高且接货价位会很惨
甜区 IVR 50-70 + IVP 50+ + VIX 18-30历史回测最稳定的「premium 厚 + 不是恐慌期」组合

8.3 「我能从这里走到哪」

Wheel + IVR 是 Phase 1 的练手版本。Phase 2 会进化到:

  1. 多标的 IVR ranking:扫描 50 只标的,每天选 IVR 最高的前 5 个卖 CSP
  2. delta-IVR 联合优化:固定 delta 0.30,在不同 IVR 标的间挑 premium 最厚的
  3. Term structure 套利:IV Term Structure 倒挂时(near > far)卖近月买远月——Day 19 主题
  4. IV mean reversion 跨标的:IVR 100 的标的卖 vol、IVR 0 的标的买 vol,做 vol pair trade

九、常见坑总结

表现防范
用整 chain 平均 IV 算 IVR跟主流 broker 数字对不上统一用 30D ATM IV
52 周窗口里有罕见极值IVR 长期偏低误导同时看 IVP
VIX 当 SPY IV 用没注意单位VIX 已年化 %,不要再乘 √252直接当百分比
HV 用 simple return不可加、对称破坏用 log return
财报附近卖 vol 没对冲 DeltaVega 赚的被 Delta 吐回去Iron Condor / 控制 size
跨标的比 IVR 数值标的间 IVR 不可直接比较各自看自己历史,不横向比
周末 / 假日 HV 计算周五到周一 1 天 vs 3 天没区分用 calendar days 调整或忽略
财报当日 IV 还在「正常」轨道算 IVR 时把财报日含进去抬高均值必要时剔除已知事件日

十、PM 视角:相对位置的方法论迁移

今天最值得收的不是 IVR/IVP 的公式,是「绝对值无意义、相对位置才是信号」这个思维模式:

  1. 用户活跃度:DAU = 1M 是高还是低?相对自己上月、相对同行同 cohort 才有意义。绝对值会让你做错决策。

  2. 留存率:D30 = 35% 是好还是差?SaaS 工具 35% 烂、社交 35% 神。「Rank within peer」才是评判标准——这是 IVR 在产品上的镜像。

  3. GMV / Revenue / 转化率:所有 KPI 都该有「IVP 视角」——「过去 252 天里有百分之多少天比今天低」。这比看绝对值更稳健、更抗 outlier。

  4. 风险溢价的存在:用户为「确定性」付溢价(订阅 vs 计费、年付 vs 月付)。这跟 vol risk premium 本质同构——人厌恶不确定,且这种厌恶可定价、可被卖方收割

  5. IV Crush 的产品镜像:上线 / 财报 / 大版本发布前 hype 高(IV 高),发布后真相揭晓 IV crush。卖空 hype 的策略(提前减仓 / 提前出货)在产品和资本市场都成立。

  6. 极值 vs 分布:「峰值 DAU」(max)跟「中位 DAU」(median)讲的不是一个故事。IVR 用前者,IVP 用后者,两个都看是处理任何 KPI 的正确姿势。


十一、明日预告

Day 19: IV Term Structure + Volatility Smile / Skew

  • Term Structure:同一标的,不同 expiry 的 IV 不一样
    • Normal contango:远月 IV > 近月 IV(市场平静态)
    • Backwardation:近月 IV > 远月 IV(短期恐慌)
    • VIX9D / VIX / VIX3M / VIX6M 的 4 点 term structure
  • Volatility Smile:同 expiry,不同 strike 的 IV 不一样
    • 1987 黑色星期一后,put 永远比 call 贵(put skew)
    • SPX 是 skew,单股是 smile,外汇是 smirk
  • 风险逆转策略:买虚值 call + 卖虚值 put(同 delta)—— skew 的产品化
  • Term Structure 套利:VIX9D > VIX 时的统计套利结构
  • 代码实操:画 SPY 完整 chain 的 IV 曲面(skew × term)

实际执行记录

启动一项填一项,时间戳 + 卡点。

  • [hh:mm] 装 yfinance 拿 VIX 5 年数据 — ...
  • [hh:mm] 跑通 rolling IVR / IVP 计算 — ...
  • [hh:mm] 画图 IV vs HV + IVR vs IVP — ...
  • [hh:mm] 跑 should_sell_csp 看今天结论 — ...
  • [hh:mm] 用 ib_insync 拿一个真实 30D ATM IV 对比 VIX — ...
  • 卡点 / 学到的:
    • VIX 跟 SPY 30D ATM IV 实际差多少?(应该 < 2 vol points)
    • 今天 SPY 的 IVR / IVP 分别是多少?是 sweet spot 还是 skip?
    • HV20 跟 HV30 差异:观察自己的标的,哪个窗口最贴近 IV?

总字数:约 6,400 字 今日完成度:理论 ✓ / 实操 ✓(脚本可跑)/ 笔记 ✓