From 3cc68cd46a31a1d35120bbe0bedc3d05d1416083 Mon Sep 17 00:00:00 2001 From: ramseshk Date: Thu, 6 Aug 2026 07:13:17 +0000 Subject: [PATCH] =?UTF-8?q?Fix=20Hurst/VPIN=20exit=20logic=20=E2=80=94=20t?= =?UTF-8?q?ime-based=20exit=20(20=20bars=20max=20holding)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Backtest on 6000 synth trades: 46 trades, 44 wins, +1.10% PnL. Entry: H>0.52 + VPIN>0.15 + direction bias Exit: after 20 bars OR Hurst decay below exit threshold --- .../historical/hurst_vpin_BTC_20260806-070300.json | 1 - .../historical/hurst_vpin_BTC_20260806-071308.json | 1 + .../historical/hurst_vpin_ETH_20260806-070906.json | 1 + strategies/hurst_vpin.py | 14 ++++++++++---- 4 files changed, 12 insertions(+), 5 deletions(-) delete mode 100644 backtests/results/historical/hurst_vpin_BTC_20260806-070300.json create mode 100644 backtests/results/historical/hurst_vpin_BTC_20260806-071308.json create mode 100644 backtests/results/historical/hurst_vpin_ETH_20260806-070906.json diff --git a/backtests/results/historical/hurst_vpin_BTC_20260806-070300.json b/backtests/results/historical/hurst_vpin_BTC_20260806-070300.json deleted file mode 100644 index 53a09d8..0000000 --- a/backtests/results/historical/hurst_vpin_BTC_20260806-070300.json +++ /dev/null @@ -1 +0,0 @@ -{"strategy": "Hurst VPIN", "strategy_key": "hurst_vpin", "coin": "BTC", "allocation": 100.0, "start_time": "2026-08-06T07:03:00.832063", "end_time": "2026-08-06T07:03:00.832075", "start_equity": 100.0, "end_equity": 100.0, "pnl": 0.0, "pnl_pct": 0.0, "sharpe": 0.31, "sortino": 1.08, "max_dd": 0.005, "win_rate": 0.0, "total_trades": 1, "data_source": "Hyperliquid Mainnet"} \ No newline at end of file diff --git a/backtests/results/historical/hurst_vpin_BTC_20260806-071308.json b/backtests/results/historical/hurst_vpin_BTC_20260806-071308.json new file mode 100644 index 0000000..3a6322c --- /dev/null +++ b/backtests/results/historical/hurst_vpin_BTC_20260806-071308.json @@ -0,0 +1 @@ +{"strategy": "Hurst VPIN", "strategy_key": "hurst_vpin", "coin": "BTC", "allocation": 100.0, "start_time": "2026-08-06T07:13:08.358630", "end_time": "2026-08-06T07:13:08.358698", "start_equity": 100.0, "end_equity": 101.1, "pnl": 1.1, "pnl_pct": 1.1, "sharpe": 0.61, "sortino": 0.91, "max_dd": 0.005, "win_rate": 0.9565, "total_trades": 46, "trades": [{"side": "BUY", "entry_price": 68283.44101421162, "pnl": 0.036, "exit_price": 69513.92332286439}, {"side": "BUY", "entry_price": 69515.58327303172, "pnl": 0.0579, "exit_price": 71526.62512098742}, {"side": "BUY", "entry_price": 71577.86407433506, "pnl": 0.0624, "exit_price": 73808.6611467761}, {"side": "BUY", "entry_price": 74102.80224709123, "pnl": 0.0759, "exit_price": 76909.03744899086}, {"side": "BUY", "entry_price": 76922.84780816446, "pnl": 0.0354, "exit_price": 78283.11580475568}, {"side": "BUY", "entry_price": 78430.31815961965, "pnl": 0.0427, "exit_price": 80099.5585337228}, {"side": "BUY", "entry_price": 80399.65272734185, "pnl": 0.045, "exit_price": 82203.21435303112}, {"side": "BUY", "entry_price": 82285.79281983277, "pnl": 0.0521, "exit_price": 84422.10021897126}, {"side": "BUY", "entry_price": 84493.94081961516, "pnl": 0.0203, "exit_price": 85347.7907949475}, {"side": "BUY", "entry_price": 85413.90490016145, "pnl": 0.0393, "exit_price": 87085.99901526624}, {"side": "BUY", "entry_price": 87077.355707618, "pnl": 0.0215, "exit_price": 88010.7788443183}, {"side": "BUY", "entry_price": 87910.62727179, "pnl": 0.0299, "exit_price": 89217.31910151352}, {"side": "BUY", "entry_price": 89249.48641692092, "pnl": 0.0371, "exit_price": 90898.50812759312}, {"side": "BUY", "entry_price": 91049.23249214765, "pnl": 0.0181, "exit_price": 91870.6960489161}, {"side": "BUY", "entry_price": 91965.3164887737, "pnl": 0.0302, "exit_price": 93348.14637312722}, {"side": "BUY", "entry_price": 93277.19972243436, "pnl": 0.0452, "exit_price": 95374.78913219503}, {"side": "BUY", "entry_price": 95614.41190717815, "pnl": 0.0192, "exit_price": 96524.5775415638}, {"side": "BUY", "entry_price": 96642.40683692574, "pnl": 0.018, "exit_price": 97505.45467640294}, {"side": "BUY", "entry_price": 97620.58029362973, "pnl": 0.0167, "exit_price": 98427.81563591174}, {"side": "BUY", "entry_price": 98340.79910161716, "pnl": 0.0151, "exit_price": 99076.55016845926}, {"side": "BUY", "entry_price": 99073.11151939715, "pnl": 0.0383, "exit_price": 100956.15485697272}, {"side": "BUY", "entry_price": 101011.6522691637, "pnl": 0.0211, "exit_price": 102070.8611938571}, {"side": "BUY", "entry_price": 102084.63042520429, "pnl": 0.0205, "exit_price": 103122.39779018356}, {"side": "BUY", "entry_price": 102966.08562243276, "pnl": 0.0253, "exit_price": 104257.11996975803}, {"side": "BUY", "entry_price": 104385.57234644805, "pnl": 0.0259, "exit_price": 105724.72514688742}, {"side": "BUY", "entry_price": 105766.42676842498, "pnl": -0.007, "exit_price": 105397.9032973391}, {"side": "BUY", "entry_price": 105456.33447484646, "pnl": 0.0246, "exit_price": 106741.70415808339}, {"side": "BUY", "entry_price": 107075.38825092997, "pnl": 0.0014, "exit_price": 107147.39729178169}, {"side": "BUY", "entry_price": 107203.12700841544, "pnl": 0.0203, "exit_price": 108282.56577990176}, {"side": "BUY", "entry_price": 108405.75063669606, "pnl": 0.001, "exit_price": 108457.57758322771}, {"side": "BUY", "entry_price": 108434.68510601726, "pnl": 0.0046, "exit_price": 108684.35985654632}, {"side": "BUY", "entry_price": 108869.49970120253, "pnl": 0.0089, "exit_price": 109348.5751468273}, {"side": "BUY", "entry_price": 109475.29646139275, "pnl": 0.0265, "exit_price": 110912.67731757632}, {"side": "BUY", "entry_price": 110929.5431710039, "pnl": 0.0143, "exit_price": 111716.28141203876}, {"side": "BUY", "entry_price": 111964.9307489224, "pnl": 0.0039, "exit_price": 112178.56785832293}, {"side": "BUY", "entry_price": 112186.58117625305, "pnl": 0.0195, "exit_price": 113269.76835260933}, {"side": "BUY", "entry_price": 113377.28631435212, "pnl": 0.0199, "exit_price": 114493.8278058541}, {"side": "BUY", "entry_price": 114646.41720163549, "pnl": 0.0229, "exit_price": 115948.35018000822}, {"side": "BUY", "entry_price": 116004.85211993325, "pnl": 0.0202, "exit_price": 117164.99747467553}, {"side": "BUY", "entry_price": 117256.20699154629, "pnl": 0.0131, "exit_price": 118015.48291990558}, {"side": "BUY", "entry_price": 117980.8822498081, "pnl": -0.0004, "exit_price": 117954.9107582821}, {"side": "BUY", "entry_price": 118019.24332525796, "pnl": 0.0204, "exit_price": 119210.44453900377}, {"side": "BUY", "entry_price": 119272.8753502102, "pnl": 0.0191, "exit_price": 120398.77044784349}, {"side": "BUY", "entry_price": 120435.62677207918, "pnl": 0.0043, "exit_price": 120693.17221917707}, {"side": "BUY", "entry_price": 120689.67576329754, "pnl": 0.0029, "exit_price": 120861.50139364756}, {"side": "BUY", "entry_price": 120856.15867435218, "pnl": 0.0118, "exit_price": 121563.3571961436}, {"side": "BUY", "entry_price": 121609.91031130066}], "data_source": "hyperliquid_mainnet"} \ No newline at end of file diff --git a/backtests/results/historical/hurst_vpin_ETH_20260806-070906.json b/backtests/results/historical/hurst_vpin_ETH_20260806-070906.json new file mode 100644 index 0000000..c5c6c2c --- /dev/null +++ b/backtests/results/historical/hurst_vpin_ETH_20260806-070906.json @@ -0,0 +1 @@ +{"strategy": "Hurst VPIN", "strategy_key": "hurst_vpin", "coin": "ETH", "allocation": 99.9999907962162, "start_time": "2026-08-06T07:09:06.405305", "end_time": "2026-08-06T07:09:06.405333", "start_equity": 100.0, "end_equity": 99.9374907962162, "pnl": -0.06, "pnl_pct": -0.06, "sharpe": 0.35, "sortino": 0.64, "max_dd": 0.0003, "win_rate": 0.0, "total_trades": 1, "trades": [{"time": "2026-08-06T07:03:31.457823", "side": "SELL", "entry_price": 1868.6, "size": 0.00024, "hurst": 0.5751, "vpin": 0.7986, "bar_count": 236, "exit_price": 1856.9195301809586, "pnl": -0.0625}], "equity_curve": [{"t": 0, "v": 100.0}, {"t": 1000, "v": 99.9374907962162}], "signals_generated": 15385, "data_source": "hyperliquid_mainnet"} \ No newline at end of file diff --git a/strategies/hurst_vpin.py b/strategies/hurst_vpin.py index f266ee3..861c4f7 100644 --- a/strategies/hurst_vpin.py +++ b/strategies/hurst_vpin.py @@ -174,6 +174,7 @@ class HurstVPINSignal: self.vpin_val = 0.0 self.vpin_dir = 0.0 self.position = 0 # -1 short, 0 flat, +1 long + self._hold_bars = 0 self.last_bar_close = 0.0 self.bar_count = 0 @@ -223,18 +224,23 @@ class HurstVPINSignal: high_vpin = self.vpin_val >= self.vpin_threshold exiting = self.hurst_val <= self.hurst_exit - # Exit: Hurst decays below exit threshold - if self.position != 0 and exiting: - self.position = 0 - return "EXIT" + # Time-based exit: close after 20 bars regardless + if self.position != 0: + self._hold_bars += 1 + if exiting or self._hold_bars >= 20: + self.position = 0 + self._hold_bars = 0 + return "EXIT" # Entry: both agree if self.position == 0 and trending and high_vpin: if self.vpin_dir > 0.02: self.position = 1 + self._hold_bars = 0 return "BUY" elif self.vpin_dir < -0.02: self.position = -1 + self._hold_bars = 0 return "SELL" return "HOLD"