Files
crypto_monitor/tests/test_hub_compare_lib.py
T
2026-07-23 14:39:59 +08:00

83 lines
2.5 KiB
Python

"""策略对比仓位与情景测算."""
from __future__ import annotations
from lib.hub.hub_compare_lib import run_compare
def test_long_eth_realistic_asks():
out = run_compare(
{
"base": "ETH",
"direction": "long",
"entry": 3500,
"sl": 3400,
"tp": 3700,
"risk_u": 10,
"option": {"opt_type": "C", "strike": 3600, "ask": 50},
"hedge": {
"main": {"opt_type": "C", "strike": 3600, "ask": 50},
"side": {"opt_type": "P", "strike": 3400, "ask": 30},
},
}
)
assert out["ok"] is True
perp = out["perp"]
# 每张止损 = 100 * 0.01 = 1U → 10 张
assert perp["sheets"] == 10
assert abs(perp["path_b_sl"] + 10) < 1e-6
assert perp["path_a_tp"] > 0
assert perp["path_c_realized"] == perp["path_b_sl"]
assert perp["path_c_missed"] == perp["path_a_tp"]
opt = out["option"]
assert opt["ok"] is True
# unit = 50 * 0.01 = 0.5U → 20 张, premium = 10
assert opt["sheets"] == 20
assert abs(opt["premium_u"] - 10) < 1e-6
assert abs(opt["path_b_worst"] + 10) < 1e-6
# at TP 3700, call 3600 intrinsic = 100 * 20 * 0.01 = 20, pnl = 20-10 = 10
assert abs(opt["path_a_tp"] - 10) < 1e-6
assert abs(opt["path_c_hold_to_tp"] - opt["path_a_tp"]) < 1e-6
hedge = out["hedge"]
assert hedge["ok"] is True
# main budget 7, unit 0.5 → 14 sheets; side budget 3, unit 0.3 → 10 sheets
assert hedge["main"]["sheets"] == 14
assert hedge["side"]["sheets"] == 10
assert out["recommend"]["choice"] in ("合约", "单期权", "期期对冲")
def test_short_validation():
bad = run_compare(
{
"base": "ETH",
"direction": "short",
"entry": 3500,
"sl": 3400,
"tp": 3300,
"risk_u": 10,
}
)
assert bad["ok"] is False
def test_recommend_has_bullets():
out = run_compare(
{
"base": "ETH",
"direction": "long",
"entry": 3500,
"sl": 3490,
"tp": 3520,
"risk_u": 10,
"option": {"opt_type": "C", "strike": 3500, "ask": 20},
"hedge": {
"main": {"opt_type": "C", "strike": 3500, "ask": 20},
"side": {"opt_type": "P", "strike": 3480, "ask": 15},
},
}
)
assert out["ok"] is True
assert out["recommend"]["choice"]
assert len(out["recommend"]["bullets"]) == 3