Add sideways max-loss to perpetual-options calculator.

Show premium wipeout plus flat round-trip perp fees as case C for both size and points modes.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-07-29 22:38:20 +08:00
parent 28a329cb63
commit 9f3395de2f
5 changed files with 91 additions and 3 deletions
+11
View File
@@ -38,6 +38,11 @@ class HubPerpOptionsCalcTests(unittest.TestCase):
self.assertAlmostEqual(data["case_b"]["portfolio_net_u"], coins * 32.0 - 50.0, places=6)
self.assertAlmostEqual(data["perp_margin_u"], 180.0, places=6)
self.assertTrue(data["capital_ok"])
sw = data["case_sideways"]
self.assertAlmostEqual(sw["premium_u"], data["premium_total_u"], places=6)
self.assertAlmostEqual(sw["fee_u"], 1.8, places=6)
self.assertAlmostEqual(sw["max_loss_u"], data["premium_total_u"] + 1.8, places=6)
self.assertAlmostEqual(sw["net_u"], -sw["max_loss_u"], places=6)
def test_pct_mode(self):
data, err = calc_perp_options_hedge(
@@ -113,6 +118,12 @@ class HubPerpOptionsCalcTests(unittest.TestCase):
# 组合净利=目标: (15+36)/(2-1) = 51
self.assertAlmostEqual(data["case_b"]["move_points_portfolio"], 51.0, places=6)
self.assertAlmostEqual(data["case_b"]["portfolio_net_u"], 15.0, places=6)
# 横盘:权利金36 + 同价开平费 2*1800*0.0005=1.8 → 37.8
sw = data["case_sideways"]
self.assertAlmostEqual(sw["premium_u"], 36.0, places=6)
self.assertAlmostEqual(sw["fee_u"], 1.8, places=6)
self.assertAlmostEqual(sw["max_loss_u"], 37.8, places=6)
self.assertAlmostEqual(sw["net_u"], -37.8, places=6)
def test_points_ratio_1_to_1_no_portfolio(self):
data, err = calc_perp_options(