# 永期对冲计算器

中控 **策略计算器** 第 3 个 tab：永期对冲。用于离线测算「永续 1 币 + 买方期权」在目标盈利口径下的期权仓位，或按永续:期权比例反推达目标所需波动点数。

入口：中控 → 策略计算器 → **永期对冲**。  
API：`POST /api/calculator/perp-options`  
逻辑库：`lib/hub/hub_perp_options_calc_lib.py`  
单测：`tests/test_hub_perp_options_calc_lib.py`

与实例页「对冲计划」不同：本页**不实盘下单、不拉期权链**，价格与杠杆均为手填。

---

## 共同假设

| 项 | 口径 |
|----|------|
| 品种 | BTC / ETH |
| 永续仓位 | 固定 **1 币** |
| 单币权利金 | `现价 / 期权杠杆`（例：1800÷100=18U） |
| 权利金 | **按全亏**计入；忽略时间价值 / Theta |
| 永续手续费 | 开+平各 `0.05%`（`PERP_TAKER_FEE_RATE`，默认 0.0005） |
| 期权手续费 | **不算** |
| 交易资金 | 仅参考：与 `现价/永续杠杆` 比保证金是否够开 |
| `ct_mult` | 默认 0.01；张数 = 期权币数 / ct_mult |
| 展示 | 金额与点数统一 **小数点后两位** |

---

## 模式一：由波动推期权仓位（`calc_mode=size`）

已知波动（点数或波动率%）、目标盈利、期权杠杆 → 反推期权开多少币/张。

### 公式

```text
单币权利金 = 现价 / 期权杠杆
永续毛收益 = 波动点数 × 1
           （波动率模式：现价 × 波动率% × 1）
平仓价     ≈ 现价 + 波动点数（永续方向对按上涨测算）
永续手续费 = (开仓名义 + 平仓名义) × 0.05%

权利金预算 = 永续毛收益 − 目标盈利 − 永续手续费
期权币数   = 权利金预算 / 单币权利金
期权张数   = 期权币数 / ct_mult
```

若权利金预算 ≤ 0：提示「波动收益不足以覆盖目标盈利+手续费，无法开期权」。

### 情景

**A · 永续方向对（期权全亏）**

```text
净利 = 永续毛收益 − 权利金总额 − 永续手续费
     （设计上 ≈ 目标盈利）
```

**B · 期权方向对（永续 1 币反向亏同等波动）**

```text
期权内在 = 期权币数 × 波动点数
期权净利 = 期权内在 − 权利金总额
永续亏损 = −永续毛收益
组合净利 = 期权净利 + 永续亏损
```

**C · 横盘（最大亏损）**

波动≈0、期权到期无内在价值：

```text
永续盈亏 ≈ 0
永续开平手续费 = 2 × 现价 × 1 × 0.05%   （同价开平）
最大亏损 = 权利金总额 + 永续开平手续费
组合净利 = −最大亏损
```

忽略资金费 / Theta 过程中的中间态；口径与「权利金按全亏」一致。

### 手测示例

现价 1800、波动 50 点、目标盈利 15、期权杠杆 100、永续杠杆 10：

| 量 | 约值 |
|----|------|
| 单币权利金 | 18U |
| 永续手续费 | 1.83U |
| 权利金预算 | 33.18U |
| 期权币数 / 张数 | ≈1.84 币 / ≈184 张 |
| A 净利 | ≈15U |
| B 期权净利 / 组合 | ≈59U / ≈9U |

---

## 模式二：由币数推波动点数（`calc_mode=points`）

已知永续币数 / 期权币数（如 **1:2** 或 **2:4**）、目标盈利、期权杠杆 → 反推两套情景要涨/跌多少点才能达到目标。

**按绝对币数**，不再把输入归一到「永续 1 币」。填 2 与 4 → 永续 2 币 + 期权 4 币（权利金、保证金、手续费均按 2 倍于 1:2 放大；达同一目标盈利所需点数会变小）。

### 仓位

```text
永续币数 = 输入的永续币数
期权币数 = 输入的期权币数
权利金总额 = 期权币数 × (现价 / 期权杠杆)
永续保证金 = 现价 × 永续币数 / 永续杠杆
```

### 情景 A · 永续方向对

净利 = 目标盈利：

```text
qty×move − 权利金 − fee(move,qty) = 目标
fee = (2×现价 + move) × qty × 0.05%

move = (目标 + 权利金 + 2×现价×qty×0.05%) / (qty × (1 − 0.05%))
```

### 情景 B · 期权方向对（以组合净利为准）

组合净利 = 目标盈利：

```text
组合 = 期权币数×move − 权利金 − 永续币数×move
     = move×(期权币数 − 永续币数) − 权利金

move = (目标 + 权利金) / (期权币数 − 永续币数)
```

要求期权币数 > 永续币数；若相等，组合恒为 −权利金，无法解出正目标。

结果区展示：所需波动点数（及折合%）、组合净利、其中期权净利、其中永续盈亏。

### 手测示例

现价 1800、目标 15、期权杠杆 100、币数 1:2 → 权利金总额 36U：

| 情景 | 所需点数（约） |
|------|----------------|
| A 永续方向对（净利=15） | ≈52.83 |
| B 组合净利=15 | 51.00 |
| C 横盘最大亏损 | 37.80（权利金 36 + 同价开平费 1.8） |

币数 **2:4**（权利金 72U、保证金 360U）：

| 情景 | 约值 |
|------|------|
| 仓位 | 永续 2 币 / 期权 4 币（400 张） |
| A 所需点数 | ≈45.32 |
| B 组合达目标 | 43.50 |
| C 横盘最大亏损 | 75.60 |

---

## API 请求体（摘要）

```json
{
  "calc_mode": "size | points",
  "base": "ETH",
  "spot": 1800,
  "capital_usdt": 3000,
  "target_profit_u": 15,
  "move_mode": "points",
  "move_value": 50,
  "perp_leverage": 10,
  "option_leverage": 100,
  "ct_mult": 0.01,
  "ratio_perp": 1,
  "ratio_opt": 2
}
```

- `size` 模式必填 `move_value`；`points` 模式用 `ratio_perp` / `ratio_opt`，可不填波动。

---

## 相关文件

| 路径 | 作用 |
|------|------|
| `lib/hub/hub_perp_options_calc_lib.py` | 纯函数测算 |
| `manual_trading_hub/hub.py` | `POST /api/calculator/perp-options` |
| `manual_trading_hub/static/index.html` | 计算器 tab UI |
| `manual_trading_hub/static/calculator.js` | 提交与结果渲染 |
| `lib/trade/trade_fee_lib.py` | 永续双边手续费 |

## 不做

实盘开平仓、拉 OKX 期权链卖一、把本页结果自动写入对冲计划。

振幅统计页可对历史日表做同口径对照，见 [振幅统计说明.md](./振幅统计说明.md)「永期对冲对照」。
