fix复盘真盈亏按权利金USDT波动公式计算,忽略现货多买。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-10-13 10:16:44 +08:00
parent c2c69e580c
commit 3416996ae5
10 changed files with 249 additions and 280 deletions
+36 -46
View File
@@ -6,7 +6,7 @@ import unittest
class AccountPnlSettleTests(unittest.TestCase):
def test_settle_after_minus_before(self):
def test_settle_freezes_premium_usdt_move_not_account_diff(self):
from lib.options.options_account_pnl_lib import (
settle_closed_trades_from_trading_account,
)
@@ -15,16 +15,19 @@ class AccountPnlSettleTests(unittest.TestCase):
conn = sqlite3.connect(":memory:")
conn.row_factory = sqlite3.Row
init_options_tables(conn)
# coin_pnl=0.01, open=90000, close=80000 → A=700; 账户差分会是 947 但不采用
conn.execute(
"""
INSERT INTO options_trades(
inst_id, underlying, opt_type, sheets, eth_amount,
premium_paid, status, bridge_id, trading_usdt_before, pnl_settled,
created_at, closed_at
premium_paid, premium_received, realized_pnl, premium_ccy,
open_index_px, close_index_px, status, bridge_id,
trading_usdt_before, pnl_settled, created_at, closed_at
) VALUES (
'BTC-USD-261008-86500-P', 'BTC', 'P', 1, 0.01,
0.01, 'closed', 7, 1000.0, 0,
'2026-10-05 05:11:30', '2026-10-07 10:03:53'
0.01, 0.02, 0.01, 'BTC',
90000.0, 80000.0, 'closed', 7,
1000.0, 0, '2026-10-05 05:11:30', '2026-10-07 10:03:53'
)
"""
)
@@ -37,7 +40,7 @@ class AccountPnlSettleTests(unittest.TestCase):
"SELECT trading_usdt_after, realized_pnl_usdt, pnl_settled FROM options_trades WHERE id=1"
).fetchone()
self.assertAlmostEqual(float(row["trading_usdt_after"]), 1947.05, places=2)
self.assertAlmostEqual(float(row["realized_pnl_usdt"]), 947.05, places=2)
self.assertAlmostEqual(float(row["realized_pnl_usdt"]), 700.0, places=2)
self.assertEqual(int(row["pnl_settled"]), 1)
# 已冻结不再改
@@ -48,7 +51,7 @@ class AccountPnlSettleTests(unittest.TestCase):
row2 = conn.execute(
"SELECT realized_pnl_usdt FROM options_trades WHERE id=1"
).fetchone()
self.assertAlmostEqual(float(row2["realized_pnl_usdt"]), 947.05, places=2)
self.assertAlmostEqual(float(row2["realized_pnl_usdt"]), 700.0, places=2)
conn.close()
def test_stats_use_coin_times_sell_px_not_account(self):
@@ -149,48 +152,35 @@ class AccountPnlSettleTests(unittest.TestCase):
self.assertEqual(int(out["total"]), 2)
conn.close()
def test_resolve_true_pnl_prefers_account_then_bridge(self):
from lib.options.options_account_pnl_lib import resolve_true_pnl_usdt
from lib.options.options_db import init_options_tables
from lib.options.options_spot_bridge_lib import ensure_bridge_table
def test_true_pnl_premium_move_helper(self):
from lib.options.options_pnl_settle_lib import (
resolve_true_pnl_usdt_from_trade,
true_pnl_usdt_premium_move,
)
conn = sqlite3.connect(":memory:")
conn.row_factory = sqlite3.Row
init_options_tables(conn)
ensure_bridge_table(conn)
conn.execute(
"""
INSERT INTO options_spot_bridge(
id, underlying, status, budget_usdt, usdt_recovered
) VALUES (3, 'ETH', 'closed', 100.0, 160.0)
"""
# A = 0.01*80000 - (0.01*90000 - 0.01*80000) = 700
self.assertAlmostEqual(
float(
true_pnl_usdt_premium_move(
coin_pnl=0.01,
premium_paid=0.01,
open_index_px=90000,
sell_back_px=80000,
)
),
700.0,
places=4,
)
conn.commit()
pnl, src = resolve_true_pnl_usdt(
conn,
trading_usdt_before=500.0,
trading_usdt_after=580.0,
bridge_id=3,
pnl, src = resolve_true_pnl_usdt_from_trade(
premium_paid=0.01,
premium_received=0.02,
realized_pnl=0.01,
open_index_px=90000,
close_index_px=80000,
premium_ccy="BTC",
)
self.assertEqual(src, "account")
self.assertAlmostEqual(float(pnl), 80.0, places=4)
pnl2, src2 = resolve_true_pnl_usdt(
conn,
trading_usdt_before=500.0,
trading_usdt_after=None,
bridge_id=3,
)
self.assertEqual(src2, "bridge")
self.assertAlmostEqual(float(pnl2), 60.0, places=4)
pnl3, src3 = resolve_true_pnl_usdt(
conn,
trading_usdt_before=None,
realized_pnl_usdt=999.0,
pnl_settled=1,
)
self.assertEqual(src3, "none")
self.assertIsNone(pnl3)
conn.close()
self.assertEqual(src, "premium_move")
self.assertAlmostEqual(float(pnl), 700.0, places=4)
def test_settle_blocked_when_sellable_coin(self):
from lib.options.options_account_pnl_lib import try_settle_after_sellback