# 期权分析数据说明

推荐读取 [HTML 版本](fields.html)。读取工具不支持 Markdown 或 HTML 时，可使用 [纯文本版本](fields.txt)。三个版本的字段说明来自同一份源文件，无需执行 JavaScript。

## 入口与范围

- [股票和期权目录](./)：不执行 JavaScript 即可读取，股票详情列出所有到期日及分页链接。
- [stocks.json](../data/stocks.json)：全部支持查询的股票；watchlist 和每条记录的 inWatchlist 明确当前概览及默认扫描范围。
- [candidates.json](../data/candidates.json)：默认条件下的本地扫描结果，没有调用智谱或其他模型。
- [options-manifest.json](../data/options-manifest.json)：所有支持股票的可用状态，包括失败股票。
- 每股完整期权链：/options/data/options/{SYMBOL}.json，保留源站返回的全部合约，包括已到期和非标准合约。
- 每股/每到期日分页：以 stocks.json 的 expirations[].pages[] 为准，每页最多 200 条；JSON 的 nextPage 指向下一页，最后一页为 null。

所有路径是静态文件。给 URL 添加 ?minDays=30 不会在服务端执行筛选。程序可下载完整链自行计算；浏览器用户可在主页面扫描后复制或下载本次结果。

## 快照和时间

schemaVersion=1.0.0 是数据格式版本；snapshotId 标识一次构建，股票、完整链、分页、默认候选、HTML 使用相同 ID。读取过程中若 ID 不一致，应重新读取目录，避免混用部署版本。

generatedAt 是生成/分析时刻，采用带 Z 的 UTC ISO 8601 格式。retrievedAt 是实际抓取时刻；浏览器缓存命中时保留最初抓取时间。二者均不是交易所行情时刻。

sourceTimestamp、lastTradeDate 保留上游原文。上游没有明确时区，因此 sourceTimeZone=null，不能擅自加 Z 或将其作为 UTC。即使网页刚刷新，报价也可能来自上个交易日。isDelayed=true 表示 Cboe 延迟行情，不承诺固定延迟分钟数。

默认工作流在工作日 UTC 13:20 至 22:50 的每小时第 20、50 分钟计划更新，也可在代码推送或手动运行时更新。实际时间受排队、源站、市场休市影响；请读取文件时间，不要推断一定每半小时更新成功。

analysisDate 按 America/New_York 的日历日期确定。到期天数等于到期日期与该日期的日历日差，避免用户所在时区或夏令时改变排序；不表示距离最后可交易时刻的精确小时数。

mode=cached-preview 只用于明确标识的旧缓存预览，不是新行情。正常构建为 published-default。

## 股票字段

| 字段 | 含义 |
|---|---|
| symbol / inWatchlist | 股票代码 / 是否在概览和默认扫描列表 |
| quote.price | 股价，USD/股 |
| quote.change / quote.changePct | 日价格变化 / 日涨跌百分数 |
| quote.source / sourceUrl | 行情来源及原始地址 |
| quote.sourceTimestamp / retrievedAt | 源站行情时间原文 / 抓取时间 |
| ytdChangePct | 相对本年度第一条可用日 K 线收盘价的变化，沿用主页面口径 |
| ytdBasePrice / ytdBaseDate | 该比较基准的收盘价与日期；不是保证使用上年最后交易日 |
| optionCount / expirations | 期权总数 / 到期日及完整分页目录 |
| status / errors | 股票、期权和年初基准的可用性及失败原因 |

百分数字段均使用百分数值：20 表示 20%，-15 表示 -15%。缺失值为 null，不是 0；失败股票不会从目录中消失。

## 期权字段

| 字段 | 含义 |
|---|---|
| contractSymbol | 源站合约代码，用于精确定位合约 |
| optionType / expiryDate / strike | put 或 call / YYYY-MM-DD 到期日 / 执行价 USD/股 |
| bid / ask / lastPrice | 买方出价 / 卖方要价 / 最近成交价，均为 USD/股 |
| volume / openInterest | 源站成交量 / 持仓量，单位张 |
| impliedVolatility | 源站隐含波动率，小数值；0.5 表示 50% |
| delta / gamma / theta / vega | 源站原始 Greeks，不重新缩放，不用于本地评分；源站未附明细单位 |
| lastTradeDate | 最近成交时间原文，不等于当前买卖报价时间 |
| contractMultiplier / multiplierStatus | 标准根代码暂按 100 股/张假设；调整根代码为 null，且不进入候选 |
| underlyingQuote | 本次构建使用的股价及其来源时间，供复核筛选计算 |

