Add perpetual-options hedge overlay to amp-stats with hit rates and daily PnL.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -90,6 +90,55 @@ class AmpStatsLibTests(unittest.TestCase):
|
||||
self.assertEqual(s["max_up_points"], 500)
|
||||
self.assertEqual(s["max_down_points"], 200)
|
||||
self.assertIsNone(s["straddle"])
|
||||
self.assertIsNone(s["perp_hedge"])
|
||||
|
||||
def test_perp_hedge_hit_and_pnl(self):
|
||||
from lib.hub.amp_stats_lib import perp_hedge_day_pnl
|
||||
|
||||
# spot=1800 optLev=100 → prem/coin=18; 1:2 → premium=36
|
||||
# A move ≈ 52.83; B portfolio move = 51
|
||||
rows = [
|
||||
{"open": 1800, "close": 1860, "change": 60, "up_points": 60, "down_points": 0, "amplitude": 60, "settlement_day": "2026-07-01"},
|
||||
{"open": 1800, "close": 1740, "change": -60, "up_points": 0, "down_points": 60, "amplitude": 60, "settlement_day": "2026-07-02"},
|
||||
{"open": 1800, "close": 1820, "change": 20, "up_points": 20, "down_points": 0, "amplitude": 20, "settlement_day": "2026-07-03"},
|
||||
]
|
||||
hedge = {
|
||||
"spot": 1800,
|
||||
"target_profit_u": 15,
|
||||
"perp_leverage": 10,
|
||||
"option_leverage": 100,
|
||||
"ratio_perp": 1,
|
||||
"ratio_opt": 2,
|
||||
"ct_mult": 0.01,
|
||||
}
|
||||
s = summarize_rows(rows, perp_hedge=hedge)
|
||||
ph = s["perp_hedge"]
|
||||
self.assertIsNotNone(ph)
|
||||
self.assertEqual(ph["opt_coins"], 2.0)
|
||||
self.assertEqual(ph["premium_total"], 36.0)
|
||||
self.assertAlmostEqual(ph["move_b"], 51.0, places=4)
|
||||
self.assertEqual(ph["hit_a_days"], 1) # only +60
|
||||
self.assertEqual(ph["hit_b_days"], 1) # only -60
|
||||
# up day pnl = 60 - 36 - fee
|
||||
up_pnl = perp_hedge_day_pnl(change=60, open_px=1800, close_px=1860, premium_total=36, opt_coins=2)
|
||||
down_pnl = perp_hedge_day_pnl(change=-60, open_px=1800, close_px=1740, premium_total=36, opt_coins=2)
|
||||
self.assertAlmostEqual(down_pnl, 60 * (2 - 1) - 36, places=4) # 24
|
||||
self.assertAlmostEqual(ph["down_pnl_total"], down_pnl, places=4)
|
||||
self.assertGreater(up_pnl, 0)
|
||||
self.assertEqual(ph["up_days"], 2)
|
||||
self.assertEqual(ph["down_days"], 1)
|
||||
csv_text = build_export_csv(
|
||||
{
|
||||
"exchange": "okx",
|
||||
"symbol_label": "ETH",
|
||||
"summary": s,
|
||||
"rows": rows,
|
||||
"start_hour": 16,
|
||||
"end_hour": 16,
|
||||
}
|
||||
)
|
||||
self.assertIn("永期对冲对照", csv_text)
|
||||
self.assertIn("永期盈亏", csv_text)
|
||||
|
||||
def test_long_straddle_stats(self):
|
||||
rows = [
|
||||
|
||||
Reference in New Issue
Block a user