返回交易笔记
TR Day 38

Wheel 策略全图 — CSP → Assigned → CC → 卖出

Wheel = 在你愿意长期持有的标的上,循环卖出 OTM put 和 OTM call,靠 Theta 衰减赚 premium,被 assigned 时按预设计划接货或卖货。

2026-06-16
Phase 2: 策略实战 + AI 信号
WheelCSPCoveredCallThetaHarvestingSmallAccountLowPriceStock

日期: 2026-06-16 方向: Phase 2 / 期权 / Wheel 阶段: Phase 2: 策略实战 + AI 信号 标签: #Wheel #CSP #CoveredCall #ThetaHarvesting #SmallAccount #LowPriceStock


今日目标

类型内容
学习Wheel 四阶段全闭环 / Theta 收益结构 / <$5k 标的筛选逻辑 / 最大坑(价格断崖与卡仓)/ Greeks 视角解构
实操wheel_state_machine.py:自动跟踪持仓阶段并给出下一步建议
产出TR-DAY38 笔记 + 状态机代码骨架 + 候选标的清单 + 年化收益数学模型

一、Wheel 策略的本质:把「赌方向」改成「收租金」

Wheel 是期权领域里最被低估的策略之一——因为它不性感(没有 100x payoff)、不复杂(没有跨期蝶式)、不刺激(不靠择时)。但在 <$5k 小账户里,它几乎是结构上最稳健的可持续盈利来源

1.1 一句话定义

Wheel = 在你愿意长期持有的标的上,循环卖出 OTM put 和 OTM call,靠 Theta 衰减赚 premium,被 assigned 时按预设计划接货或卖货。

它不是「策略」,更像一个状态机(State Machine)。每一步的输入是当前持仓状态 + 标的价格 + 到期日,输出是「卖什么、卖多少、什么 strike」。

1.2 与方向性交易的核心区别

维度方向性交易(如长仓股票)Wheel
收益来源Delta(价格变动)Theta(时间衰减)
胜率50-55% 已是好策略70-85%(OTM put 多数过期作废)
单笔最大盈利理论无限封顶 = premium
单笔最大亏损最差 = 全部本金最差 = strike - premium
需要预测方向✓ 需要✗ 不需要(只要不暴跌)
心理压力高(每天看涨跌)低(30 天才动一次)
适合资金量任意小资金特别友好

关键认知:Wheel 是「用『接货的承诺』换 premium」的生意。你不是在赌它涨还是跌,你是在卖一份「保险」——卖给市场上那些怕跌的人——只要你愿意接货(CSP 阶段)或愿意卖货(CC 阶段),这份保险就能持续收钱。

1.3 这跟金融 PM 的日常工作其实是同构的

我做了 10 年金融零售,回头看 Wheel 的结构跟「月度采购合同 + 库存承受能力」几乎一模一样:

  • CSP 阶段 = 「我承诺以约定价格买入 100 单位库存(如果对方要交货)」+ 对方先付定金(premium)
  • Assigned = 库存按计划入库(不是失败,是合同执行)
  • CC 阶段 = 「我承诺以约定价格卖出 100 单位库存(如果对方要买)」+ 对方先付定金
  • Called away = 库存按计划出库

唯一不同的是:金融合同的对手方是具体的人(你能谈判),而 Wheel 的对手方是市场(你只能 take 或 leave 报价)。


二、四阶段详解:每一步的目标和决策

