关于 ib-pmcc-advisor
用于分析 Interactive Brokers 账户中 PMCC 对角看涨价差的技能。它评估短腿被指派风险和每日盈亏预测,并依据 Delta 与净收入条件对移仓候选方案排序。
主要功能
- 01分析各账户的 PMCC 持仓
- 02估算短腿被指派概率
- 03预测每日盈亏
- 04排列移仓候选方案
- 05标记临近短腿到期的财报
适用场景
- 01检查 PMCC 价差的被指派风险
- 02比较持有短腿与移仓方案
- 03查看到期日前的财报警示
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ staskh/ trading_skills --skill ib-pmcc-advisor安装后在 Claude Code 中输入/ib-pmcc-advisor确认已加载。
附带文件scripts/pmcc_advisor.pytemplates/markdown-template.md
详细介绍
IB PMCC 顾问
分析 IB 投资组合中的所有 PMCC(对角看涨期权价差)持仓,并针对空头腿提供可执行的建议:被指派风险、每日盈亏预测和排名靠前的展期建议。
IB 连接
TWS 或 IB Gateway 必须在本地运行并启用 API:
- 模拟交易 — 端口 7497
- 实盘交易 — 端口 7496
IB_PORT环境变量 — 未指定--port时使用的默认端口(例如,Gateway 容器使用IB_PORT=4001)。优先级:--port标志 >IB_PORT> 内置默认值。在 shell 或.env文件中设置。
端口回退: 如果配置的端口连接失败,则自动重试另一个端口。 如果重试成功,将可用的账户类型(实盘/模拟)保存到记忆中,并在本次及后续会话中用于所有 IB 技能调用,直到用户明确要求切换到另一种账户。 如果两个端口都连接失败,请让用户确认 TWS 或 IB Gateway 正在运行且已启用 API 访问。
说明
第 1 步:运行脚本
uv run python .claude/skills/ib-pmcc-advisor/scripts/pmcc_advisor.py [--port PORT] [--account ACCOUNT] [--min-roll-dte N] [--price-mode mid|last]
脚本会将 JSON 输出到 stdout。解析后用于以下回复。
第 2 步:默认回复——简短的行内摘要
除非用户明确要求报告或 JSON 输出,否则只回复简洁的行内摘要。不保存文件。
格式:
- 每个价差一行:
SYMBOL — short $STRIKE exp DATE (δ=X, assign=Y%) — [HOLD / ROLL to $STRIKE] - 优先列出风险提示(被指派概率 > 40%、DTE < 7、空头腿到期窗口内有财报)。
- 对有风险提示的价差,额外添加一行,列出最优展期候选及净权利金收入。
- 对无风险提示的持仓,只需一行摘要。
第 3 步:仅在明确要求时生成文件
MD 报告 — 触发短语:“保存报告”“生成报告”“撰写报告”“markdown”“PDF”。
阅读 .claude/skills/ib-pmcc-advisor/templates/markdown-template.md,了解完整格式说明。
保存到 sandbox/pmcc_advisor_{ACCOUNT}_{YYYY-MM-DD}_{HHmm}.md。使用第一个账户 ID;时间戳取自 generated_at。
报告必须包含每个价差的所有章节:
- 风险提示摘要 — 被指派概率 > 40%、DTE < 7、无展期候选、财报预警
- 公司简介 — 始终根据自身知识撰写一句话
- 技术概况 — RSI、MACD、EMA 交叉、ADX、与 SMA 的距离、3 个月回报率、看涨评分(仅当对话上下文中包含技术数据时;否则省略)
- 价差结构表 — 两条腿:行权价、到期日、DTE、成本、当前价格、IV
- 空头腿风险 — delta(BS + IB)、被指派概率及风险标签
- 每日盈亏预测 — 所有行:日期、距离到期天数、最佳平仓价、最大盈亏(标记峰值行)
- 展期候选表 — 行权价、到期日、DTE、delta、被指派概率、IV、净权利金收入、$/天、若被指派时的盈亏、买卖价
- 对比表 — 当前持仓与 roll_1/2/3 并列比较
- 建议 — 持有/展期/平仓及理由
JSON 输出 — 触发短语:“保存 JSON”“导出 JSON”“保存数据”“输出文件”。
将脚本原始输出保存到 sandbox/pmcc_advisor_{ACCOUNT}_{YYYY-MM-DD}_{HHmm}.json。
参数
| 标志 | 默认值 | 说明 |
|---|---|---|
--port | 7497 | IB Gateway/TWS 端口 |
--account | all | 指定账户 ID |
--min-roll-dte | 7 | 展期候选的最小 DTE |
--price-mode | mid | 期权价格:mid(bid+ask)/2 或 last |
--symbols | all | 仅分析这些标的(例如 --symbols NVDA WMT) |
JSON 输出结构
{
"generated_at": "2026-04-30 10:25 ET",
"data_delay": "real-time",
"accounts": ["Uxxxxxxxx"],
"price_mode": "mid",
"min_roll_dte": 7,
"symbols_filter": ["NVDA", "WMT"],
"spreads": [
{
"symbol": "NVDA",
"account": "Uxxxxxxxx",
"qty": 10,
"underlying_price": 201.46,
"leaps_expiry": "20260918",
"earnings": {
"date": "2026-05-20",
"timing": "AMC",
"warning_short": false,
"warning_roll_indices": [1, 2, 3]
},
"long": {
"strike": 180.0, "expiry": "20260918", "dte": 141,
"avg_cost": 35.51, "current_price": 36.20,
"iv_pct": 42.1, "ib_delta": 0.7821, "ib_iv_pct": 41.8
},
"short": {
"strike": 210.0, "expiry": "20260618", "dte": 49,
"premium_received": 6.88, "current_price": 5.10,
"iv_pct": 38.5, "delta": 0.3421, "assignment_prob_pct": 28.4,
"ib_delta": 0.3415, "ib_iv_pct": 38.2
},
"daily_pnl": [
{"date": "2026-04-30", "days_to_short_expiry": 49.0, "optimal_spot": 215.20, "pnl": 1234.56},
{"date": "2026-05-01", "days_to_short_expiry": 48.0, "optimal_spot": 214.80, "pnl": 1289.10}
],
"roll_candidates": [
{
"strike": 215.0, "expiry": "20260717", "dte": 78,
"price": 5.80, "delta": 0.2910, "assignment_prob": 22.5,
"iv_pct": 37.2, "net_credit": 0.70, "profit_per_day": 0.0744,
"pnl_if_assigned": 3580.0, "bid": 5.60, "ask": 6.00
}
],
"comparison": {
"current": {"strike": 210, "expiry": "20260618", "dte": 49, "delta": 0.3421, "assignment_prob": 28.4, "profit_per_day": 0.1404, "pnl_if_assigned": 1880.0},
"roll_1": {"strike": 215, "expiry": "20260717", "dte": 78, "delta": 0.2910, "assignment_prob": 22.5, "profit_per_day": 0.0744, "pnl_if_assigned": 3580.0}
}
}
]
}
关键字段
symbols_filter— 使用了--symbols时的全大写股票代码列表;null表示整个投资组合data_delay— 有实时行情时为"real-time";IBKR 行情不可用时为"stalled - using last price"generated_at— 纽约时区的时间戳leaps_expiry— 长腿的到期日(YYYYMMDD);所有展期候选项的到期日均不晚于此日期earnings.date— Yahoo Finance 提供的下一次财报日期(YYYY-MM-DD);ETF 为 nullearnings.timing—"BMO"(开盘前)或"AMC"(收盘后)earnings.warning_short— 若财报日期落在空头到期日前最后 7 个日历日内,则为 trueearnings.warning_roll_indices— 到期窗口包含财报日期的展期候选项索引(从 1 开始)delta/ib_delta— BS 计算值与 IBKR 模型希腊值(有数据时均会报告)iv_pct/ib_iv_pct— IV 百分比;分别为根据期权价格通过 BS 计算的值与 IBKR 模型希腊值assignment_prob_pct— N(d2):空头期权到期时处于价内的风险中性概率net_credit— 展期时收到的权利金(负值 = 借记);借记超过 $0.10/股的展期将被排除pnl_if_assigned— 若标的到期时高于short_strike,则为盈亏:(short_strike - long_strike - long_cost + total_premium) × 100daily_pnl[].optimal_spot— 当天使平仓盈亏最大的现货价格(通过数值优化求得);随着 theta 衰减空头腿,其价格会升高daily_pnl[].pnl— 当天最优现货价格下的总金额(数量 × 100 份合约)
展期筛选标准
候选项必须同时满足以下条件:
- Delta ≤ 0.40(绝对上限——当当前空头临近到期时,允许以相同执行价向后展期)
- 净权利金 ≥ -$0.10/股(不能有大额借记)
扫描当前空头到期日之后、LEAPS 到期日之前的下 5 个可用期权链到期日。
按以下顺序排序:Delta 改善幅度(权重最高)→ 净权利金 → DTE 延长幅度。
用法示例
# All accounts (paper, default)
uv run python .claude/skills/ib-pmcc-advisor/scripts/pmcc_advisor.py
# Live account, 14-day minimum roll DTE, last-price mode
uv run python .claude/skills/ib-pmcc-advisor/scripts/pmcc_advisor.py --port 7496 --account Uxxxxxxxx --min-roll-dte 14 --price-mode last
# Analyze only specific symbols
uv run python .claude/skills/ib-pmcc-advisor/scripts/pmcc_advisor.py --symbols NVDA WMT
架构
所有逻辑均位于 src/trading_skills/broker/pmcc_advisor.py:
- 分析函数(上半部分,不导入 IBKR):
get_option_price、calc_iv、calc_delta、calc_assignment_prob、calc_bs_price、calc_daily_pnl_table、check_earnings_warning、find_best_rolls、build_comparison_table、score_roll_candidate - 数据层(下半部分,使用 IBKR + Yahoo Finance):
get_pmcc_data、_identify_pmcc_spreads、_fetch_single_option_quote、_fetch_option_quotes_batch、_get_chain_params、_fetch_earnings_dates
复用自 src/trading_skills/broker/:
connection.py—ib_connection、CLIENT_IDS、fetch_positions、fetch_spot_prices、normalize_positions、best_option_chainblack_scholes.py—implied_volatility、black_scholes_price、black_scholes_delta、estimate_iv