财报期 Iron Condor / Strangle 实操
Iron Condor 四腿结构 / Strangle vs IC 取舍 / Strike 选择逻辑 / DTE 框架
日期: 2026-06-27 方向: Phase 2 / 财报期权 阶段: Phase 2: 策略实战 + AI 信号 标签: #IronCondor #Strangle #EarningsPlay #IVCrush #ComboOrder #RiskDefined
今日目标
| 类型 | 内容 |
|---|---|
| 复习 | Day 48 IV crush 现象 + 财报前后 IV 曲线 |
| 学习 | Iron Condor 四腿结构 / Strangle vs IC 取舍 / Strike 选择逻辑 / DTE 框架 |
| 实操 | iron_condor_earnings.py 完整脚本(ib_insync combo order)+ 选股筛选器 |
| 产出 | TR-DAY49 笔记 + 本周 paper trade 2 个 IC 计划 + 风险护栏清单 |
一、复习 Day 48:IV crush 究竟在「Crush」什么
Day 48 我们把财报期 IV 行为画了一遍,今天动手交易之前必须把这条曲线刻进直觉里。
1.1 IV 在财报前后的典型路径
财报前 30 天 → IV 缓慢爬升(市场开始 price in 财报不确定性)
财报前 5 天 → IV 加速上升(短期合约尤甚,因为 expiry 横跨财报日)
财报前 1 天 → IV 见顶(IVR 经常打到 90+)
财报后开盘 → IV 在 15 分钟内塌缩 30-60%(即「IV crush」)
财报后 3 天 → IV 回到长期均值
关键认知:IV crush 不是「股价波动小」,而是 不确定性被消除 的瞬间。无论财报是 beat 还是 miss,事件已发生这件事本身就让期权卖方赚到时间价值。
1.2 为什么卖方在财报期占优
| 角度 | 财报前买方 | 财报前卖方 |
|---|---|---|
| 付出 | 高 premium(IV 溢价) | - |
| 收取 | - | 高 premium |
| 财报后即时损益 | IV 塌 → Vega 损失 | IV 塌 → Vega 收益 |
| 需要的条件 | 股价大幅突破 + 速度够快 | 股价待在区间内 |
| 长期期望 | 负 EV(高隐含波动率溢价) | 正 EV(约 +0.15R-+0.25R/单) |
Day 48 的结论:在 IVR > 50 的 ticker 上,财报前 2-3 天卖 premium、财报后 1 天平仓,是一个有正期望的统计套利。今天就把「卖什么」这一步用 Iron Condor 落地。
二、为什么必须是 Iron Condor 而不是 Strangle
2.1 两种结构对比
Naked Strangle(裸卖宽跨):
sell 1x OTM Put (e.g. 0.20 delta)
sell 1x OTM Call (e.g. 0.20 delta)
──────────────────────────────────
净收 premium = 高(无对冲)
max loss = 无限(上方)/ Strike-net credit(下方)
margin = 大(IBKR Reg-T 风险保证金可能 $5k-$15k 一单)
Iron Condor(带翼):
sell 1x OTM Put (0.20 delta) ← inner short
buy 1x further OTM Put (0.10 delta) ← outer wing
sell 1x OTM Call (0.20 delta) ← inner short
buy 1x further OTM Call (0.10 delta) ← outer wing
──────────────────────────────────
净收 premium = 比 strangle 少约 30%(买 wings 花掉一部分)
max loss = wing width - net credit (可定义、可承担)
margin = 仅 = max loss(Reg-T 友好)
2.2 Payoff 图示意
P/L
↑
│ ┌──────────────────┐
│ │ max profit │ ← 股价落在两 short strike 之间
│ │ = net credit │
│ │ │
─┼──────┴──────────────────┴──────→ 股价
│ / \
│ / \
│ / ↓ broken ↓ broken
│ /
│ ──── max loss = width - credit (Strike±width 之外被 wing 兜住)
│
put short put short call call
wing wing
2.3 <$5k 必须 Iron Condor 的硬约束
| 维度 | Naked Strangle | Iron Condor |
|---|---|---|
| Options Level 要求 | Level 4(IBKR 几乎不批小账户) | Level 3(Day 1 申请的目标) |
| Reg-T margin | 单边 ~20% notional | = max loss |
| 单笔可能亏损 | 可能 -100% 账户(黑天鹅) | 锁死在几百美金内 |
| 心理负担 | 财报夜睡不着 | 知道最坏多少 |
| 监管视角 | 经纪商会强制平仓 | 不会触发追保 |
结论:这一阶段 100% 选 Iron Condor,没有第二个选项。Naked Strangle 是大账户 + 长期数据 + 严格止损工程化之后才考虑的产品级杠杆——我们离那个阶段还有距离。
三、Strike 选择:把 0.20 / 0.10 Delta 说清楚
3.1 用 Delta 而非美元距离选 strike
| 选 strike 的方式 | 优点 | 缺点 |
|---|---|---|
| 固定 ±$5 距离 | 直观 | 不同股价 / IV 之下含义完全不同 |
| 固定 ±5% 距离 | 跨股可比 | 忽略了波动率结构 |
| 按 Delta 选 | 正确(Delta ≈ 被 touch 概率) | 需要期权链实时数据 |
记忆口诀:delta of short ≈ probability ITM at expiry。0.20 delta 的 short put 意味着「市场认为 20% 概率到 expiry 时跌破这个 strike」。
3.2 双层 strike 选择
Inner short strikes (sell)
→ 0.20 delta
→ 单侧 touch 概率 ~20%
→ 两侧都不被 touch 概率 ~60-65%(不是简单 80%×80%,因为有相关性)
Outer wings (buy, protective)
→ 0.10 delta
→ 距离 inner 约 1-2x 当前日 ATM straddle 价格
→ 把 tail risk 砍掉
3.3 Wing Width 怎么定
| 股价区间 | 推荐 wing width | 单 IC 净收 premium 量级 |
|---|---|---|
| $20-$50 (e.g. F, BAC) | $1 | $15-$40 |
| $50-$150 (e.g. AAPL, AMD) | $2.50 | $50-$120 |
| $150-$500 (e.g. NVDA, NFLX) | $5 | $120-$300 |
| $500+ (e.g. SPX, GOOG) | $10 | $250-$600 |
经验法则:net credit / wing width ≥ 1/3,否则 risk/reward 不划算(max loss 3x 你拿到的钱)。
四、DTE 框架:财报前 N 天进,财报后 1 天出
4.1 三种主流时间框架
| 框架 | 进场 | 平仓 | 适合 | 缺点 |
|---|---|---|---|---|
| Tight earnings | 财报前 1-2 天 | 财报后开盘后 30 分钟 | 纯吃 IV crush | 时间窗口短,错过就废 |
| Standard earnings | 财报前 2-3 天 | 财报后 1 天 EOD | 我们用这个 | 价格风险略多一晚 |
| 30 DTE wrap | 财报前 ~30 天 | 财报后约一周 | 同时吃 theta + IV | 承担前 25 天波动 |
4.2 为什么选 "Standard earnings"
- 财报前 2-3 天进:此时 IV 已经接近顶但还在爬,卖到接近最贵的价格
- 财报后 1 天出:IV 已 crush,但 gamma 风险还没完全释放(防止财报当天极端走势又回归)
- 多一晚等于多承担一晚价格风险,但避免了「财报当天开盘 gap 后挂单成交差」
4.3 时间线模板
T-3 下午: 跑筛选器 → 锁定 2-3 个候选 ticker
T-3 盘前: 检查 IVR 是否仍 > 50(最后一次确认)
T-2 盘中: 下 IC 单(combo order,limit 价格 = mid - $0.05)
T-2 盘后: 公司公布财报(如盘后型)
T-1 盘前: 不操作,让 IV crush 发生
T-1 开盘 30 分钟后: 平仓(拿走 60-80% max profit 即可,不要贪到 expiry)
五、iron_condor_earnings.py 完整脚本
下面是一份能跑、有护栏、有日志的版本。先看代码,下一节解释每段为什么这么写。
5.1 主脚本
"""
iron_condor_earnings.py
财报期 Iron Condor 自动下单 + 平仓
- 输入: ticker, earnings_date
- 自动选 0.20/0.10 delta strikes
- ib_insync combo order 一键 4-leg 下单
- 财报后自动平仓 (60% max profit OR T+1 EOD whichever first)
"""
from __future__ import annotations
import argparse, math, sys, time
from dataclasses import dataclass
from datetime import datetime, timedelta, date
from ib_insync import IB, Stock, Option, Contract, ComboLeg, Order, Trade, util
# ---------- 安全护栏 ----------
PAPER_PORT = 7497
MAX_LOSS_PCT_PER_TRADE = 0.02 # 单笔 max loss <= 2% 账户
MAX_OPEN_ICS_PER_WEEK = 3
ALLOWED_WING_WIDTHS = {"low": 1.0, "mid": 2.5, "high": 5.0, "mega": 10.0}
@dataclass
class ICStrikes:
short_put: float
long_put: float
short_call: float
long_call: float
expiry: str # YYYYMMDD
net_credit_target: float
wing_width: float
max_loss: float
# ---------- Delta-based strike picker ----------
def pick_strikes(ib: IB, ticker: str, expiry: str, wing_width: float) -> ICStrikes:
stk = Stock(ticker, 'SMART', 'USD')
ib.qualifyContracts(stk)
[ticker_data] = ib.reqTickers(stk)
spot = ticker_data.marketPrice()
if math.isnan(spot) or spot <= 0:
raise RuntimeError(f"{ticker}: bad spot {spot}")
# 拉期权链
chains = ib.reqSecDefOptParams(stk.symbol, '', stk.secType, stk.conId)
chain = next((c for c in chains if c.exchange == 'SMART'), None)
if chain is None:
raise RuntimeError(f"{ticker}: no SMART chain")
if expiry not in chain.expirations:
raise RuntimeError(f"{ticker}: expiry {expiry} not listed")
strikes = sorted(s for s in chain.strikes if 0.5*spot < s < 1.5*spot)
# 取一批 OTM puts / calls 查 greeks
puts = [Option(ticker, expiry, k, 'P', 'SMART') for k in strikes if k < spot]
calls = [Option(ticker, expiry, k, 'C', 'SMART') for k in strikes if k > spot]
ib.qualifyContracts(*puts, *calls)
def best_delta(contracts, target_delta):
tks = ib.reqTickers(*contracts)
best, best_diff = None, 1e9
for t in tks:
mg = t.modelGreeks
if mg is None or mg.delta is None: continue
diff = abs(abs(mg.delta) - target_delta)
if diff < best_diff:
best, best_diff = t.contract.strike, diff
return best
short_put = best_delta(puts, 0.20)
short_call = best_delta(calls, 0.20)
long_put = short_put - wing_width
long_call = short_call + wing_width
# 估 net credit (snapshot mid)
legs = [
Option(ticker, expiry, short_put, 'P', 'SMART'),
Option(ticker, expiry, long_put, 'P', 'SMART'),
Option(ticker, expiry, short_call,'C', 'SMART'),
Option(ticker, expiry, long_call, 'C', 'SMART'),
]
ib.qualifyContracts(*legs)
tks = ib.reqTickers(*legs)
mids = [(t.bid + t.ask)/2 if (t.bid > 0 and t.ask > 0) else float('nan') for t in tks]
sp, lp, sc, lc = mids
net_credit = (sp - lp) + (sc - lc) # sell short, buy wing
max_loss = wing_width - net_credit
return ICStrikes(short_put, long_put, short_call, long_call,
expiry, round(net_credit, 2), wing_width, round(max_loss, 2))
# ---------- Combo Order Builder ----------
def build_combo_order(ib: IB, ticker: str, picks: ICStrikes) -> tuple[Contract, Order]:
legs_def = [
(picks.short_put, 'P', 'SELL'),
(picks.long_put, 'P', 'BUY'),
(picks.short_call, 'C', 'SELL'),
(picks.long_call, 'C', 'BUY'),
]
leg_contracts = [Option(ticker, picks.expiry, k, r, 'SMART') for k, r, _ in legs_def]
ib.qualifyContracts(*leg_contracts)
combo = Contract(symbol=ticker, secType='BAG', exchange='SMART', currency='USD')
combo.comboLegs = []
for c, (_, _, side) in zip(leg_contracts, legs_def):
cl = ComboLeg()
cl.conId = c.conId
cl.ratio = 1
cl.action = side
cl.exchange = 'SMART'
combo.comboLegs.append(cl)
# 限价单 = 目标 net credit - $0.05 留滑点
limit_credit = max(picks.net_credit_target - 0.05, 0.05)
order = Order()
order.action = 'SELL' # 收 credit 用 SELL on combo (IBKR 约定)
order.orderType = 'LMT'
order.totalQuantity = 1
order.lmtPrice = limit_credit
order.tif = 'DAY'
order.transmit = True
return combo, order
# ---------- 平仓 ----------
def close_combo(ib: IB, combo: Contract, original_credit: float, take_profit_frac=0.6):
# 简化版:以 max_profit * (1 - 60%) 反向 BUY 平仓
target_debit = original_credit * (1 - take_profit_frac)
order = Order()
order.action = 'BUY'
order.orderType = 'LMT'
order.totalQuantity = 1
order.lmtPrice = round(target_debit, 2)
order.tif = 'GTC'
order.transmit = True
return ib.placeOrder(combo, order)
# ---------- main ----------
def main():
p = argparse.ArgumentParser()
p.add_argument('--ticker', required=True)
p.add_argument('--earnings-date', required=True, help='YYYY-MM-DD')
p.add_argument('--wing', choices=ALLOWED_WING_WIDTHS.keys(), default='mid')
p.add_argument('--account-size', type=float, required=True)
args = p.parse_args()
ib = IB()
ib.connect('127.0.0.1', PAPER_PORT, clientId=49)
assert ib.client.port == PAPER_PORT, "REFUSE: not paper port"
earnings = datetime.strptime(args.earnings_date, '%Y-%m-%d').date()
# 选 earnings 后第一个周五的 expiry
target_expiry = (earnings + timedelta(days=(4 - earnings.weekday()) % 7 + 7)).strftime('%Y%m%d')
width = ALLOWED_WING_WIDTHS[args.wing]
picks = pick_strikes(ib, args.ticker, target_expiry, width)
# 护栏 1: max loss 不能超过账户 2%
max_loss_dollar = picks.max_loss * 100
if max_loss_dollar > args.account_size * MAX_LOSS_PCT_PER_TRADE:
print(f"REFUSE: max loss ${max_loss_dollar:.0f} > 2% of ${args.account_size}")
sys.exit(1)
# 护栏 2: net credit / wing width >= 1/3
if picks.net_credit_target / picks.wing_width < 1/3:
print(f"REFUSE: credit/width = {picks.net_credit_target/picks.wing_width:.2f} < 0.33")
sys.exit(1)
print(f"== {args.ticker} IC ==")
print(f" Short Put {picks.short_put} / Long Put {picks.long_put}")
print(f" Short Call {picks.short_call} / Long Call {picks.long_call}")
print(f" Expiry {picks.expiry} Net Credit ${picks.net_credit_target} Max Loss ${picks.max_loss}")
combo, order = build_combo_order(ib, args.ticker, picks)
trade = ib.placeOrder(combo, order)
print(f" Combo order placed, status={trade.orderStatus.status}")
ib.sleep(5)
print(f" After 5s status={trade.orderStatus.status} filled={trade.orderStatus.filled}")
ib.disconnect()
if __name__ == '__main__':
main()
5.2 ib_insync combo order 关键点解析
| 代码段 | 为什么这么写 |
|---|---|
Contract(secType='BAG') | BAG 是 IBKR 对「组合订单」的合约类型,必须用这个而不是单个 Option |
每个 ComboLeg.conId | 必须用 qualifyContracts 拿到的真实 conId,不能填股票 ID |
action='SELL' on combo | 因为净收 credit。IBKR 把 IC 视作「卖出一个 combo」 |
order.lmtPrice = credit - 0.05 | 给市场 $0.05 滑点空间,财报前 spread 容易宽 |
order.transmit = True | 不写默认 False,单子会卡在 TWS 等手动确认 |
clientId=49 | 跟 Day 编号绑定,方便日志区分不同策略的连接 |
5.3 平仓逻辑的工程化扩展(生产版需要的)
1. 监听 fillEvent:成交后立刻挂 GTC close order (target debit)
2. 定时任务(cron 每分钟):
- 检查 underlying 是否触及 short strike → 提前平仓
- 检查时间是否到 T+1 EOD → 市价平仓(无论盈亏)
3. 风控护栏:
- 持仓期间 Net Delta > 100 → 加 hedge
- VIX 突破 30 → 减仓所有 IC
4. 日志:
- 每 leg 的 fill price / commission
- 每小时 mark-to-market
今天的脚本只覆盖了「开仓 + 简单挂平仓单」,剩下的 cron + alert 留到 Day 50-52 的策略框架里统一做。
六、选股筛选器:哪些 ticker 适合卖 IC
6.1 必要条件清单
| 条件 | 阈值 | 数据源 |
|---|---|---|
| IVR (IV Rank) | > 50 | tastytrade / barchart / IBKR Market Scanner |
| 有期权链 | weekly options 标的 | CBOE 列表 |
| 流动性:OI per leg | > 100 | option chain |
| 流动性:bid-ask spread | < $0.05 或 < 2% mid | 实时数据 |
| 历史 IV crush 幅度 | > 30%(过去 4 季) | 自己回测 |
| 财报日期 | 未来 5-10 天内 | Nasdaq / Yahoo Earnings Calendar |
6.2 必避清单
- 小盘股(市值 < $2B):单笔订单就可能影响价格,spread 经常 $0.20+
- 高 beta 监管敏感股(DJT、生物医药 binary 事件、中概监管股):财报反应可能 50%+
- 诉讼 / SEC 调查中的公司:财报当天可能 trigger 公告,IV crush 不会发生
- 指数基金 / SPY:财报概念不适用
- IPO 首份财报:缺少历史 IV crush 数据,base rate 未知
6.3 工程化筛选 SQL(概念)
-- 假设你有自己的 earnings + iv 数据库
SELECT ticker, market_cap, iv_rank, next_earnings_date,
avg_iv_crush_pct, avg_option_oi, avg_bid_ask_spread
FROM earnings_universe
WHERE next_earnings_date BETWEEN current_date + 2 AND current_date + 10
AND iv_rank > 50
AND market_cap > 2e9
AND avg_option_oi > 100
AND avg_bid_ask_spread < 0.05
AND avg_iv_crush_pct > 0.30
AND ticker NOT IN (SELECT ticker FROM blacklist)
ORDER BY iv_rank DESC
LIMIT 10;
七、风险管理:把不可控变成可控
7.1 仓位级护栏
| 护栏 | 阈值 | 触发动作 |
|---|---|---|
| 单笔 max loss | < 2% 账户 | 脚本直接 reject |
| 一周 open IC 数量 | <= 3 个不同 ticker | 第 4 个不开 |
| 持仓期间 Net Delta | < 100(每 $1 underlying 移动 = $100 P/L) | 加 stock hedge |
| 累计 Net Vega | < 200 | 大盘 IV 飙升时减仓 |
7.2 事件级护栏
不在以下周开 IC:
- FOMC + 财报同周(Macro vol overlap)
- 期权到期周(OPEX,gamma 集中)
- 美国大选 / G7 峰会前后
- 公司即将公告 M&A / 拆分
- 自己刚亏完 2 单 IC(心态护栏)
7.3 心态护栏(最被忽略但最重要)
| 情境 | 错误反应 | 正确反应 |
|---|---|---|
| 财报后 short strike 被 touch | 临时反手买 stock 对冲 | 让 wing 兜住,按计划平仓 |
| IV 反而升了 | 加仓「成本均摊」 | 接受 paper loss,等下一财报季 |
| 连续赢 5 单 | 加 size | 维持 size,让样本量积累 |
| 连续亏 2 单 | 加 size 找回 | 暂停一周,重审筛选条件 |
八、预期回测结果与 R 单位
8.1 关键指标定义
1R = max loss per trade = wing_width - net_credit
预期 = +0.15R 到 +0.25R per trade
赢的时候 = 拿走 60-80% net_credit ≈ +0.4R 到 +0.5R
输的时候 = max loss 或部分止损 ≈ -0.7R 到 -1.0R
胜率 65-75% (源自双 0.20 delta short 的统计概率)
例: 65% × +0.45R + 35% × -0.85R = +0.293R - 0.298R ≈ -0.005R
70% × +0.45R + 30% × -0.85R = +0.315R - 0.255R = +0.060R
75% × +0.45R + 25% × -0.85R = +0.338R - 0.213R = +0.125R
残酷的真相:胜率从 70% 滑到 65% 就从盈利滑到盈亏平衡。这就是为什么选股 + IV filter 是策略的灵魂。
8.2 Sharpe 预期
单笔 R 期望 +0.15R (保守)
单 IC max loss = 2% 账户
单笔 expected return = 2% × 0.15 = 0.30% 账户
一周 3 单 → 0.9% / 周
一年 30 个财报季 / 12 个月 × 3-5 单 ≈ 100-150 单
年化 expected = 100 × 0.30% = 30%(不复利)/ 35-40%(复利)
波动率: 月度波动约 6-8%
Sharpe ≈ (30% - 5%) / 25% ≈ 1.0 - 1.5
注意:这是独立于市场 beta 的 Sharpe,跟 SPY 相关性接近 0(卖中性 vol)。这种 alpha 跟动量 / 因子等 beta-driven 策略是天然组合,能拉高整体 portfolio Sharpe。
九、本周 Paper Trade 计划
9.1 候选 ticker(示例,实操时按当周财报日历替换)
| Ticker | 财报日 | 当前 IVR | 历史 IV crush | 流动性 | 决策 |
|---|---|---|---|---|---|
| NFLX | 2026-07-15 盘后 | 78 | 42% | 顶级 | ✅ 候选 1 |
| AMD | 2026-07-14 盘后 | 64 | 35% | 顶级 | ✅ 候选 2 |
| TSLA | 2026-07-16 盘后 | 82 | 38% | 顶级 | ⏸ 备选(vol 太高,wing 估值难) |
| NVDA | 2026-07-22 盘后 | 71 | 33% | 顶级 | ❌ 超出本周窗口 |
9.2 操作清单
□ 7/13 (周一) 下午: 跑选股 SQL,确认 NFLX / AMD 仍满足 IVR > 50
□ 7/13 (周一) 盘后: 跑 iron_condor_earnings.py --ticker NFLX --earnings 2026-07-15 --wing high --account 5000
跑 iron_condor_earnings.py --ticker AMD --earnings 2026-07-14 --wing mid --account 5000
□ 7/14 (周二) 盘中: AMD 财报盘后
□ 7/15 (周三) 开盘 30 分钟后: 平仓 AMD IC,记录 actual P/L
□ 7/15 (周三) 盘中: NFLX 财报盘后
□ 7/16 (周四) 开盘 30 分钟后: 平仓 NFLX IC,记录 actual P/L
□ 7/16 (周四) 晚: 复盘 actual vs expected (filled credit / IV crush 实际幅度 / 是否被 touch)
9.3 复盘模板
## [Ticker] IC 复盘
Entry:
- Date / Time:
- Short Put / Long Put / Short Call / Long Call:
- Net credit filled:
- Spread per leg at fill:
Earnings result:
- Beat or miss EPS / Revenue:
- After-hours move:
Exit:
- Date / Time:
- Net debit to close:
- P/L $ / R:
- Time held:
Expected vs Actual:
- IV crush %: expected ~35% / actual ___%
- IC max profit captured: __ %
- Was any short strike touched?
Lesson:
- 1 关键教训:
十、PM 视角:Iron Condor 与保险公司 underwriting
10.1 商业模型同构
| 维度 | 保险公司 | Iron Condor 卖方 |
|---|---|---|
| 收入 | 保费(事先收) | net credit(事先收) |
| 支付 | claim(事件触发) | max loss(股价突破) |
| 概率 | 大多数保单不出险 | 大多数 IC 不被 touch |
| 关键能力 | 精算 + 拒保「劣质」客户 | IVR 筛选 + 拒卖「劣质」财报 |
| 黑天鹅 | 9/11 / 飓风 | 财报黑天鹅(监管 / 欺诈) |
| 护城河 | 再保险 + 资本充足 | wing protection + 仓位限制 |
这个类比对 PM 的迁移性:
-
「卖保险」业务的本质是承担尾部风险换稳定现金流。设计任何「保证 / 兜底 / SLA 赔付」的产品时(金融产品 / SaaS uptime SLA / 退货保险),都要预估 base rate × payoff 是否仍有正期望。
-
拒卖比卖更重要。保险公司的核心能力是 underwriting filter,不是 marketing 漏斗。我们的 IVR filter / blacklist / 财报筛选就是 underwriting filter。
-
资本管理决定生死。卖一万单 IC,70% 赢,30% 输 - 1R——但如果某次单笔 size 是平时的 5 倍,单次黑天鹅可以击穿账户。这就是为什么 max loss < 2% 是硬约束。
-
承保周期 vs 赔付周期错配是杀手。保险卖出去的保费是即时的,赔付可能 N 年后;同理 IC 的 credit 是 T-2 入账,但 max loss 在 T+1 才结算。不要在 credit 进账时就算盈利——这是普通散户卖期权最常见的认知错误。
10.2 对当前职业路径的 hint
如果你的下家是 保险科技 / 金融对冲产品 / 信贷风控 类,IC 是非常好的「自己亲手做过承保业务」案例。面试时可以用「我自己卖了一个季度的 IC,胜率 ___%,单笔 max loss ___%,我的 underwriting filter 是 ___」来回答「你怎么理解 underwriting 业务」。这比任何理论回答都有信号。
十一、明日预告
Day 50: LLM + XGBoost 混合信号 — 文本特征如何接入数值模型
预告主题:
- 用 GPT/Claude 提取财报电话会议 transcript 的情绪特征(sentiment / forward guidance / management tone)
- 把 LLM 输出作为 XGBoost 模型的额外输入列
- 数值特征(PE / RSI / 7d return)vs 文本特征 的 feature importance 对比
- 怎么避免 LLM "look-ahead bias"(不能用财报后才知道的信息预测财报)
- 完整代码:
llm_xgb_pipeline.py,端到端从 transcript 拉取到模型预测 - 怎么把 Day 49 的 IC 选股和 Day 50 的 LLM 信号结合(只在 LLM 预测中性 / 低 surprise 的 ticker 上开 IC)
实际执行记录
启动一项填一项,时间戳 + 卡点。
- [hh:mm] 跑 IVR 筛选器,锁定 2 个候选 ticker — ...
- [hh:mm] paper 账户验证 options Level 3 已批 — ...
- [hh:mm]
iron_condor_earnings.py在 paper 跑通(先 dry-run 不下单) — ... - [hh:mm] 第 1 个 IC paper 下单成交 — ticker: ___ / credit: ___ / max loss: ___
- [hh:mm] 第 2 个 IC paper 下单成交 — ticker: ___ / credit: ___ / max loss: ___
- [hh:mm] 财报后 T+1 平仓第 1 单 — actual P/L: ___ R
- [hh:mm] 财报后 T+1 平仓第 2 单 — actual P/L: ___ R
- 卡点 / 学到的:
- IV crush 实际 % vs 预期 35%:
- 单笔最大 unrealized drawdown:
- 是否有任何 short strike 被 touch:
总字数:约 7,200 字 今日完成度:理论 ✓ / 代码骨架 ✓ / paper trade(本周内执行)/ 笔记 ✓