2.1 流程图

                  ┌─────────────────────────────────┐
                  │   START: 持有现金 $5k           │
                  └────────────────┬────────────────┘
                                   ▼
            ┌──────────────────────────────────────────┐
            │   Stage 1: 卖 CSP (Cash-Secured Put)     │
            │   - Strike: 你愿意接货的价格 (~Delta 0.30)│
            │   - DTE:   30-45 天                       │
            │   - 占款:  strike × 100                   │
            │   - 收入:  premium A                      │
            └────────────────┬─────────────────────────┘
                             ▼
                ┌────────── 到期 ──────────┐
                │                            │
            股价 > strike              股价 < strike
        (OTM, 过期作废)              (ITM, 被 assigned)
                │                            │
                ▼                            ▼
        ┌───────────────┐         ┌──────────────────────┐
        │ 保留 premium A│         │ Stage 2: Assigned    │
        │ → 回 Stage 1  │         │ - 以 strike 买入 100  │
        └───────────────┘         │   股                  │
                                  │ - 实际成本 =          │
                                  │   strike - premium A  │
                                  └──────────┬───────────┘
                                             ▼
                            ┌──────────────────────────────────┐
                            │ Stage 3: 卖 Covered Call         │
                            │ - Strike: ≥ 你的成本 (Delta 0.30) │
                            │ - DTE:    30-45 天                │
                            │ - 占款:   股票本身(不额外占款) │
                            │ - 收入:   premium B               │
                            └──────────────┬───────────────────┘
                                           ▼
                          ┌────────── 到期 ──────────┐
                          │                            │
                      股价 < strike              股价 > strike
                    (OTM, CC 过期作废)        (ITM, 被 called away)
                          │                            │
                          ▼                            ▼
                  ┌───────────────┐         ┌──────────────────────┐
                  │ 保留 premium B│         │ Stage 4: Called Away │
                  │ + 继续持股    │         │ - 以 strike 卖出 100 │
                  │ → 回 Stage 3  │         │   股                  │
                  │ (卖新 CC)     │         │ - 兑现盈利           │
                  └───────────────┘         │ - 回到现金状态       │
                                            └──────────┬───────────┘
                                                       │
                                                       └─→ 回 Stage 1

2.2 四阶段决策表

阶段你的状态目标决策期望结果
Stage 1现金收 premium A,期望 OTM 过期卖 Delta ~0.30 的 OTM put70-75% 概率过期作废
Stage 2被 assigned接受执行(不是失败!)持股,立刻进入 Stage 3「按计划接货」
Stage 3持股 100收 premium B,期望 OTM 过期卖 Delta ~0.30 的 OTM call70-75% 概率过期作废
Stage 4被 called away兑现卖出(不是失败!)拿回现金,回 Stage 1「按计划卖货 + 兑现盈利」

2.3 关键认知:Stage 2 和 Stage 4 不是失败

新手最大的心理障碍是「我被 assigned 了,是不是策略错了?」

不是。 在 Wheel 的设计里,Stage 2 和 Stage 4 是预期内的事件

  • Stage 2(被接货):你早就说过「strike 这个价我愿意买」。市场把价格送到了,你买了,这是 plan 内的事。
  • Stage 4(被卖出):你早就说过「strike 这个价我愿意卖」。市场把价格送到了,你卖了,盈利兑现。

真正的失败只有一种:你卖的 CSP 标的,你根本不想长期持有。这才是错。


三、为什么 Wheel 特别适合小资金(<$5k)

3.1 三个结构性优势

1. Risk-defined(最大风险有上界)

单轮 Wheel 最大亏损 = (strike × 100) - 已收 premium 之和 - 现价 × 100
                    = 你的接货成本 - 当前市值

举个具体的例子:F (Ford) 现价 $11,你卖 $10 strike 的 CSP,收 $0.20 premium。

  • 最坏情况:F 跌到 $0(破产),你被 assigned,损失 = $10×100 - $20 = $980(用了 $1000 保证金,留下来 $20 premium)
  • 可见性:你 sell put 那一刻就知道最大亏损是多少

对比纯股票:买 $5k 的 SPY,最大亏损理论上 $5k,没有任何 premium 缓冲。

2. 不需要预测方向

小账户最大的敌人是「过度交易」——每天看盘,每个新闻都想动,最后被滑点和情绪杀死。

Wheel 强制你:

  • 30-45 天才动一次(卖完 CSP 就只能等到期)
  • 没有「stop loss」概念(你早就计划好接货了)
  • 不需要看图、不需要看新闻、不需要预测涨跌

对于「白天有正职」的金融 PM 来说,这种低带宽要求的策略是结构性匹配。

3. 即使「输」也是按计划接货

