IBKR 期权操作 — Paper Trade 第一笔 CSP
Cash-Secured Put = 卖 1 张 put + 在账户里锁住「strike × 100」美金 cash,如果到期被 assigned,就用这笔锁定的 cash 以 strike 价格买入 100 股股票。
日期: 2026-05-29 方向: 期权 / 实操 阶段: Phase 1: 基础与工具链 标签: #CashSecuredPut #CSP #Wheel #IBKR #PaperTrade #FirstTrade #ib_insync
今日目标
| 类型 | 内容 |
|---|---|
| 学习 | CSP 的真实损益结构、为什么是新手首选、标的/strike/expiry 三件套选法、平仓决策、被 assigned 的应对 |
| 实操 | TWS 下单流程跑通 + ib_insync 代码版双轨 + Paper 卖出 1 张 F 30DTE 0.25 delta put |
| 产出 | TR-DAY20 笔记 + 可复用下单脚本 + 第一笔 CSP thesis 文档 + 监控 checklist |
一、CSP 到底是什么:把策略说清楚再下单
1.1 一句话定义
Cash-Secured Put = 卖 1 张 put + 在账户里锁住「strike × 100」美金 cash,如果到期被 assigned,就用这笔锁定的 cash 以 strike 价格买入 100 股股票。
注意三个关键词:
- 卖(不是买):你是义务方,收 premium
- Cash-Secured:你已经准备好接货的钱,不是 naked put
- 如果被 assigned:未必发生,但你必须 愿意 它发生
1.2 收益结构(用一张表把 CSP 讲死)
假设:F 现价 $10.50,卖 1 张 30DTE strike=$10 的 put,收 premium $0.40/股 = $40/张。锁定 cash = $10 × 100 = $1,000。
| 到期日 F 股价 | 期权状态 | Assigned? | 实际损益 | 注解 |
|---|---|---|---|---|
| $12.00 | OTM | ✗ | +$40(premium 全收) | 最理想 |
| $10.50 | OTM | ✗ | +$40 | 现状不变也赚 |
| $10.00 | ATM | 可能 | +$40 或接货 | 临界 |
| $9.60 | ITM | ✓ | $0(盈亏平衡) | premium 抵消跌幅 |
| $9.00 | ITM | ✓ | −$60(接货后浮亏) | 接货成本 $10 但市价 $9 |
| $5.00 | 深 ITM | ✓ | −$460(接货后大幅浮亏) | 极端情景 |
| $0.00 | 最大亏损 | ✓ | −$960(max loss) | 公司倒闭,理论上限 |
核心损益公式:
Max Profit = premium × 100 = $40
Max Loss = (strike × 100) − premium × 100 = $960
Breakeven = strike − premium = $10 − $0.40 = $9.60
1.3 CSP 的真实心理结构
它不是「赌股票会涨」,它是「赌股票不会暴跌」+ 顺便我愿意接货。
| 错误心智模型 | 正确心智模型 |
|---|---|
| 「我看涨 F,卖 put 收钱」 | 「F 在 $10 是我愿意买入的价位,没到我就收时间费」 |
| 「premium 才 $40,杠杆不够」 | 「max loss $960 是真实风险,必须 affordable」 |
| 「被 assigned 就完了」 | 「被 assigned 是计划内事件,进入 Wheel 第二段」 |
| 「股价跌就赶紧止损」 | 「跌到 strike 以下未触发亏损,只在 expiry 时 settle」 |
二、为什么 CSP 是新手最好的期权策略
2.1 四个维度对比新手能选的期权策略
| 维度 | Long Call | Long Put | Cash-Secured Put | Naked Put | Covered Call |
|---|---|---|---|---|---|
| 方向偏好 | 强看涨 | 强看跌 | 温和看涨/中性 | 温和看涨/中性 | 中性/温和看涨 |
| 最大损失 | premium(小) | premium(小) | strike×100(已锁定) | 理论上 strike×100(未锁定) | 机会成本 |
| 最大收益 | 无限 | strike−premium | premium(有限) | premium | premium + 涨幅 |
| Theta | 负(伤害你) | 负 | 正(帮你) | 正 | 正 |
| 心智成本 | 必须择时 | 必须择时 | 「愿意接货」简单 | 同 CSP | 已经有股票 |
| IBKR Level | 2 | 2 | 2 | 4(极难批) | 1 |
| 适合新手? | △ | △ | ✓✓ | ✗ | ✓ |
2.2 CSP 的四个新手友好特质
- 风险已知且封顶:max loss = strike × 100,开仓那一刻就是确定的,没有惊喜。
- Theta 帮你赚钱:你是期权 卖方,每过一天时间价值损耗到你口袋(其他条件不变)。
- 不需要精准择时:方向只要「不是暴跌」就行,IV 上升才是你的敌人,不是价格。
- 是 Wheel 策略的入口:CSP → 被 assigned → 卖 covered call → 被 called → 重新 CSP。整个循环都是定义清晰的现金流游戏。
2.3 为什么不从 long call/put 开始?
很多教程一上来教 long call,但对新手:
- long call 是 负 Theta:每天醒来都在亏(其他条件不变)
- 需要 双正确:方向对 + 时间对 + IV 不崩
- 心理上更接近赌博,建立不了「时间是朋友」的肌肉记忆
CSP 让你从「卖时间费」这个长期可持续的姿势开始。
三、CSP 三件套怎么选:标的 / Strike / Expiry
3.1 标的:四个硬性筛选条件
| 条件 | 标准 | 为什么 |
|---|---|---|
| 你愿意以 strike 长期持有 | 「如果接货我不慌」 | 这是 CSP 的灵魂 |
| 流动性 | Option Open Interest > 100,bid-ask spread < 5% | 避免成交困难和滑点 |
| 没有近期事件风险 | 30 天内无财报/重大法案/分红 | IV 异常 + 突发 gap 风险 |
| 价格 < $50(<$5k 账户) | strike × 100 ≤ 30% 账户净值 | 单笔不能 over-concentrate |
3.2 <$5k 账户的具体标的池
| 标的 | 现价区间 | 锁定 cash(strike ≈ ATM) | 注释 |
|---|---|---|---|
| F(Ford) | ~$10 | ~$1,000 | 老牌工业,OI 充足,slow grinder |
| SOFI | ~$10 | ~$1,000 | 金融科技,IV 偏高,premium 厚 |
| PLTR | ~$25-30 | ~$2,500-3,000 | 高 IV,premium 厚但 gap 风险大 |
| NIO | ~$5-7 | ~$500-700 | 中概,IV 极高,新手不建议 |
| INTC | ~$25 | ~$2,500 | turnaround 故事,财报风险 |
| BAC | ~$40 | ~$4,000 | 蓝筹,premium 薄但稳 |
首次操作建议:F 或 SOFI。两个都是 OI 大、单股价格低、premium 不算太薄、即便接货也是 100 股×$10=$1,000,对 $5k 账户是可控的。
3.3 Strike:Delta 0.20-0.30 这个甜区
| Delta | 含义(粗略) | 用途 | 被 assigned 概率 |
|---|---|---|---|
| 0.50 | ATM | 你强烈想接货 | ~50% |
| 0.30 | 微 OTM | 「我希望收 premium,也愿意接货」 | ~30% |
| 0.25 | OTM | 新手首选:风险收益均衡 | ~25% |
| 0.20 | OTM | 偏保守,premium 较薄 | ~20% |
| 0.10 | 深 OTM | premium 极薄,沦为「捡钢镚」 | ~10% |
经验法则:
- Delta ≈ assignment 概率(不是精确等价,但作为心智模型够用)
- 同时也是「在 expiry 时该 strike 处于 ITM 的概率」(粗略)
- 0.25 是 CSP 教科书甜区:1/4 概率接货,3/4 概率纯赚 premium
3.4 Expiry:30-45 DTE 的科学依据
期权时间价值(Theta)的衰减曲线不是线性:
DTE Theta 衰减比例
90 ▓░░░░░░░░░ 非常慢
60 ▓▓░░░░░░░░ 开始可观
45 ▓▓▓░░░░░░░ ★ 进入加速区
30 ▓▓▓▓▓░░░░░ ★★ 黄金区
21 ▓▓▓▓▓▓▓░░░ 加速衰减
14 ▓▓▓▓▓▓▓▓▓░ 最后冲刺
7 ▓▓▓▓▓▓▓▓▓▓ Gamma 风险陡升(小心)
0 全部归零
| DTE 区间 | 优点 | 缺点 |
|---|---|---|
| 7 天以内 | premium 占年化收益率最高 | Gamma 风险:股价小幅波动 → P&L 剧烈晃动;assignment 风险陡升 |
| 14-21 天 | 时间费收得快 | 一旦不利方向,回旋余地小 |
| 30-45 天 | Theta 衰减加速+回旋空间足 | 教科书甜区 |
| 60-90 天 | 不容易被 assigned | premium 年化偏低,资金效率差 |
对新手的最优解:30-45 DTE,让时间帮你赚钱,又留出 roll 或调整的余地。
3.5 综合下单模板(今天就用它)
Symbol: F
Type: Put
Expiry: 30-45 DTE 中最近的周五
Strike: 选择 Delta ≈ 0.25 的那档(比现价低约 5-8%)
Quantity: 1 张
Action: SELL TO OPEN
Order Type: LIMIT
Price: bid 与 ask 的中间价(Mid)
TIF: GTC(Good Till Cancel)
四、在 TWS / IBKR 的完整下单流程
4.1 调出期权交易界面
- 打开 Paper TWS(端口 7497)
- 务必确认窗口标题栏带「Paper Trading」字样(这是新手最容易翻车的地方:把 Live TWS 当成 Paper 用)
- 顶部菜单 → Trading Tools → OptionTrader(或快捷键 Ctrl+Alt+T)
- 输入 symbol:
F,回车 - 期权链自动加载,左侧 calls,右侧 puts
4.2 找到你的 strike
在期权链里:
- 顶部下拉切换 Expiry:选距今 30-45 天的那个 Friday
- 在 puts 列里找 Delta 约 0.25 的那行
- 该行的 strike 通常比现价低 5-8%(牛市/低 IV 期间 spread 收窄)
4.3 检查流动性的三件事
| 指标 | 阈值 | 在 TWS 哪里看 |
|---|---|---|
| Open Interest (OI) | > 100,建议 > 500 | 每行最右边的 OI 列 |
| Volume | > 50(当日) | OI 旁边的 Volume |
| Bid-Ask Spread | < $0.05 或 < 5% of mid | bid 和 ask 列 |
如果 spread 比 mid 还大(例如 bid=0.30 / ask=0.50),直接换标的或换 expiry——这种期权挂限价单几小时不成交是常态,挂市价单就是被宰。
4.4 下单
- 在选中行的 bid 列右键 → Sell(注意是 Sell,不是 Buy;新手最常见错误 #1)
- 弹出 Order Ticket:
- Action: SELL
- Quantity: 1
- Order Type: LMT(Limit)
- Limit Price: 改成 Mid(例 bid=0.38 / ask=0.42 → 填 0.40)
- TIF: GTC
- 点 Preview:
- 核对 Action(应该是 SELL TO OPEN)
- 核对合约(symbol / expiry / strike / right=PUT)
- 核对 Margin Impact(cash 账户应该是 strike × 100 = $1,000 被锁定)
- 核对 Commission(约 $0.65/张)
- 心算 sanity check(关键步骤):
- max loss = $10 × 100 − $40 = $960 ≤ 账户净值 30%?
- 我的账户 cash ≥ $1,000?
- 没问题再点 Transmit
4.5 限价单为什么挂 Mid?
| 挂法 | 成交概率 | 成交价质量 |
|---|---|---|
| 挂 ask | 高 | 你被「打到」,相当于让对手吃便宜 |
| 挂 mid | 中-高 | 公平价格,做市商有动机成交 |
| 挂 bid | 低 | 你想被「打到」,等运气 |
| 市价单 | 100% | 可能被宰 — 期权 spread 大时灾难 |
新手永远挂 Mid 限价单 + GTC。如果 30 分钟不成交,往 ask 方向调 $0.01-$0.02,再等 30 分钟。
五、ib_insync 代码版
5.1 完整下单脚本
# tr_day20_first_csp.py
from ib_insync import IB, Stock, Option, LimitOrder, util
from datetime import datetime, timedelta
util.startLoop() # remove in standalone
ib = IB()
ib.connect('127.0.0.1', 7497, clientId=20)
assert ib.client.port == 7497, "WRONG PORT — PAPER ONLY"
SYMBOL = 'F'
DRY_RUN = True # ★ 第一次跑务必 True
# === 1. 选合约 ===
stock = Stock(SYMBOL, 'SMART', 'USD')
ib.qualifyContracts(stock)
[ticker] = ib.reqTickers(stock)
spot = ticker.marketPrice()
print(f"{SYMBOL} spot: ${spot:.2f}")
# === 2. 找 30-45 DTE 的 expiry ===
chains = ib.reqSecDefOptParams(stock.symbol, '', stock.secType, stock.conId)
chain = next(c for c in chains if c.exchange == 'SMART')
today = datetime.now().date()
expiries = sorted(chain.expirations)
target_expiry = next(
e for e in expiries
if 30 <= (datetime.strptime(e, '%Y%m%d').date() - today).days <= 45
)
print(f"Selected expiry: {target_expiry}")
# === 3. 选 Delta ≈ 0.25 的 strike ===
# 粗略筛选:strike 比 spot 低 5-8%
candidate_strikes = sorted(
s for s in chain.strikes
if spot * 0.92 <= s <= spot * 0.97
)
# 把每个 candidate 做成 Option 合约,拿 greeks
puts = [
Option(SYMBOL, target_expiry, s, 'P', 'SMART', tradingClass=chain.tradingClass)
for s in candidate_strikes
]
ib.qualifyContracts(*puts)
tickers = ib.reqTickers(*puts)
# 找最接近 delta -0.25 的
target = min(
(t for t in tickers if t.modelGreeks),
key=lambda t: abs(abs(t.modelGreeks.delta) - 0.25)
)
contract = target.contract
mid = (target.bid + target.ask) / 2
print(f"Selected: {SYMBOL} {target_expiry} {contract.strike}P")
print(f" Bid={target.bid} Ask={target.ask} Mid={mid:.2f}")
print(f" Delta={target.modelGreeks.delta:.3f}")
print(f" IV={target.modelGreeks.impliedVol:.3f}")
# === 4. 风控 sanity check ===
max_loss = contract.strike * 100 - mid * 100
print(f" Max loss: ${max_loss:.0f}")
print(f" Max profit: ${mid * 100:.0f}")
print(f" Breakeven: ${contract.strike - mid:.2f}")
# === 5. 下单(DRY_RUN 守护)===
order = LimitOrder(
action='SELL',
totalQuantity=1,
lmtPrice=round(mid, 2),
tif='GTC',
)
if DRY_RUN:
print("=== DRY RUN — order NOT submitted ===")
print(order)
else:
trade = ib.placeOrder(contract, order)
print(f"Order submitted: {trade.order.orderId}")
# 监听状态变化
def on_status(trade):
print(f" Status: {trade.orderStatus.status} "
f"filled={trade.orderStatus.filled} "
f"avgPrice={trade.orderStatus.avgFillPrice}")
trade.statusEvent += on_status
ib.sleep(5)
ib.disconnect()
5.2 这段脚本的几个 PM 级设计
| 设计 | 为什么 |
|---|---|
DRY_RUN = True 默认开 | 默认安全:第一次跑只打印,不下单 |
assert port == 7497 | 端口护栏,避免误连 Live |
| 同时打印 max_loss / max_profit / BE | 强制人脑过一遍损益结构 |
用 modelGreeks.delta 选 strike | 不是人眼估,是机器选的可复现结果 |
statusEvent 监听 | 异步知道是否成交、是否被部分成交 |
六、被 Assigned 之后怎么办(不慌指南)
6.1 流程
expiry 周五收盘后 → 股价 < strike → ITM
↓
周末 OCC 自动 assign(小概率早行权但常见于股息日前夜)
↓
周一早盘账户里:
+ 100 股 F(成本基础 = strike)
− $1,000 cash(已被扣)
+ premium 已落袋(之前的 $40)
6.2 三种应对路径
| 路径 | 何时选 | 操作 |
|---|---|---|
| 持有 + 卖 CC | 不急用钱 + 长期看好 | 卖 30DTE delta ~0.25 的 covered call,进入 Wheel 第二段 |
| 直接卖出 | 改变 thesis 了 | 在二级市场卖掉,承认浮亏 |
| Roll(在到期前) | 不想被 assigned | Buy to close + Sell to open(更远 expiry / 更低 strike) |
6.3 ex-dividend date 的坑
如果在 expiry 前有股息日:
- 你卖的 put 可能被 早行权(早 assignment)
- 这种情况下你不仅没收到股息(assignment 在除息前),还可能错过 Theta 衰减
- 应对:开仓前检查 F 的 dividend calendar,如果 30 DTE 内有 ex-div,就避开或换标的
七、平仓时机:50% 规则与几种典型场景
7.1 50% Rule(教科书纪律)
当 premium 缩水到开仓时的 50% 时,主动 buy to close 平仓。
例:你开仓时收 $0.40 premium,现在该合约 mid 价 $0.20 → 平仓锁定 $20 利润。
为什么 50% 平仓比死扛到 expiry 好:
| 维度 | 50% 平仓 | 持有到 expiry |
|---|---|---|
| 实际利润 | $20 | $40(如果 OTM)/ 不确定(如果 ITM) |
| 剩余风险 | 0(仓位已平) | 仍有 gap / 黑天鹅风险 |
| 资金占用时间 | 平均缩短一半 | 全周期 |
| 年化资金回报率 | 更高 | 受拖累 |
核心洞察:CSP 的 Theta 衰减前半段最快,后半段相对慢但 Gamma 风险上升。50% rule 把「Sharpe 最高的那一段」榨干了就走。
7.2 决策树
当前 P&L 状态?
├── premium 缩到 ≤50% → ★ Buy to close,锁定
├── 临近到期 (<7 DTE) OTM
│ └── 继续持有,让它归零(节省 commission)
├── ITM 且接受接货
│ └── 持有到 expiry,准备 assignment
├── ITM 但不想接货
│ └── Roll:buy to close + sell 更远 expiry 更低 strike 的新 put
└── 黑天鹅大跌(股价已远低 BE)
└── 评估 thesis 是否破裂;破裂就割肉,没破裂就持有等接货
八、新手常踩的 9 个坑
| # | 坑 | 表现 | 防御 |
|---|---|---|---|
| 1 | Sell 误点成 Buy | 想收 premium 变成付 premium | 下单前 Preview 必看 Action |
| 2 | Strike 选错列 | 卖 call 当成卖 put | Right=PUT 务必双确认 |
| 3 | Expiry 选周期权 | 周末 IV crush 后被坑 | 优先 monthly(第三个周五) |
| 4 | 流动性差的合约 | 挂单一整天不成交 | OI < 100 直接换 |
| 5 | 算错保证金 | 以为只用 $40,其实锁 $1000 | 心算 strike × 100 |
| 6 | 没看 ex-dividend date | 被早 assigned | 开仓前查股息日历 |
| 7 | 没看财报日 | IV crush 后赚不到时间费 | 30 DTE 内避开 earnings |
| 8 | 心理崩溃 | 股价跌 5% 就割肉离场 | 写下「我愿意接货」声明 |
| 9 | 同时开太多 | $5k 账户开 3 张 CSP | 单笔 max loss ≤ 净值 30% |
九、今日 Paper Trading 完整执行计划
按这个清单一步步来。
- (0) 重读这篇笔记一遍,对每一条都心中有数
- (1) 确认 Paper TWS 开着,端口 7497,左上角标题栏带 "Paper Trading"
- (2) 选定标的:F 或 SOFI
- (3) 写下 thesis(在下面「执行记录」段):
- 「我选 ___ 因为 ______」
- 「我愿意以 strike $___ 接货 100 股,需要 $______」
- 「如果不接货,我赚 $;如果接货且跌到 $,我浮亏 $___」
- (4) TWS OptionTrader 调出期权链,选 30-45 DTE
- (5) 找 delta ≈ 0.25 的 put,记下 strike / bid / ask / OI / IV
- (6) 跑
tr_day20_first_csp.pywithDRY_RUN=True,对比脚本选的合约和你眼睛选的是否一致 - (7) 在 TWS 手动挂限价单:Sell to Open, 1 张, Mid 价, GTC
- (8) Preview → Sanity check(心算 max loss)→ Transmit
- (9) 在 Positions 窗口确认仓位已建立:put 仓位 -1(负数代表 short)
- (10) 记录到 trade journal(excel/notion 都可以):
- 标的 / expiry / strike / 卖出价 / Delta / IV / 时间戳 / thesis
- (11) 设置后续监控节奏:
- 每天收盘后看一眼 P&L
- 触发 50% rule 当晚就 close
- 临近 7 DTE 重新评估
- (12) 更新
docs/daily/TR_PROGRESS.mdWeek 3 / Day 20 标 ✅
十、PM 视角:CSP 思维的迁移性
10.1 卖时间费的结构在生活里到处是
| 场景 | 谁是「卖 put」的一方 | 收到的 premium | strike 是什么 |
|---|---|---|---|
| 给候选人 30 天 offer 考虑期 | 公司 | 候选人放弃机会期的「锁定价值」 | 现在的 comp 包 |
| 二手商品「7 天无理由退货」 | 卖家 | 略高的成交价 | 退款金额 |
| 房屋销售合同的定金(earnest money) | 卖家 | 定金 | 房价 |
| 长期供应合同的固定价 | 供应商 | 锁定订单 | 当前价格 |
共同结构:你给对方一个「在未来某个条件下以预定价格 X 完成交易」的可选权(option),换取一笔即时报酬(premium)。如果对方不行权,premium 是你的;如果对方行权,你被迫以 X 价完成交易——所以你必须是 X 价你也能接受的人。
10.2 这给 PM/招聘/产品的启示
- 永远不要 sell naked put(没准备好接货的 put):在你不愿意做的条件上承诺,就是 naked。
- strike 是 alignment 指标:你愿意以 X 完成交易 = 你和对方目标对齐。如果你心里害怕被 assigned,要么提高 strike,要么换标的。
- Theta 是友军,IV 是敌军:在产品里,让客户「越拖越想买」就是 Theta+(订阅模型 / 损失厌恶设计);「市场不确定性飙升」就是 IV+(你的承诺成本陡升)。
- 50% 规则是反人性纪律:赚了一半就走的人,比赚了 99% 时贪心被反杀的人,长期回报更高。这条在 OKR/项目验收/止盈策略上都成立。
10.3 一句话总结今天
CSP 不是赌方向,是用「我愿意承担确定后果」换「时间费这个稳定现金流」。这种姿势可以做一辈子,前提是 strike 永远是你能接受的位置。
十一、明日预告
Day 21: Week 3 复盘 — 期权基础全面体检 + 个人 Greeks 直觉测试
- 把 Week 3(Day 15-20)所学的 Delta/Gamma/Theta/Vega/Rho 串成一张完整图
- 自测:给你 5 个不同 IV/DTE/moneyness 的合约,能不能秒答 greeks 大致量级
- 把这周开的 paper CSP 仓位做一次「期权全维度」体检
- 准备 Week 4:Wheel 策略全流程(CSP → assignment → CC → call away → 回到 CSP)
实际执行记录
启动一项填一项,时间戳 + 卡点。
Thesis 声明(开仓前必填):
- 标的:________________
- 选它的理由(一句话):________________
- Expiry:__________ DTE:____
- Strike:$________ Delta:________
- 卖出 limit price:$________ Premium 收入:$________
- 锁定 cash:$________
- Max profit:$________ Max loss:$________ Breakeven:$________
- 「我确认我愿意以 strike 价格接货 100 股」:[ ] 是 [ ] 否
执行 timeline:
- [hh:mm] Paper TWS 启动 + 端口确认 — ...
- [hh:mm] 标的与期权链选定 — ...
- [hh:mm] DRY_RUN 脚本对照 — ...
- [hh:mm] TWS 限价单挂出 — ...
- [hh:mm] 订单成交 / 等待中 — ...
- [hh:mm] Trade journal 记录完成 — ...
踩的坑 / 学到的:
- ……
P&L 监控(每天一行):
| 日期 | 现价 | 期权 Mid | Delta | 未实现 P&L | 备注 |
|---|---|---|---|---|---|
总字数:约 6,800 字 今日完成度:理论 ✓ / 实操(你自己执行)/ 笔记 ✓