NRA Wheel Strategy
期权卖方策略
完整方法论
覆盖从标的筛选、每日合格清单、单标手册生成、实时扫单推荐,到持仓全生命周期管理的五阶段闭环系统。适用于 IBKR Portfolio Margin 账户,目标资金规模 $500K–$2M。
阶段 1
规则制定
全市场通用筛选规则
config.json + choose.html
→
阶段 2
每日筛选
wheel_screener.py
产出今日合格清单
→
阶段 3
单标手册
AI 生成 meta.html
+ ticker-params.yaml
→
阶段 4
扫单推荐
openclaw_scan.py
输出具体合约建议
→
阶段 5
持仓管理
position_monitor.py
止盈 / Roll / 熔断
系统定位
本系统是辅助决策系统,不是全自动执行系统。阶段 4 产出的是建议,操作者在 IBKR TWS 中完成二次确认后手动下单。这是 NRA 合规与风控的硬性要求——EV 修正、滑点判断、异常市场识别等环节,当前 AI 可靠性不足以支撑全自动执行。
数据流向
| 来源阶段 | 产出物 | 消费阶段 | 格式 |
| 阶段1 |
全市场通用规则 |
阶段2、阶段4 |
config.json |
| 阶段2 |
今日合格标的清单 |
阶段4(入场门票) |
eligible_YYYYMMDD.json |
| 阶段3 |
单标结构化参数 |
阶段4 |
ticker-params.yaml |
| IBKR 实时 |
期权链、IV、账户保证金 |
阶段4 |
TWS API / REST |
| 阶段4 |
具体合约推荐 |
人工确认 → IBKR |
signal_YYYYMMDD.json |
| IBKR 持仓 |
实时持仓状态 |
阶段5 |
position_snapshot.json |
| 阶段5 |
提醒事件 / Roll 建议 |
人工处理 |
alert_YYYYMMDD.txt |
原则 1 · 资金安全第一
永不孤注
单一标的名义敞口上限受阶段1全局配置约束,任何单标手册不得突破此上限。账户层面保留 ≥20% 保证金缓冲,不得满仓裸卖。
原则 2 · 单标更严原则
越往下越严
阶段3单标参数只能比阶段1全局规则更严,不能放宽。这是系统防止单标手册逃逸全局风控的硬性约束。
原则 3 · 文档与配置同步
版本号强绑定
任何规则变更必须同时更新对应文档(HTML)和机器可读配置(JSON/YAML),版本号不一致视为系统故障,CI 应报错拦截。
原则 4 · 人工确认节点
推荐 ≠ 执行
阶段4产出建议,阶段5产出提醒。所有实际下单、Roll、平仓操作均需操作者在 IBKR TWS 二次确认,禁止任何绕过人工的全自动执行路径。
原则 5 · 今日合格门票制
每日动态准入
静态 Watchlist 是季度资产,每日合格清单才是动态入场门票。一个标的不在今日合格清单内,阶段4绝不为其产出推荐,无论单标手册质量如何。
原则 6 · 全生命周期覆盖
开仓只是开始
方法论必须覆盖开仓后的止盈、Roll、熔断处理、月度复盘全周期。只管开仓不管持仓,在大资金多标的并发场景下必然出现漏单。
阶段1是整个系统的宪法级文件。它定义了对所有标的普遍适用的市场准入门槛、VIX 仓位矩阵、Delta 上限、保证金约束。任何单标规则不得违背此层级约束。
1.1 市场准入门槛(Pre-screen Gate)
| 指标 | 最低要求 | 备注 |
| 流动性 | 期权日均成交量 ≥ 500 张,买卖价差 ≤ 0.05×标的价格 | 防止滑点过大侵蚀 EV |
| IV Rank | IVR ≥ 20(卖出窗口),IVR ≥ 30 为优选 | 低 IVR 卖权溢价不足 |
| 财报窗口 | 距下次财报 ≥ 10 个交易日 | 持仓不得跨越财报 |
| 标的价格 | ≥ $20(标准合约) | 低价股波动不可预测 |
| 市值 | ≥ $5B(除 ETF 外) | 防流动性风险 |
| 合规 | 非 OTC、非 PFIC、无未了结监管调查 | NRA 合规要求 |
1.2 VIX 仓位矩阵
| VIX 区间 | 市场状态 | A 级标的 | B 级标的 | C 级标的 | 总名义敞口上限 |
| < 18 | 正常 |
全仓可用 | 全仓可用 | 可用,需审批 |
≤ 80% NAV |
| 18 – 28 | 温和波动 |
全仓可用 | 减仓 30% | 暂停新仓 |
≤ 65% NAV |
| 28 – 35 | 高波动 |
减仓 20% | 禁止裸卖,仅 Spread | 全面暂停 |
≤ 50% NAV |
| > 35 | 危机 |
禁止新仓,仅管理存量 | 禁止新仓 | 禁止新仓 |
≤ 30% NAV |
VIX 区间冲突处理规则
如果阶段1说"VIX > 28 时 B 级标的禁止裸卖",而某个单标手册说"VIX > 35 时才全面暂停",28–35 区间由阶段1全局规则主导:B 级标的禁止裸卖,只允许 Spread。单标手册的 VIX 阈值只能比全局更严,不能更宽。
1.3 通用 Delta 上限矩阵
| 标的级别 | IVR Low (<30) | IVR Mid (30–60) | IVR High (>60) |
| A 级(低波动) | 0.10 – 0.15 | 0.12 – 0.18 | 0.15 – 0.20 |
| B 级(中波动) | 0.08 – 0.12 | 0.10 – 0.15 | 0.12 – 0.18 |
| C 级(高波动) | 0.06 – 0.10 | 0.08 – 0.12 | 仅 Spread |
1.4 全局保证金约束
- R-01账户总保证金占用不得超过 NAV 的 70%(PM 账户)。
- R-02单一标的名义敞口不得超过账户 NAV 的 20%。
- R-03相关性高的板块(如 NVDA/AMD/SMCI)合并计算名义敞口,上限 30% NAV。
- R-04任何时刻保证金缓冲(Excess Liquidity)不得低于 NAV 的 20%。
- R-05FOMC 会议当日及前一日,禁止开新仓(高不确定性窗口)。
1.5 config.json 顶部结构示例
config.json
// 全局配置 — 与 choose.html v3.0.0 严格同步
{
"_README": {
"method_version": "v3.0.0", // 必须与 choose.html 版本号一致
"last_updated": "2026-04-19",
"effective_date": "2026-04-19",
"reviewer": "quarterly"
},
"vix_tiers": {
"normal": { "max": 18, "max_nav_exposure": 0.80 },
"elevated": { "min": 18, "max": 28, "max_nav_exposure": 0.65 },
"high": { "min": 28, "max": 35, "max_nav_exposure": 0.50 },
"crisis": { "min": 35, "max_nav_exposure": 0.30, "no_new_positions": true }
},
"margin": {
"max_utilization": 0.70,
"min_buffer": 0.20,
"single_ticker_cap": 0.20,
"sector_cluster_cap": 0.30
},
"blackout": {
"earnings_days_before": 10,
"fomc_blackout": true
}
}
重要概念澄清
静态 Watchlist(季度资产)≠ 每日合格清单(动态门票)
Watchlist 是经过季度审阅选入的 118 个候选标的库,是长期资产。每日合格清单是 wheel_screener.py 每天跑完后产出的"今天哪些标的符合入场条件"的动态快照。同一个标的今天可能因 VIX 过高、财报临近或 IV 过低而被踢出合格清单,明天又重新进入。阶段4只处理今日合格清单中的标的。
2.1 静态 Watchlist 管理
纳入标准(季度审阅)
- 市值 ≥ $5B,期权流动性 ≥ 500 张/日
- 历史 IVR 均值 ≥ 25(过去 252 个交易日)
- 业务模式可理解,AI 能生成合格单标手册
- NRA 合规审查通过(无 PFIC 风险)
- 与现有持仓相关性审查(避免过度集中)
移除标准(随时移除)
- 流动性连续 5 日低于门槛
- 监管调查或重大治理事件
- 退市风险 / 并购谈判公告
- 市值跌破 $2B
- 季度审阅不通过(每季度末执行)
2.2 wheel_screener.py 执行逻辑
wheel_screener.py · 伪代码
def run_screener(watchlist, config, market_data):
eligible = []
current_vix = market_data["VIX"]
vix_tier = get_vix_tier(current_vix, config)
if vix_tier == "crisis":
log("VIX CRISIS — 所有标的暂停,仅处理存量")
return [] # 直接返回空清单
for ticker in watchlist:
# Gate 1: 财报黑名单
if days_to_earnings(ticker) < config["blackout"]["earnings_days_before"]:
continue
# Gate 2: FOMC 黑名单
if config["blackout"]["fomc_blackout"] and is_fomc_window():
continue
# Gate 3: IVR 最低门槛
ivr = market_data[ticker]["iv_rank"]
if ivr < config["min_ivr"]:
continue
# Gate 4: VIX 层级与标的级别的兼容性
grade = ticker_params[ticker]["grade"]
if not vix_grade_compatible(vix_tier, grade, config):
continue
# Gate 5: 账户保证金容量检查
if not margin_capacity_available(ticker, ticker_params, account):
continue
eligible.append({
"ticker": ticker,
"ivr": ivr,
"grade": grade,
"vix_tier": vix_tier,
"scan_ts": now_iso()
})
save_eligible_list(eligible) # → eligible_YYYYMMDD.json
return eligible
2.3 合格清单输出格式
eligible_20260419.json
{
"date": "2026-04-19",
"vix": 21.3,
"vix_tier": "elevated",
"screener_version": "v3.0.0",
"eligible_count": 14,
"eligible": [
{ "ticker": "META", "ivr": 48, "grade": "A", "notes": "优选" },
{ "ticker": "GOOGL", "ivr": 35, "grade": "A", "notes": "" },
{ "ticker": "NVDA", "ivr": 61, "grade": "B", "notes": "VIX elevated,仅Spread" }
],
"excluded_count": 104,
"exclusion_reasons": {
"earnings_blackout": 18,
"ivr_too_low": 43,
"vix_grade_incompatible": 29,
"margin_full": 14
}
}
阶段3为每个纳入 Watchlist 的标的生成两个配套文件:一份供人阅读的 HTML 手册(meta.html),以及一份机器可读的 YAML 参数文件(ticker-params.yaml)。两者必须保持严格同步,且单标参数只能比全局配置更严。
关键约束:HTML 手册必须有对应 YAML 文件
如果某标的只有 meta.html 没有对应的 ticker-params.yaml,阶段4将无法消费该标的的策略参数,该标的即使出现在今日合格清单中也不会产出推荐。这是系统完整性的硬性要求。
3.1 meta.html 标准章节结构(12章)
| # | 章节名称 | 核心内容 |
| 01 | 标的概况 | 市值、Beta、业务描述、标的级别(A/B/C) |
| 02 | 历史波动特征 | 历史单日最大跌幅、财报后波动幅度统计、异常事件案例 |
| 03 | IV 特征分析 | IVR 历史均值、财报前后 IV 行为、期限结构特征 |
| 04 | Delta 矩阵 | 各 VIX 层级下的推荐 Delta 区间(比全局更严) |
| 05 | DTE 策略 | 推荐 DTE 区间(裸卖 / Spread 分开说明) |
| 06 | 行权价扩展系数 | 左尾肥尾修正系数(ev_correction) |
| 07 | 价差宽度参数 | Bull Put Spread 的宽度(按 IVR 层级分段) |
| 08 | 止盈止损规则 | 50% 止盈 GTC、最大亏损比例、时间止损 |
| 09 | Roll 规则 | Credit Roll vs Debit Roll 触发条件、底线 |
| 10 | 三级熔断机制 | L1/L2/L3 触发阈值与对应操作 |
| 11 | 25% 下跌切换机制 | 正股下跌 25% 后从裸卖切换至 Spread 的执行规则 |
| 12 | 财报与黑名单 | 财报前封闭期天数、FOMC 处理方式、特殊事件清单 |
3.2 ticker-params.yaml 标准格式
ticker-params.yaml · META 示例
META:
# ── 元数据 ──
version: "3.0.2"
effective_date: "2026-04-19"
method_version: "v3.0.0" # 必须与 config.json 一致
grade: "A" # A=低波动, B=中波动, C=高波动
sector: "Tech"
cluster: "Meta-Platforms" # 用于板块集中度检查
# ── Delta 矩阵(只能比全局更严)──
delta_matrix:
vix_normal:
ivr_low: [0.10, 0.15]
ivr_mid: [0.12, 0.17]
ivr_high: [0.14, 0.20]
vix_elevated:
ivr_low: [0.08, 0.12]
ivr_mid: [0.10, 0.15]
ivr_high: [0.12, 0.17]
vix_high: # B 级下全局要求 Spread;A 级此处减仓
mode: "spread_only"
# ── 行权价修正 ──
ev_correction: 1.20 # 左尾肥尾系数;1.0=不修正
fat_tail_note: "历史单日最大跌幅 -26%,标准模型低估左尾"
# ── 价差宽度 ──
spread_width_pct:
ivr_low: [0.015, 0.020]
ivr_mid: [0.020, 0.035]
ivr_high: [0.035, 0.050]
# ── DTE 策略 ──
dte:
naked_put: { min: 21, max: 45, target: 30 }
spread: { min: 14, max: 45, target: 25 }
# ── 止盈止损 ──
exit:
profit_target_pct: 0.50 # 50% 止盈,设 GTC 单
max_loss_pct: 2.00 # 最大亏损=权利金的 2 倍
time_stop_dte: 5 # DTE ≤ 5 且亏损则强制平仓
# ── Roll 规则 ──
roll:
credit_roll_trigger: "Delta > 0.40 且 DTE > 14"
debit_roll_trigger: "正股跌破行权价 3% 且 DTE > 7"
roll_floor_strike: "不得低于初始行权价 × 0.85"
# ── 三级熔断 ──
circuit_breaker:
L1: { trigger: "标的单日跌 8%", action: "暂停新仓,评估 Roll" }
L2: { trigger: "标的单日跌 15%", action: "启动 Spread 对冲,上报" }
L3: { trigger: "标的单日跌 25%", action: "强制平仓,退出标的" }
# ── 黑名单 ──
blackout:
earnings_days: 10 # 同全局,不放宽
fomc_blackout: false # META 不受 FOMC 特别影响
# ── 切换机制 ──
mode_switch:
trigger: "正股累计下跌 25%"
from: "naked_put"
to: "bull_put_spread"
notes: "切换后等待 5 日再评估是否恢复"
3.3 AI 生成单标手册的 Prompt 规范
AI 生成工作流
生成单标手册时,Prompt 中必须明确传入:(1) 全局 config.json 的约束边界;(2) 要求 YAML 输出中所有 Delta 值不得高于全局允许值;(3) 要求输出版本号字段并与 method_version 绑定。生成后执行 validate_params(global_config, ticker_params) 校验通过才允许写入 ticker-params.yaml。
3.4 参数校验函数规范
validate_params.py
def validate_params(global_config, ticker_params):
errors = []
for ticker, params in ticker_params.items():
# 校验1:method_version 必须一致
if params["method_version"] != global_config["_README"]["method_version"]:
errors.append(f"{ticker}: method_version 不匹配")
# 校验2:Delta 上限不得超过全局
global_delta_max = get_global_delta_max(params["grade"], global_config)
for vix_tier, ivr_deltas in params["delta_matrix"].items():
if isinstance(ivr_deltas, dict) and "ivr_high" in ivr_deltas:
local_max = ivr_deltas["ivr_high"][1]
if local_max > global_delta_max:
errors.append(f"{ticker}/{vix_tier}: Delta {local_max} 超出全局上限 {global_delta_max}")
# 校验3:单标名义敞口不得超过全局 single_ticker_cap
# ... 更多校验规则 ...
if errors:
raise ValueError("\n".join(errors))
return True
4.1 输入三要素
输入 1
今日合格清单
来自阶段2的 eligible_YYYYMMDD.json。不在此清单内的标的,本脚本直接跳过,不产出任何推荐。
输入 2
单标结构化参数
来自阶段3的 ticker-params.yaml。提供该标的的 Delta 矩阵、DTE 策略、spread 宽度等操作参数。
输入 3
实时期权链
通过 IBKR TWS API 或 REST 拉取。包含各行权价的 Delta、IV、买卖价差、成交量、持仓量。
4.2 扫单核心逻辑
openclaw_scan.py · 核心逻辑
def scan_ticker(ticker, eligible_info, params, option_chain, account):
# Step 1: 确定当前 VIX 层级下的 Delta 目标区间
vix_tier = eligible_info["vix_tier"]
ivr = eligible_info["ivr"]
ivr_bucket = get_ivr_bucket(ivr) # low / mid / high
delta_range = params["delta_matrix"][vix_tier][ivr_bucket]
# Step 2: 确定模式(裸卖 or Spread)
mode = determine_mode(vix_tier, params["grade"], account)
# Step 3: 筛选符合 Delta 区间的行权价
candidates = [
opt for opt in option_chain["puts"]
if delta_range[0] <= abs(opt["delta"]) <= delta_range[1]
and params["dte"][mode]["min"] <= opt["dte"] <= params["dte"][mode]["max"]
and opt["volume"] >= 50 # 基础流动性门槛
]
# Step 4: EV 修正计算(含左尾肥尾系数)
for opt in candidates:
opt["ev_raw"] = calc_ev(opt)
opt["ev_adj"] = opt["ev_raw"] / params["ev_correction"]
opt["spread_ok"] = opt["ask"] - opt["bid"] <= opt["mid"] * 0.10
# Step 5: 按修正 EV 降序排列,返回 top-3
ranked = sorted(
[o for o in candidates if o["spread_ok"] and o["ev_adj"] > 0],
key=lambda x: x["ev_adj"], reverse=True
)[:3]
return { "ticker": ticker, "mode": mode, "candidates": ranked }
4.3 推荐输出格式(signal.json)
signal_20260419.json · 单标推荐示例
{
"ticker": "META",
"scan_ts": "2026-04-19T09:17:32Z",
"mode": "naked_put",
"vix_tier": "elevated",
"ivr": 48,
"recommendations": [
{
"rank": 1,
"expiry": "2026-05-16",
"strike": 540,
"dte": 27,
"delta": -0.135,
"mid_price": 4.85,
"ev_raw": 0.62,
"ev_adj": 0.52,
"margin_req": 12800,
"annualized_return": 0.148,
"profit_target_price": 2.43, // 50% 止盈价,用于设 GTC
"notes": "优选;流动性好;EV修正后仍为正"
}
],
"execution_required": "人工在 IBKR TWS 确认后手动下单"
}
禁止全自动执行
阶段4的输出文件是推荐,不是指令。严禁任何自动将 signal.json 转化为 IBKR TWS 自动下单的脚本或接口。操作者必须逐一审阅推荐内容,核实价格合理性、确认保证金充裕后,手动在 TWS 中下单。
4.4 执行前人工核查清单
- 确认今日 VIX 与 signal.json 中 vix_tier 一致
- 确认行权价的实时买卖价差在合理范围(≤10% mid)
- 确认账户当前 Excess Liquidity 下单后仍 ≥ 20% NAV
- 确认该标的本月已持仓数量不超过单标上限
- 检查是否有突发新闻或重大公告(财报外的)
- 对照 meta.html 确认没有遗漏的特殊黑名单事件
- 下单后立即在 TWS 设置 50% 止盈 GTC 限价单
阶段5是系统中最容易被忽视但最关键的环节。开仓只完成了 20% 的工作,剩下 80% 在持仓管理中。在多标的并发持仓(10+个标的)的情况下,纯人工监控必然出现漏单,position_monitor.py 是防漏的最后一道网。
5.1 每日监控项目
| 监控事件 | 触发条件 | 建议操作 | 优先级 |
| 止盈触达 |
期权市价 ≤ 开仓价 × 50% |
确认 GTC 成交 / 手动平仓 |
High |
| Delta 漂移 |
|Delta| > 单标手册上限 |
评估是否 Roll 或调仓 |
Mid |
| L1 熔断 |
标的单日跌幅 ≥ 8% |
暂停新仓,评估 Roll |
Critical |
| L2 熔断 |
标的单日跌幅 ≥ 15% |
启动 Spread 对冲,上报 |
Critical |
| L3 熔断 |
标的单日跌幅 ≥ 25% |
强制平仓,退出标的 |
Critical |
| 25% 累计下跌 |
正股较开仓时累计跌 ≥ 25% |
切换至 Spread 模式 |
Critical |
| DTE 时间止损 |
DTE ≤ 5 且仍亏损 |
强制平仓 |
High |
| 财报临近警告 |
距下次财报 ≤ 12 日 |
提前评估平仓或滚动 |
Mid |
| VIX 层级变化 |
VIX 跨越 18/28/35 阈值 |
重新评估所有持仓合规性 |
High |
| 保证金缓冲告警 |
Excess Liquidity < 25% NAV |
主动减仓,防止爆仓 |
Critical |
5.2 Roll 决策树
Credit Roll(优先选项)
向前滚动,净收权利金
触发条件:Delta > 上限阈值 且 DTE > 14
操作:平掉近月,卖出远月更低行权价,确保净 Credit ≥ $0.10
底线:新行权价不得低于初始行权价 × 0.85
Debit Roll(防守选项)
跌破行权价,支付权利金滚动
触发条件:正股跌破行权价 3% 且 DTE > 7
操作:平掉亏损头寸,支付小额 Debit 换取更多时间
底线:累计 Debit 不超过原始权利金 × 1.5,否则直接平仓
直接平仓(止损线)
亏损触及阈值,不再 Roll
触发条件:亏损超过权利金 2 倍 或 DTE ≤ 5 且仍亏损
操作:市价或限价平仓,全部退出,入台账
注意:L3 熔断不评估 Roll,直接平仓
5.3 月度 SOP 标准操作流程
- M-01月末 -3 日:扫描所有 DTE ≤ 10 的持仓,评估是否需要提前平仓或滚动。
- M-02月末 -1 日:检查次月财报日历,更新所有标的的财报黑名单日期。
- M-03月初 +1 日:台账录入——记录本月已平仓的权利金收入、止盈数、止损数、Roll 次数。
- M-04月初复盘:计算本月实现 PnL vs 预期 EV,识别哪些标的表现低于预期,标记下季度审阅优先项。
- M-05季度末:执行 Watchlist 静态审阅——移除不合格标的,纳入新候选标的,更新对应 YAML 文件。
5.4 position_monitor.py 骨架
position_monitor.py · 骨架
def run_position_monitor(positions, ticker_params, market_data, account):
alerts = []
for pos in positions:
ticker = pos["ticker"]
params = ticker_params[ticker]
price_now = market_data[ticker]["price"]
# 检查1:止盈触达
if pos["current_price"] <= pos["open_price"] * 0.50:
alerts.append(Alert(ticker, "PROFIT_TARGET", "止盈触达 50%,确认平仓", priority="HIGH"))
# 检查2:熔断
daily_chg = market_data[ticker]["daily_change_pct"]
if daily_chg <= -0.25:
alerts.append(Alert(ticker, "L3_CIRCUIT_BREAK", "单日跌 25%,强制平仓", priority="CRITICAL"))
elif daily_chg <= -0.15:
alerts.append(Alert(ticker, "L2_CIRCUIT_BREAK", "单日跌 15%,启动对冲", priority="CRITICAL"))
elif daily_chg <= -0.08:
alerts.append(Alert(ticker, "L1_CIRCUIT_BREAK", "单日跌 8%,暂停新仓", priority="CRITICAL"))
# 检查3:25% 累计跌幅切换
cumulative_chg = (price_now / pos["entry_price"]) - 1
if cumulative_chg <= -0.25 and pos["mode"] == "naked_put":
alerts.append(Alert(ticker, "MODE_SWITCH", "累计跌 25%,切换至 Spread", priority="CRITICAL"))
# 检查4:DTE 时间止损
if pos["dte"] <= params["exit"]["time_stop_dte"] and pos["pnl_pct"] < 0:
alerts.append(Alert(ticker, "TIME_STOP", f"DTE={pos['dte']},仍亏损,强制平仓", priority="HIGH"))
# 检查5:财报临近
days_to_earn = days_to_earnings(ticker)
if days_to_earn <= 12:
alerts.append(Alert(ticker, "EARNINGS_WARN", f"距财报 {days_to_earn} 日,评估平仓", priority="MID"))
send_alerts(alerts) # 发送到邮件 / Telegram / Slack
save_alerts(alerts) # 保存至 alert_YYYYMMDD.txt
return alerts
核心原则:单标参数只能更严,不能更宽
阶段1(全局配置)是宪法,阶段3(单标手册)是地方法规。地方法规可以比宪法更严格,但不能突破宪法的底线。任何冲突都以更严格的那一方为准。
| 冲突场景 | 全局规则 | 单标规则 | 执行结果 |
| VIX 阈值冲突 |
VIX > 28,B 级禁止裸卖 |
VIX > 35 全面暂停(未覆盖 28–35) |
全局优先:28–35 区间执行全局规则(禁止裸卖) |
| Delta 上限冲突 |
A 级 IVR-mid:Delta ≤ 0.18 |
META IVR-mid:Delta ≤ 0.15(更严) |
单标优先:执行 0.15 上限(更严者胜) |
| Delta 上限越界 |
A 级 IVR-high:Delta ≤ 0.20 |
某标的 IVR-high:Delta ≤ 0.22(违规!) |
validate_params 报错,拒绝写入,必须修正 YAML |
| 名义敞口冲突 |
单标上限 20% NAV |
META 手册未指定上限 |
全局兜底:执行 20% NAV 上限 |
| 财报黑名单冲突 |
距财报 ≥ 10 日 |
NVDA 手册:距财报 ≥ 14 日(更严) |
单标优先:执行 14 日封闭期 |
| FOMC 黑名单冲突 |
FOMC 当日及前一日禁止开仓 |
META 手册:FOMC 不影响 |
全局优先:FOMC 黑名单不可被单标放宽 |
冲突判定流程
validate_params.py · 冲突判定逻辑
def resolve_conflict(global_val, local_val, constraint_type):
"""
constraint_type:
"max" = 取较小值(上限约束,如 Delta 上限)
"min" = 取较大值(下限约束,如 DTE 下限)
"bool_strict" = global=True 时单标不得设为 False(如 FOMC 黑名单)
"""
if constraint_type == "max":
return min(global_val, local_val) # 取更严(更小)的上限
elif constraint_type == "min":
return max(global_val, local_val) # 取更严(更大)的下限
elif constraint_type == "bool_strict":
if global_val == True and local_val == False:
raise ValueError("全局强制约束不可被单标放宽")
return global_val # 全局更严时取全局
版本号格式
采用三段式版本号 vMAJOR.MINOR.PATCH,含义如下:
| 段位 | 触发升级场景 | 示例 |
| MAJOR | 方法论核心架构变化(如增减阶段、改变核心策略) | v2.x.x → v3.0.0 |
| MINOR | 参数边界实质性调整(如 VIX 阈值、Delta 上限变化) | v3.0.x → v3.1.0 |
| PATCH | 文字修正、新增标的、小改进,不影响核心逻辑 | v3.0.0 → v3.0.1 |
版本同步规则
- V-01每次修改 choose.html,必须同步更新 config.json 中的 method_version 字段,两者版本号必须完全一致。
- V-02每个 ticker-params.yaml 中的 method_version 字段,必须与当前 config.json 一致,否则 validate_params 报错。
- V-03版本不一致不得静默通过,必须报错阻断流程。
- V-04每个 ticker-params.yaml 独立维护自己的 version 字段(PATCH 级),用于追踪单标手册的迭代历史。
- V-05所有文件变更记录到 CHANGELOG.md,标注变更时间、变更人、变更内容摘要。
目录结构
nra-wheel-system/
├── config/
│ ├── config.json # 全局规则配置(阶段1)
│ └── watchlist.json # 静态 Watchlist(118 标的)
│
├── playbooks/
│ ├── META/
│ │ ├── meta.html # 人读版手册(阶段3)
│ │ └── params.yaml # 机读版参数(阶段3)
│ ├── NVDA/
│ │ ├── meta.html
│ │ └── params.yaml
│ └── ... # 每个标的一个目录
│
├── scripts/
│ ├── wheel_screener.py # 每日筛选(阶段2)
│ ├── openclaw_scan.py # 扫单推荐(阶段4)
│ ├── position_monitor.py # 持仓监控(阶段5)
│ └── validate_params.py # 参数校验工具
│
├── docs/
│ ├── choose.html # 全局方法论文档(阶段1,与 config.json 同步)
│ └── nra-wheel-methodology.html # 本文件
│
├── outputs/ # 脚本产出物,按日期归档
│ ├── eligible_20260419.json
│ ├── signal_20260419.json
│ └── alert_20260419.txt
│
├── ledger/ # 月度台账
│ ├── 2026-04.xlsx
│ └── CHANGELOG.md
│
└── ticker-params.yaml # 合并版(供脚本快速读取)
必须完成(Blocker)
- 阶段1 ✦ config.json 与 choose.html 版本号一致,内容对应
- 阶段2 ✦ wheel_screener.py 通过 Unit Test(VIX=15/25/32/40 四个场景各跑一次)
- 阶段2 ✦ 静态 Watchlist 完成季度审阅,118 个标的均通过准入复核
- 阶段3 ✦ 所有 Watchlist 标的均有对应的 ticker-params.yaml
- 阶段3 ✦ validate_params.py 对所有 YAML 文件校验通过(无版本冲突、无 Delta 越界)
- 阶段4 ✦ openclaw_scan.py 在沙盒环境跑通,输出格式正确
- 阶段4 ✦ 确认无任何自动下单路径(代码审查)
- 阶段5 ✦ position_monitor.py 部署完成,告警通道(邮件/Telegram)测试通过
- ✦ IBKR 账户 PM 账户资格确认,保证金模型设置正确
- ✦ 50% 止盈 GTC 下单 SOP 已培训,所有操作者知晓
建议完成(Nice-to-Have)
- CI 流水线:每次 push 自动运行 validate_params.py
- 月度台账模板准备好,第一笔交易即开始录入
- 熔断演练:模拟 META 单日跌 26% 场景,走一遍 L3 处置流程
- CHANGELOG.md 模板建立
- position_monitor.py 输出接入简单 Web Dashboard(可选)
系统就绪标准
所有"必须完成"项均打勾,validate_params.py 对全量 YAML 零报错,在 IBKR 纸交易账户完成 3 个交易日的全流程演练,方可切换至实盘账户。
免责声明
本操作手册基于 历史数据、美股期权市场规则及 NRA 税务政策综合研究制定,由RHCLOUD AI 生成,不构成任何投资建议。期权交易存在本金全部损失的重大风险。股票 受监管变化、业绩表现、行业竞争、技术迭代等因素影响,可能出现超出历史经验的极端波动。
本手册所涉及的全部税务处理方式、遗产税规划、离岸公司架构,须在相关持牌 CPA、执业律师出具书面意见后方可执行。过往绩效数据与历史回测结果不代表未来收益。交易者须自行评估风险承受能力,并对一切投资决策及其税务后果承担完全责任。
版本:V3.0 · 综合优化版 · 2026 年 4 月 · 内部学习文件 · 禁止对外传阅