传统交易里「输」意味着账户缩水。Wheel 里「输」意味着「持股了一只你本来就想长期持有的股票,且接货成本比当时市价低(因为收过 premium)」。

这种心理框架对小账户极度重要——避免「亏损厌恶」导致的过早止损和过晚止盈。

3.2 资金量门槛对比

标的现价1 张 CSP 占款<$5k 可玩
SPY~$500$50,000
QQQ~$450$45,000
AAPL~$200$20,000
TSLA~$250$25,000
AMD~$150$15,000
F (Ford)~$10$1,000
SOFI~$10$1,000
PLTR~$22$2,200
NIO~$5$500
BAC~$40$4,000✓ (单张极限)
T (AT&T)~$23$2,300

<$5k 的标的池:必须现价 < $50(最好 < $25),否则单张 CSP 就把账户占满,无法分散。


四、<$5k 的 Wheel 标的怎么选

4.1 五条筛选规则

规则标准为什么
1. 你愿意长期持有不会因为短期跌 20% 而恐慌接货后睡得着觉
2. 流动性好日均成交量 > $100M,期权 bid-ask spread < 5%进得来出得去
3. IVR > 30Implied Volatility Rank > 30%premium 才有意义
4. 单价 < $50单张 CSP 占款 < $5000你能买得起
5. 大盘股或行业龙头市值 > $10B防 single-stock 暴雷

4.2 候选标的清单(2026 年视角,仅示例)

代码类型现价区间单张 CSP 占款备注
F汽车$10-12$1,000周期股,dividend ~5%
SOFI金融科技$8-12$1,000成长股,无 dividend,IV 高
PLTRAI 软件$20-30$2,200高 IV,premium 丰厚
T电信$22-25$2,300防御性,dividend ~7%
BAC银行$40-45$4,000大盘金融股,账户极限
NIOEV$4-6$500高风险,仅作分散用
HOOD券商$15-20$1,700高 beta,量化友好
NU拉美银行$10-12$1,100成长 + 价值兼具

4.3 组合配置示例($5,000 账户)

┌────────────────────────────────────────────────┐
│  $5,000 Wheel Portfolio                        │
├────────────────────────────────────────────────┤
│  F     ($1k) — 周期性、dividend 缓冲          │
│  SOFI  ($1k) — 成长 + 高 IV                    │
│  T     ($1.2k) — 防御 + dividend              │
│  HOOD  ($0.85k) — 高 beta(用半张 CSP 保证金) │
│  Cash  ($0.95k) — 应急 + 月底 roll 用          │
├────────────────────────────────────────────────┤
│  分散度: 4 个 sector(汽车/科技/电信/券商)    │
│  IV 暴露: 高 IV + 低 IV 混合                    │
│  Theta 月度: 估计 $50-80                       │
└────────────────────────────────────────────────┘

避免:所有 4 个标的都是科技股 / 都是中概股 / 都是同一个 ETF 成分。Single-sector event 会让你全部卡仓。


五、年化收益估算:数学模型

5.1 单轮 CSP 收益率公式

单轮收益率 = premium / (strike × 100)
年化       = 单轮收益率 × (365 / DTE)

举例:F 现价 $11,卖 30 DTE / Delta 0.30 / strike $10 CSP,premium $0.20。

单轮收益率 = 0.20 / 10 = 2.0%
年化       = 2.0% × (365/30) = 24.3%

5.2 完整 Wheel 年化(考虑 4 笔 premium)

理想情景(CSP 过期作废 → 再 CSP → ...):

  • 月度 2% × 12 = 24% 年化

中性情景(CSP 过期一半,被 assigned 一半 → 进入 CC → CC 过期作废 → 再 CC):

  • CSP 阶段 4 个月(2 个过期 + 2 个被 assigned)
  • CC 阶段 4 个月(卖出 covered call,再到期)
  • 8 笔 premium ≈ 12% × 1.5 倍杠杆 ≈ 18-25% 年化

悲观情景(连续被 assigned 后股价下跌 30%):

  • 收 4 笔 premium ≈ 8% 现金流
  • 股价下跌 30%
  • 净 mark-to-market -22%

