返回交易笔记
TR Day 20

IBKR 期权操作 — Paper Trade 第一笔 CSP

Cash-Secured Put = 卖 1 张 put + 在账户里锁住「strike × 100」美金 cash,如果到期被 assigned,就用这笔锁定的 cash 以 strike 价格买入 100 股股票。

2026-05-29
Phase 1: 基础与工具链
CashSecuredPutCSPWheelIBKRPaperTradeFirstTradeib_insync

日期: 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.00OTM+$40(premium 全收)最理想
$10.50OTM+$40现状不变也赚
$10.00ATM可能+$40 或接货临界
$9.60ITM$0(盈亏平衡)premium 抵消跌幅
$9.00ITM−$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 CallLong PutCash-Secured PutNaked PutCovered Call
方向偏好强看涨强看跌温和看涨/中性温和看涨/中性中性/温和看涨
最大损失premium(小)premium(小)strike×100(已锁定)理论上 strike×100(未锁定)机会成本
最大收益无限strike−premiumpremium(有限)premiumpremium + 涨幅
Theta(伤害你)(帮你)
心智成本必须择时必须择时「愿意接货」简单同 CSP已经有股票
IBKR Level2224(极难批)1
适合新手?✓✓

2.2 CSP 的四个新手友好特质

  1. 风险已知且封顶:max loss = strike × 100,开仓那一刻就是确定的,没有惊喜。
  2. Theta 帮你赚钱:你是期权 卖方,每过一天时间价值损耗到你口袋(其他条件不变)。
  3. 不需要精准择时:方向只要「不是暴跌」就行,IV 上升才是你的敌人,不是价格。
  4. 是 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,500turnaround 故事,财报风险
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.50ATM你强烈想接货~50%
0.30微 OTM「我希望收 premium,也愿意接货」~30%
0.25OTM新手首选:风险收益均衡~25%
0.20OTM偏保守,premium 较薄~20%
0.10深 OTMpremium 极薄,沦为「捡钢镚」~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 天不容易被 assignedpremium 年化偏低,资金效率差

对新手的最优解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 调出期权交易界面

  1. 打开 Paper TWS(端口 7497)
  2. 务必确认窗口标题栏带「Paper Trading」字样(这是新手最容易翻车的地方:把 Live TWS 当成 Paper 用)
  3. 顶部菜单 → Trading ToolsOptionTrader(或快捷键 Ctrl+Alt+T)
  4. 输入 symbol:F,回车
  5. 期权链自动加载,左侧 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 midbid 和 ask 列

如果 spread 比 mid 还大(例如 bid=0.30 / ask=0.50),直接换标的或换 expiry——这种期权挂限价单几小时不成交是常态,挂市价单就是被宰。

4.4 下单

  1. 在选中行的 bid 列右键 → Sell(注意是 Sell,不是 Buy;新手最常见错误 #1)
  2. 弹出 Order Ticket:
    • Action: SELL
    • Quantity: 1
    • Order Type: LMT(Limit)
    • Limit Price: 改成 Mid(例 bid=0.38 / ask=0.42 → 填 0.40)
    • TIF: GTC
  3. Preview
    • 核对 Action(应该是 SELL TO OPEN)
    • 核对合约(symbol / expiry / strike / right=PUT)
    • 核对 Margin Impact(cash 账户应该是 strike × 100 = $1,000 被锁定)
    • 核对 Commission(约 $0.65/张)
  4. 心算 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(在到期前)不想被 assignedBuy 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 个坑

#表现防御
1Sell 误点成 Buy想收 premium 变成付 premium下单前 Preview 必看 Action
2Strike 选错列卖 call 当成卖 putRight=PUT 务必双确认
3Expiry 选周期权周末 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.py with DRY_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.md Week 3 / Day 20 标 ✅

十、PM 视角:CSP 思维的迁移性

10.1 卖时间费的结构在生活里到处是

场景谁是「卖 put」的一方收到的 premiumstrike 是什么
给候选人 30 天 offer 考虑期公司候选人放弃机会期的「锁定价值」现在的 comp 包
二手商品「7 天无理由退货」卖家略高的成交价退款金额
房屋销售合同的定金(earnest money)卖家定金房价
长期供应合同的固定价供应商锁定订单当前价格

共同结构:你给对方一个「在未来某个条件下以预定价格 X 完成交易」的可选权(option),换取一笔即时报酬(premium)。如果对方不行权,premium 是你的;如果对方行权,你被迫以 X 价完成交易——所以你必须是 X 价你也能接受的人。

10.2 这给 PM/招聘/产品的启示

  1. 永远不要 sell naked put(没准备好接货的 put):在你不愿意做的条件上承诺,就是 naked。
  2. strike 是 alignment 指标:你愿意以 X 完成交易 = 你和对方目标对齐。如果你心里害怕被 assigned,要么提高 strike,要么换标的。
  3. Theta 是友军,IV 是敌军:在产品里,让客户「越拖越想买」就是 Theta+(订阅模型 / 损失厌恶设计);「市场不确定性飙升」就是 IV+(你的承诺成本陡升)。
  4. 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 监控(每天一行)

日期现价期权 MidDelta未实现 P&L备注

总字数:约 6,800 字 今日完成度:理论 ✓ / 实操(你自己执行)/ 笔记 ✓