feat(hedge): replace OO breakout targets with premium profit RR

期期改用盈亏比×权利金止盈(默认2);不达标持有至到期。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-08-11 10:21:47 +08:00
parent 860ebef4a7
commit 3b56e15fb1
12 changed files with 433 additions and 133 deletions
+30 -2
View File
@@ -72,6 +72,8 @@ def init_hedge_plan_tables(conn: sqlite3.Connection) -> None:
)
_ensure_column(conn, "hedge_plans", "target_price_up", "REAL")
_ensure_column(conn, "hedge_plans", "target_price_down", "REAL")
# 期期:目标盈亏比=目标盈利/权利金(如 2=盈利 2 倍权利金);不达标则等到期
_ensure_column(conn, "hedge_plans", "oo_profit_rr", "REAL")
# close_all=盈利腿平后清残腿;hold_expiry=残腿持有至到期(现状)
_ensure_column(conn, "hedge_plans", "oo_close_mode", "TEXT")
# 永期「以期权为主」
@@ -272,7 +274,7 @@ def active_options_targets_by_inst(conn: sqlite3.Connection) -> dict[str, dict[s
rows = conn.execute(
"""
SELECT p.id AS plan_id, p.underlying, p.target_price_up, p.target_price_down,
l.inst_id, l.opt_type
p.oo_profit_rr, l.inst_id, l.opt_type
FROM hedge_plans p
JOIN hedge_plan_legs l ON l.plan_id = p.id
WHERE p.plan_type = 'options_options'
@@ -287,10 +289,36 @@ def active_options_targets_by_inst(conn: sqlite3.Connection) -> dict[str, dict[s
for raw in rows:
row = dict(raw)
inst_id = str(row.get("inst_id") or "")
if not inst_id or inst_id in out:
continue
opt_type = str(row.get("opt_type") or "").upper()
rr = _sf(row.get("oo_profit_rr"))
target = row.get("target_price_up") if opt_type == "C" else row.get("target_price_down")
target_f = _sf(target)
if not inst_id or target_f is None or target_f <= 0 or inst_id in out:
# 盈亏比模式无指数目标价;旧上破/下破计划仍透出 target_index 只读展示
if rr is not None and rr > 0:
out[inst_id] = {
"plan_id": int(row["plan_id"]),
"inst_id": inst_id,
"underlying": row.get("underlying"),
"opt_type": opt_type,
"target_index": None,
"oo_profit_rr": rr,
"plan_type": "options_options",
"managed_by": "hedge_plan",
}
continue
if target_f is None or target_f <= 0:
# 无目标价也标记托管,避免期权页误拆组
out[inst_id] = {
"plan_id": int(row["plan_id"]),
"inst_id": inst_id,
"underlying": row.get("underlying"),
"opt_type": opt_type,
"target_index": None,
"plan_type": "options_options",
"managed_by": "hedge_plan",
}
continue
out[inst_id] = {
"plan_id": int(row["plan_id"]),