5.3 年化收益的现实分布

情景概率年化收益备注
理想(全 OTM 过期)25%+25-30%持续牛市
中性(混合 assigned)50%+15-22%震荡市
一般(多次 assigned 但反弹)15%+5-10%弱势
悲观(标的暴跌且卡仓)8%-10 to -25%熊市
灾难(个股黑天鹅)2%-40% 以上rug-pull / 财务造假

期望值:约 15-20% 年化,远高于 SPY(~10%)+ T-Bill(~4%)的简单加权。但波动率也更高,max drawdown 可能达到 -40%(如果踩到 Stage 2 后标的继续暴跌且 CC 卖不出有意义的 premium)。


六、状态机代码:自动追踪和决策

6.1 设计思路

Wheel 本质是状态机,每个标的有一个独立状态。我们需要:

  1. 跟踪当前阶段(CSP / Holding / CC)
  2. 输入当前价格 + 期权链 + 现有持仓
  3. 输出「下一步动作」建议

6.2 wheel_state_machine.py 骨架

# wheel_state_machine.py
"""
Wheel strategy state machine.
Inputs: ticker, current position, option chain, target_delta, target_dte
Outputs: action recommendation (sell_csp / wait / sell_cc / called_away_reset)
"""
from dataclasses import dataclass
from enum import Enum
from datetime import datetime, timedelta
from typing import Optional


class WheelStage(Enum):
    CASH = "cash"                  # Stage 1: 现金,准备卖 CSP
    CSP_OPEN = "csp_open"          # 已卖出 CSP,等待到期
    HOLDING = "holding"            # Stage 2/3: 被 assigned 持股
    CC_OPEN = "cc_open"            # 已卖出 CC,等待到期
    CALLED_AWAY = "called_away"    # Stage 4: 刚被 called,准备回 Stage 1


@dataclass
class Position:
    ticker: str
    stage: WheelStage
    shares: int = 0                 # 持股数量(0 或 100 的整数倍)
    cost_basis: float = 0.0         # 持股成本(含扣除 premium)
    open_option_strike: Optional[float] = None
    open_option_expiry: Optional[datetime] = None
    open_option_type: Optional[str] = None  # 'PUT' / 'CALL'
    premiums_collected: float = 0.0  # 累计收到的 premium


@dataclass
class ActionRecommendation:
    action: str                    # 'SELL_CSP' / 'SELL_CC' / 'WAIT' / 'RESET'
    strike: Optional[float] = None
    expiry: Optional[datetime] = None
    expected_premium: Optional[float] = None
    rationale: str = ""


