Files
eth_hedge_sim/backend/tests/test_oo_selection_sizing.py
T
dekun ec244c63c6 Add option-option hedge mode with SIM/LIVE parity.
Mutual hedge_mode, amplitude OTM selection, 1:1 risk sizing, win-leg/full close, dual audits and docs.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-07 16:01:16 +08:00

67 lines
1.9 KiB
Python

"""期期对冲:选约 / 定仓纯函数测试。"""
from __future__ import annotations
from app.exchange.candles import AmplitudeHL
from app.strategy.oo_selection import (
pick_otm_call_strike,
pick_otm_put_strike,
select_oo_pair,
)
from app.strategy.risk_sizing import compute_oo_sizing
def test_otm_strikes_near_amplitude() -> None:
strikes = [1800.0, 1850.0, 1900.0, 1950.0, 2000.0, 2050.0, 2100.0]
assert pick_otm_call_strike(strikes, spot=1950, high=2040) == 2050.0
assert pick_otm_put_strike(strikes, spot=1950, low=1860) == 1850.0
def test_select_oo_pair_same_expiry(tmp_path=None) -> None:
contracts = []
for k in (1900, 2000, 2100):
for side, letter in (("call", "C"), ("put", "P")):
contracts.append(
{
"expiry_ymd": "260810",
"expiry_ms": 1_786_320_000_000,
"strike": float(k),
"side": letter,
"inst_id": f"ETH-{k}-{letter}",
}
)
picked = select_oo_pair(
contracts,
spot=2000.0,
high=2105.0,
low=1890.0,
min_hours=1.0,
)
assert picked is not None
ymd, _ems, ck, pk, call_i, put_i = picked
assert ymd == "260810"
assert ck == 2100.0
assert pk == 1900.0
assert "C" in call_i and "P" in put_i
def test_compute_oo_sizing_1_1_and_reward() -> None:
r = compute_oo_sizing(
budget=100.0,
call_ask=5.0,
put_ask=5.0,
fee_rate=0.0,
index_px=2000.0,
cushion=0.92,
reward_ratio=2.0,
)
assert r.ok
assert r.qty_eth == 9.2
assert abs(float(r.net_profit_target or 0) - 200.0) < 1e-9
assert float(r.call_premium or 0) + float(r.put_premium or 0) <= 92.0 + 1e-6
def test_amplitude_range_pct() -> None:
a = AmplitudeHL(high=2030, low=1970, mid=2000, hours=12, bar_count=12)
assert abs(a.range_pct - 3.0) < 1e-9