Revise strategy: TTM+ATM+leverage option pick, % exit, perp leverage/margin.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-07-25 08:38:03 +08:00
parent 7db4c9c8a3
commit 3957a83761
16 changed files with 532 additions and 261 deletions
+26
View File
@@ -4,7 +4,10 @@ from datetime import datetime
from zoneinfo import ZoneInfo
from app.market.instruments import (
hours_until_expiry,
list_eligible_expiry_ymds,
next_session_expiry_ymd,
option_leverage,
parse_option_inst_id,
pick_atm_strike,
select_option_pair,
@@ -48,3 +51,26 @@ def test_select_option_pair_atm() -> None:
assert pair.strike == 3500
assert pair.call_inst_id.endswith("-3500-C")
assert pair.put_inst_id.endswith("-3500-P")
def test_eligible_skips_short_ttm() -> None:
# 2026-07-25 08:30 SH:当日 16:00 到期仅约 7.5h,应跳过 260725,选 260726
now = datetime(2026, 7, 25, 8, 30, tzinfo=_SH)
rows = [
{"instId": "ETH-USD_UM-260725-1850-C", "state": "live"},
{"instId": "ETH-USD_UM-260725-1850-P", "state": "live"},
{"instId": "ETH-USD_UM-260726-1850-C", "state": "live"},
{"instId": "ETH-USD_UM-260726-1850-P", "state": "live"},
]
assert hours_until_expiry("260725", now) < 12
assert hours_until_expiry("260726", now) >= 12
eligible = list_eligible_expiry_ymds(rows, min_hours=12, now=now)
assert eligible == ["260726"]
pair = select_option_pair(rows, mark_px=1853, min_hours=12, now=now)
assert pair is not None
assert pair.expiry_ymd == "260726"
def test_option_leverage() -> None:
assert abs((option_leverage(1850, 18.5) or 0) - 100) < 1e-9
assert option_leverage(1850, 0) is None