class WheelStateMachine:
    def __init__(self, target_delta: float = 0.30, target_dte: int = 35):
        self.target_delta = target_delta
        self.target_dte = target_dte

    def next_action(
        self,
        position: Position,
        current_price: float,
        option_chain: dict,  # {strike: {'delta': float, 'mid': float, 'expiry': dt}}
        now: datetime = None,
    ) -> ActionRecommendation:
        now = now or datetime.now()

        # Stage 1: cash, look for CSP
        if position.stage == WheelStage.CASH:
            target = self._find_strike(
                option_chain, side='PUT', target_delta=-self.target_delta
            )
            if target is None:
                return ActionRecommendation(
                    action='WAIT',
                    rationale='No suitable PUT strike found near target delta'
                )
            return ActionRecommendation(
                action='SELL_CSP',
                strike=target['strike'],
                expiry=target['expiry'],
                expected_premium=target['mid'],
                rationale=f'Sell {target["strike"]} PUT @ ~${target["mid"]:.2f}, '
                          f'delta {target["delta"]:.2f}'
            )

        # CSP open: monitor; close if 21 DTE rule
        if position.stage == WheelStage.CSP_OPEN:
            dte_left = (position.open_option_expiry - now).days
            if dte_left <= 21 and current_price > position.open_option_strike * 1.05:
                # 21 DTE rule + comfortably OTM → roll or wait
                return ActionRecommendation(
                    action='WAIT',
                    rationale=f'CSP {dte_left}d to expiry, well OTM, let it decay'
                )
            return ActionRecommendation(
                action='WAIT',
                rationale=f'CSP {dte_left}d to expiry, monitor'
            )

        # Holding shares: look for CC
        if position.stage == WheelStage.HOLDING:
            # CC strike must be ≥ cost basis to avoid locking in a loss
            min_strike = position.cost_basis
            target = self._find_strike(
                option_chain,
                side='CALL',
                target_delta=self.target_delta,
                min_strike=min_strike,
            )
            if target is None:
                return ActionRecommendation(
                    action='WAIT',
                    rationale=f'No CALL strike above cost basis ${min_strike:.2f}. '
                              f'Wait for price to recover.'
                )
            return ActionRecommendation(
                action='SELL_CC',
                strike=target['strike'],
                expiry=target['expiry'],
                expected_premium=target['mid'],
                rationale=f'Sell {target["strike"]} CALL @ ~${target["mid"]:.2f}'
            )

        # CC open: monitor
        if position.stage == WheelStage.CC_OPEN:
            dte_left = (position.open_option_expiry - now).days
            return ActionRecommendation(
                action='WAIT',
                rationale=f'CC {dte_left}d to expiry, monitor'
            )

        # Called away: reset to cash
        if position.stage == WheelStage.CALLED_AWAY:
            return ActionRecommendation(
                action='RESET',
                rationale='Position closed at call strike, return to CASH stage'
            )

    @staticmethod
    def _find_strike(
        option_chain: dict,
        side: str,
        target_delta: float,
        min_strike: float = 0.0,
    ) -> Optional[dict]:
        """Find the strike closest to target_delta meeting min_strike constraint."""
        candidates = [
            {'strike': k, **v} for k, v in option_chain.items()
            if v.get('type') == side and k >= min_strike
        ]
        if not candidates:
            return None
        candidates.sort(key=lambda x: abs(x['delta'] - target_delta))
        return candidates[0]

6.3 使用示例

sm = WheelStateMachine(target_delta=0.30, target_dte=35)

# 假设我们刚开账户,5k 现金,准备对 F 起手
pos = Position(ticker='F', stage=WheelStage.CASH)

# 从 ib_insync 拉到的期权链(简化)
chain = {
    9.5: {'type': 'PUT', 'delta': -0.20, 'mid': 0.10, 'expiry': datetime(2026, 7, 18)},
    10.0: {'type': 'PUT', 'delta': -0.30, 'mid': 0.20, 'expiry': datetime(2026, 7, 18)},
    10.5: {'type': 'PUT', 'delta': -0.42, 'mid': 0.32, 'expiry': datetime(2026, 7, 18)},
}

rec = sm.next_action(pos, current_price=11.0, option_chain=chain)
print(rec)
# ActionRecommendation(action='SELL_CSP', strike=10.0,
#   expected_premium=0.20,
#   rationale='Sell 10.0 PUT @ ~$0.20, delta -0.30')

6.4 完整闭环(生产版需要补的)

  • 连 IBKR 拉真实期权链(Day 22 已写过)
  • 持仓状态持久化(SQLite 或 JSON)
  • 自动下单(要先有 Read-Only 护栏,再去掉)
  • Roll 逻辑(21 DTE rule 触发时自动平仓 + 开新仓)
  • 通知(Telegram bot / 邮件)
  • 回测模式(喂历史数据验证)

Day 39 会用历史 CC 数据回测,Day 40 会写完整的端到端流程。


七、Wheel 的最大坑:价格断崖与卡仓

7.1 什么是「卡仓」(Stuck Position)

理想 Wheel 假设标的在 ±20% 范围内震荡。但现实中:

卡仓场景:
1. 卖 $10 strike CSP 收 $0.20
2. 财报暴雷,股价跌到 $6
3. 被 assigned @ $10,实际成本 $9.80(扣 premium)
4. 现在要卖 CC,但 $10 strike 的 call 已经几乎没人买(深 OTM)
5. 你只能卖 $7 strike CC,但 strike < cost basis $9.80
   → 如果被 called,锁定亏损
