Files
eth_hedge_sim/backend/tests/test_oo_fills_pnl.py
T

68 lines
2.1 KiB
Python

"""期期成交盈亏汇总:须计入 option2(Put)腿。"""
from __future__ import annotations
from app.sim.pnl import summarize_fills_pnl
def test_summarize_oo_both_legs() -> None:
fills = [
{
"leg": "option",
"action": "open",
"side": "long",
"fill_px": 12.6,
"qty_eth": 3.5,
"fee": 0.0221,
"slip": 0,
},
{
"leg": "option2",
"action": "open",
"side": "long",
"fill_px": 9.0,
"qty_eth": 5.0,
"fee": 0.0225,
"slip": 0,
},
{
"leg": "option",
"action": "close",
"side": "sell",
"fill_px": 0.0,
"qty_eth": 3.5,
"fee": 0.0,
"slip": 0,
},
{
"leg": "option2",
"action": "close",
"side": "sell",
"fill_px": 0.0,
"qty_eth": 5.0,
"fee": 0.0,
"slip": 0,
},
]
s = summarize_fills_pnl(fills)
assert s["option_pnl"] == -12.6 * 3.5
assert s["option2_pnl"] == -9.0 * 5.0
assert s["perp_pnl"] is None
assert abs(float(s["fees_option"] or 0) - 0.0446) < 1e-9
assert abs(float(s["gross_pnl"] or 0) - (-44.1 - 45.0)) < 1e-9
assert abs(float(s["net_pnl"] or 0) - (-89.1 - 0.0446)) < 1e-9
def test_summarize_perp_option_unchanged() -> None:
fills = [
{"leg": "option", "action": "open", "fill_px": 10, "qty_eth": 2, "fee": 0.1, "slip": 0},
{"leg": "perp", "action": "open", "side": "short", "fill_px": 100, "qty_eth": 1, "fee": 0.2, "slip": 0},
{"leg": "option", "action": "close", "fill_px": 12, "qty_eth": 2, "fee": 0.1, "slip": 0},
{"leg": "perp", "action": "close", "side": "short", "fill_px": 98, "qty_eth": 1, "fee": 0.2, "slip": 0},
]
s = summarize_fills_pnl(fills)
assert s["option_pnl"] == 4.0
assert s["perp_pnl"] == 2.0
assert s["option2_pnl"] is None
assert abs(float(s["net_pnl"] or 0) - (6.0 - 0.6)) < 1e-9