100 股/张是标准合约假设，不是对每份合约交割物的独立确认。非标准或调整合约仍保留在原始链中，默认候选排除它们。

## 筛选及数量

filters 保存实际使用的参数，默认：现金担保卖 Put，平衡偏好，30–200 天，买价至少 $1，年化至少 20%，相对差 -60% 至 -15%，持仓至少 1，最大价差 45%，每股最多 3 条，AI 发送上限 40 条。上下限包含边界。

买价、卖价、执行价、股价或持仓缺失时不生成候选；卖价小于买价、净权利金不为正、已到期、非标准根代码也不生成候选。成交量缺失时保留 null，仅评分的成交量贡献按 0 处理。

candidates 是全部通过筛选后，再按每股上限截取的列表；shortlistIds 是该列表前 candidateLimit 条的候选 ID，按顺序引用 candidates，不重复完整记录。两者均不等于完整期权链，也不是 AI 返回的 Top 10。

counts.optionsRead 是已读取合约数；matchedBeforeSymbolLimit 是单股截取前匹配数；retained 是截取后数；excludedBySymbolLimit 是单股截取剔除数；aiShortlist 是拟发给模型的数量。perSymbol 提供各股票相同统计；sources 保留每股来源及计算价格。

候选按 localScore 降序，同分按 contractSymbol 字符序升序。表格交互排序只改变展示，导出仍保持该可复现顺序。

## 收益公式

沿用主页面现有的权利金收益口径。记股价 S、执行价 K、买方出价 B、卖方要价 A、到期天数 D、合约乘数 M=100：

- 净权利金/股 N = B - 0.01。费用假设为 $0.01/股，即标准合约 $1/张，不是实际券商费率。
- 价差 spreadPct = (A - B) / ((A + B) / 2) × 100。
- 相对差 strikePct = (K / S - 1) × 100。
- 净权利金/张 premiumDollars = N × M。
- 资金占用 collateral：现金担保卖 Put 为 K × M；备兑卖 Call 为 S × M，假设按该股价持有股票。
- 简单年化 annualReturn = premiumDollars / collateral × 365 / D × 100。
- 盈亏平衡 breakEven：Put 为 K - N；备兑 Call 为 S - N。
- 缓冲 downsideProtectionPct：Put 为 (S - breakEven) / S × 100；备兑 Call 为 N / S × 100。

年化仅把净权利金按时间折算，不含股价变化、被指派交割、股息或其他损益，尤其不等于备兑 Call 的总收益，也不是收益保证。

## 本地评分

assumptions.scoreVersion=2.0.0。权重沿用原有模型，版本变化标记统一日期、缺失值、非标准合约和同分排序规则。评分不是概率。

设 Y=年化、P=缓冲、L=log10(持仓+1)×1.8+log10((成交量或0)+1)×0.9、W=价差×0.08；
T=到期天数小于21时1.8，否则0；U=到期天数大于75时0.8，否则0；
V=Put时max(0,相对差)×1.7，Call时max(0,-相对差)×1.7。

- 平衡：Y×0.92 + P×0.7 + L - W - V×1.25 - T×0.6 - U。
- 保守：Y×0.72 + P×1.15 + L - W×1.35 - V×1.8 - T - U。
- 激进：Y×1.12 + P×0.35 + L×0.7 - W×0.65 - V - U。

复核时使用同一快照、generatedAt 和 filters 调用公开的 [analysisCore.js](../analysisCore.js) 中 scanSnapshots；浏览器与构建脚本使用同一实现。

## 公开数据与个人导出

公开候选的 scope=published-default。本机扫描的 scope=browser-scan；它保存扫描开始时间、扫描时的筛选条件及实际读取的数据来源。随后修改输入框不会改变已完成扫描的导出内容。

只有完整读取且具备股价的股票参与计算。扫描 status=partial 表示部分股票无法计算，unavailable 表示全部不可计算；0 个候选本身不是抓取失败。YTD 缺失会影响股票目录状态，但不影响无需 YTD 的候选计算。

每次构建先完整生成暂存输出再发布。个别股票失败会发布明确缺失信息；全部期权失败则构建失败，保留之前的数据，因此要始终核对时间。

导出包含行情、候选和筛选条件；不包含 API Key、浏览器存储或 AI History。数据入口提供只读查询，不调用模型、不执行交易。