6. 你的选择:
   a) 卖深 OTM CC,premium 小(年化 1-2%),等回涨
   b) 卖近月 ATM CC 接受亏损
   c) 死等,不卖 CC(资金完全卡死)

这就是卡仓:资金被锁在一个亏损标的上,无法获得有意义的 premium,也不愿意止损。这是 Wheel 最大的失败模式

7.2 真实案例:META 2022

2022 年 Q4,META 从 $250 跌到 $90。任何在 $200 strike 卖 CSP 的人都被深度 ITM assigned,然后发现 $200 strike 的 CC premium 几乎为 0(深 OTM),$100 附近的 CC strike 又锁定 -50% 亏损。

最终:

  • 死等的人在 2023 年 META 涨回 $300 后解套(一年时间,年化机会成本巨大)
  • 接受 -30% 卖 CC 的人,至少把资金循环起来
  • 不动产的人最惨——既没接货也没卖 CC,纯粹被动持有

7.3 卡仓防御手册

防御操作效果
1. 分散5-10 个不同 sector 标的单个卡仓不致命
2. 避开高 single-stock risk不卖即将财报的标的 CSP避开断崖
3. 仓位上限单标的 < 20% 账户不被一个标的 KO
4. 21 DTE rule到期前 21 天就 roll降低被 assigned 概率
5. Roll Down + OutITM 被动时主动 roll 到更低 strike + 更远期给标的时间反弹
6. 接受止损跌超过 30% 直接卖股票认输资金重新循环比死扛好

7.4 「分散」具体怎么做

对 $5k 账户,理想是:

$5,000 / 5 个标的 = $1,000 each
→ 只能选单价 < $10 的标的
→ 候选: F / SOFI / NIO / NU / HOOD (1/2 张)

每月组合 premium 估计:
F:    $0.15 × 5 = $0.75 / 月
SOFI: $0.20 × 5 = $1.00 / 月(IV 更高)
NIO:  $0.10 × 5 = $0.50 / 月
NU:   $0.15 × 5 = $0.75 / 月
HOOD: $0.30 × 5 / 2 = $0.75 / 月(半张)
─────────────────────────────────────
合计: ~$3.75 / month × 100 = $375 / 月

但你只有 $5k 占用约 80% 保证金,所以这个数字有水分。
实际期望: $30-60 / 月,月度 ~0.6-1.2%

八、Greeks 视角解构 Wheel

理解 Wheel 必须看 Greeks,不然你不知道钱从哪来、险从哪来

8.1 收益来源(按贡献度)

Greek在 Wheel 中的角色贡献度
Theta时间衰减赚 premium —— 主要收益来源60-70%
DeltaCSP 期望涨(call price 跌 + 持股升值);CC 持股期望温和涨20-30%
VegaIV 下降时多头 vega 仓位 hurt,IV 上升时 helped0-10%(两难)
Gamma主要是风险,不是收益仅作风控用

8.2 风险来源(按危险度)

Greek风险机制触发场景
GammaATM 附近 delta 变化剧烈,被 assigned 速度加快标的快速跌穿 strike
VegaIV 从 20% 飙升到 80%(如财报前夜),你的 short put MTM 大幅亏损突发事件 / 财报
Delta标的暴跌,CSP 深 ITM,账面亏损巨大黑天鹅
Rho加息环境下 long put 贵,short put 收益略升(小利好)利率变化

8.3 关键 Greeks 数字

对一张 30 DTE / Delta 0.30 / 卖 PUT 的典型仓位:

Theta ≈ +$0.01-0.02 / 天 / 张 (单张 100 股的合约)
  → 月度 +$0.30-0.60 / 张

Delta ≈ -0.30 / 张
  → 标的涨 $1,你赚 $30 (CSP 价值跌)
  → 标的跌 $1,你亏 $30 (CSP 价值涨)

Gamma ≈ 0.05-0.10 / 张
  → 标的接近 strike 时 delta 加速变化
  → ATM 时 gamma 最大,"很容易翻车"

