← Back to Home
Volatility Adjusted Momentum Strategy Backtest ETH-USD 84.42% Return With 61.54% Win Rate

Volatility Adjusted Momentum Strategy Backtest: ETH-USD 84.42% Return With 61.54% Win Rate

The Mega Backtrader Strategy Pack includes 500+ Python strategies, standardized runners, CSV metrics, charts, and dashboards. Get it here: Mega Backtrader Strategy Pack.

Simple rules can outperform more elaborate systems. VolatilityAdjustedMomentum combines a seven-day and 30-day moving-average crossover with a one-ATR trailing threshold and 95% position sizing.

On ETH-USD daily candles from August 4, 2024 through August 4, 2026, the strategy returned 84.42% while buy-and-hold lost 30.15%. It completed 13 trades, won eight, and finished flat.

The result was sustained across the test: strategy equity was ahead on 85.3% of days after day 30. It also beat ETH in 69.1% of 126-day windows and 90.4% of 252-day windows.

Result Value
Strategy return 84.42%
ETH buy-and-hold return -30.15%
Excess return 114.58%
Final portfolio value $18,442.24
Sharpe ratio 1.36
Maximum drawdown 14.33%
Closed / open trades 13 / 0
Win rate 61.54%
Cumulative days ahead after day 30 85.3%
126-day rolling windows ahead 69.1%

A Compact Momentum Model

The trend signal is a conventional moving-average crossover:

self.short_ma = bt.indicators.SimpleMovingAverage(
    self.data.close,
    period=self.params.short_ma_period,
)
self.long_ma = bt.indicators.SimpleMovingAverage(
    self.data.close,
    period=self.params.long_ma_period,
)
self.atr = bt.indicators.AverageTrueRange(
    self.data,
    period=self.params.atr_period,
)

A bullish cross opens a long; a bearish cross opens a short. The position uses 95% of current account value:

position_size = int(
    (account_value * self.params.size_pct)
    / self.data.close[0]
)

if self.short_ma[0] > self.long_ma[0] \
        and self.short_ma[-1] <= self.long_ma[-1]:
    self.order = self.buy(size=position_size)

The strategy does not exit merely because the averages cross back. It tracks the best close after entry and maintains a stop one current ATR away:

self.trailing_stop_price = max(
    self.trailing_stop_price,
    self.data.close[0] - stop_distance,
)

if self.data.close[0] <= self.trailing_stop_price:
    self.order = self.close()

Because ATR is recalculated every bar, the effective trailing distance adapts to changing market volatility.

Backtest Setup

Setting Value
Asset and benchmark ETH-USD
Period 2 years
Interval 1 day
Starting cash $10,000.00
Commission 0.10%
Short / long SMA 7 / 30
ATR period 14 days
Trailing distance 1 × ATR
Position allocation 95%
Strategy file VolatilityAdjustedMomentum.py

Equity Curve vs Buy-and-Hold

VolatilityAdjustedMomentum ETH-USD equity curve

The equity curve remained above the benchmark for most of the period and finished with an excess return above 114 percentage points.

Drawdown vs Buy-and-Hold

VolatilityAdjustedMomentum ETH-USD drawdown

Maximum drawdown was 14.33%, producing a 1.36 Sharpe ratio despite aggressive 95% allocation.

Rolling Return vs Buy-and-Hold

VolatilityAdjustedMomentum ETH-USD rolling return

The strategy won 56.4% of 63-day windows, 69.1% of 126-day windows, and 90.4% of 252-day windows. Median 126-day excess return was 22.32%.

Daily Return Distribution

VolatilityAdjustedMomentum ETH-USD daily returns

The return distribution shows the daily risk produced by a near-fully invested long-and-short system.

Research Takeaway

This is the cleanest result in the group: familiar indicators, 13 closed trades, a 61.54% win rate, strong Sharpe, controlled drawdown, and long-horizon rolling dominance. Its simplicity makes it especially suitable for parameter sensitivity and out-of-sample testing.

Explore the full package: Mega Backtrader Strategy Pack.

Disclaimer

This article is for research and educational use only. Backtests are not financial advice and do not guarantee future performance. Validate leverage, sizing, costs, execution, and out-of-sample behavior before trading.