Add ratio-to-move-points mode for hub perpetual-options calculator.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -2,7 +2,11 @@
|
||||
|
||||
import unittest
|
||||
|
||||
from lib.hub.hub_perp_options_calc_lib import calc_perp_options_hedge
|
||||
from lib.hub.hub_perp_options_calc_lib import (
|
||||
calc_perp_options,
|
||||
calc_perp_options_hedge,
|
||||
calc_perp_options_points,
|
||||
)
|
||||
|
||||
|
||||
class HubPerpOptionsCalcTests(unittest.TestCase):
|
||||
@@ -81,6 +85,52 @@ class HubPerpOptionsCalcTests(unittest.TestCase):
|
||||
self.assertIsNone(data)
|
||||
self.assertIsNotNone(err)
|
||||
|
||||
def test_points_ratio_1_to_2(self):
|
||||
# spot=1800, optLev=100 → prem/coin=18; ratio 1:2 → opt=2, premium=36
|
||||
# A: move = (15+36+2*1800*0.0005)/(1-0.0005) = (51+1.8)/0.9995
|
||||
data, err = calc_perp_options_points(
|
||||
base="ETH",
|
||||
spot=1800,
|
||||
capital_usdt=3000,
|
||||
target_profit_u=15,
|
||||
perp_leverage=10,
|
||||
option_leverage=100,
|
||||
ratio_perp=1,
|
||||
ratio_opt=2,
|
||||
ct_mult=0.01,
|
||||
)
|
||||
self.assertIsNone(err)
|
||||
assert data is not None
|
||||
self.assertEqual(data["calc_mode"], "points")
|
||||
self.assertEqual(data["opt_coins"], 2.0)
|
||||
self.assertEqual(data["premium_total_u"], 36.0)
|
||||
expect_a = (15 + 36 + 2 * 1800 * 0.0005) / 0.9995
|
||||
self.assertAlmostEqual(data["case_a"]["move_points"], expect_a, places=6)
|
||||
self.assertAlmostEqual(data["case_a"]["net_u"], 15.0, places=5)
|
||||
# 期权净利=目标: (15+36)/2 = 25.5
|
||||
self.assertAlmostEqual(data["case_b"]["move_points_opt_net"], 25.5, places=6)
|
||||
self.assertAlmostEqual(data["case_b"]["opt_net_u"], 15.0, places=6)
|
||||
# 组合净利=目标: (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)
|
||||
|
||||
def test_points_ratio_1_to_1_no_portfolio(self):
|
||||
data, err = calc_perp_options(
|
||||
calc_mode="points",
|
||||
base="ETH",
|
||||
spot=1800,
|
||||
capital_usdt=3000,
|
||||
target_profit_u=15,
|
||||
perp_leverage=10,
|
||||
option_leverage=100,
|
||||
ratio_perp=1,
|
||||
ratio_opt=1,
|
||||
)
|
||||
self.assertIsNone(err)
|
||||
assert data is not None
|
||||
self.assertIsNone(data["case_b"]["move_points_portfolio"])
|
||||
self.assertIsNotNone(data["case_b"]["portfolio_error"])
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
||||
Reference in New Issue
Block a user