Vega ≈ +$0.02-0.04 / 张 / vol%
  → IV 涨 1%,你的 short put MTM 亏 $2-4 / 张

实战 takeaway

  1. 远离财报日卖 CSP(避免 Vega 爆炸)
  2. ATM 附近不要重仓(Gamma 风险高)
  3. Theta 是慢工,急不来——每天才 $0.01-0.02

九、PM 视角:Wheel 与「订阅型收入 + 库存承受能力」结构同构

回到金融 PM 的本职——Wheel 在产品设计上其实和我们做的「采购合同 / 月度订阅产品」是同一类生意

9.1 三个对照

维度零售 PM 设计的「月度采购合同」Wheel CSP
我承诺什么月底以约定单价买入 X 件库存月底以 strike 买入 100 股
对方付什么预付定金(合同保证金)premium
我赚什么即使对方不交货,定金归我即使 OTM 过期,premium 归我
我的风险即使市价低于约定价,我也要买即使股价低于 strike,我也要买
关键能力库存承受能力 + 现金占用持股承受能力 + 现金占用

9.2 三个迁移性洞察

1. 「我愿意接货」是合同的核心,不是 fine print

零售 PM 都知道:签了月度采购合同就要做好「即使最差情况也要接货」的准备。Wheel 是一样的——卖 CSP 的瞬间,你必须已经接受最坏情况。如果你的策略依赖「我相信它不会跌」,那这不是 Wheel,是赌博。

2. 现金流(premium)≠ 利润

零售合同的定金是风险补偿,不是利润。如果你接货后市价跌了,定金不能完全 cover 亏损。Wheel 也一样——年化 20% 的 premium 看起来诱人,但 max drawdown -40% 才是真实风险。

3. 库存承受能力决定规模

零售合同能签多大,取决于你的库存承受能力(仓库 / 现金 / 周转)。Wheel 能开多大仓位,取决于你的持股承受能力(账户 / 心理 / 不需要钱的时间长度)。

对 <$5k 账户的启示:你的「库存承受能力」非常有限,所以只能玩低价标的 + 多标的分散 + 严格不重仓。这跟一家小零售店「不能一次性进 1000 件库存」是一样的道理。


十、Day 38 实际执行 Checklist

  • (0) 读了一遍这篇笔记
  • (1) 候选标的清单:把 F / SOFI / T / HOOD / PLTR 等加到 watchlist
  • (2) 期权链探查:用 Day 22 的脚本拉这 5 个标的的 30 DTE 期权链
  • (3) IVR 检查:每个标的当前 IVR 是多少?> 30 才考虑
  • (4) 写 wheel_state_machine.py:把第 6 节代码骨架敲一遍
  • (5) Paper 测试 1:用 F 在 Paper 账户卖一张虚拟 CSP,观察 1 周
  • (6) Theta 跟踪表:开始记录每天的 premium MTM 变化
  • (7) 更新 TR_PROGRESS.md
  • (8) 记录踩坑:本笔记最后加「实际执行记录」段

十一、明日预告

Day 39: Covered Call 历史回测 — 用 5 年数据验证年化收益

  • 拉 SPY / F / AAPL 五年期权链历史数据
  • 模拟「每月卖 30 DTE / Delta 0.30 CC」的策略
  • 对比 buy-and-hold 的 Sharpe / max drawdown
  • 验证「CC 在牛市跑输,在震荡市跑赢」的传统认知
  • 量化「Theta 收益」vs「上涨被截顶」的取舍
  • cc_backtest.py:Day 38 代码的回测版

实际执行记录

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

  • [hh:mm] 候选标的清单 — ...
  • [hh:mm] 期权链探查(F) — ...
  • [hh:mm] 期权链探查(SOFI) — ...
  • [hh:mm] IVR 数据收集 — ...
  • [hh:mm] wheel_state_machine.py 跑通 — ...
  • [hh:mm] Paper 卖 F 虚拟 CSP — ...
  • 卡点 / 学到的:

总字数:约 7,200 字 今日完成度:理论 ✓ / 代码骨架 ✓ / 实操(你自己执行)/ 笔记 ✓