← All articles

Does your strategy behave differently in high volatility?

Compare one unchanged strategy across conditions known at entry, using explicit volatility labels, real trade counts, and careful timing.

Strategy methodsPublished By Stratifyre

Topics

BacktestingMarket RegimesTrade Analysis

An overall backtest hides the conditions surrounding its trades. A strategy might collect most of its gains during large price swings, while smaller moves produce repeated reversals. Market regime analysis asks whether those outcomes differ under a definition you can apply consistently.

The timing matters as much as the definition. A condition measured after a trade closes cannot explain what was knowable when you entered. Start with one unchanged strategy, label each entry using earlier completed prices, and keep every trade in the comparison.

In the selected Bitcoin example below, higher entry volatility accompanies a larger average recorded profit. Both groups finish positive, and the sample contains only 19 trades. That is a historical observation to investigate, not evidence that a high-volatility filter would improve future trading.

Keep the strategy fixed

We reused a completed Binance BTC/USDT hourly backtest covering April 1–June 30, 2025. Its rules bought 0.05 BTC when EMA(20) crossed above EMA(50) while flat, then flattened the position on a downward crossover while holding BTC. Capital started at $10,000; execution was configured as on-open, with pessimistic fills, 0.05% crypto slippage, and flattening at the end.

Actual Bitcoin backtest configuration showing 10000 dollars, April through June 2025, hourly intervals, on-open execution and pessimistic fills
Saved configuration from the retained completed run. The regime comparison changes no entry, exit, quantity, or execution setting; it groups that run's existing trades.

The report contains seven winners and twelve losses, totaling +$958.09 recorded trade P&L. The configured 0.10% crypto commission returned zero fees in every retained trade. These figures therefore do not establish performance after that commission, even though the report is complete.

Actual completed Bitcoin report displaying 958.09 dollars realized profit and 36.8 percent win rate
The actual source report, captured from the demo account. Its headline result is the common starting point for both author-created groups; commission application remains unverified.

This quarter was already selected as a profitable example for our profit-concentration article. We knew its trade outcomes before defining the volatility labels. We fixed the formula and threshold before calculating those labels, but this remains retrospective analysis of a selected historical result.

Define volatility using prices available at entry

For each recorded entry, we took 25 consecutive completed hourly closes, producing 24 hourly log returns. We calculated their sample standard deviation, multiplied it by √24, and expressed the result as a percentage. This is our trailing 24-hour volatility proxy; it describes recent movement without forecasting the next day or its direction.

Hourly return: r = log(current close / previous close)

Volatility proxy: 100 × sample standard deviation of 24 returns × √24

Lower: below 2%. Higher: 2% or above.

The 2% boundary is an author-chosen convention for this example. It is neither a native Stratifyre classification nor an optimized threshold. We did not move it after seeing which group earned more.

An hourly candle stamped 19:00 UTC spans the following hour. For a 20:00 entry, that candle’s close is eligible; the 20:00 candle’s eventual close is excluded. The earliest close supplies the starting price for the first return, which is why 24 returns require 25 closes. If a required close is missing, record the trade as unclassified instead of filling the gap silently.

Our product-data request returned 2,016 consecutive hourly bars from April 2 through June 24, 2025, sufficient for every recorded entry from April 4 through June 23. All 19 trades had complete inputs; none were excluded. The analysis retains 463 distinct closes across their overlapping windows. These are bars fetched after the original execution, so historical data revisions remain a possible difference from the original run.

Compare counts before comparing totals

The unchanged strategy produced the following groups. Dollar figures use the recorded trade P&L, with the commission limitation above; winning and losing counts depend on that same P&L sign. The labels describe conditions at entry, while each profit or loss spans the entire holding period.

Entry volatility Trades Winners / losses Recorded P&L Mean per trade Profit factor
Lower: below 2% 10 2 / 8 +$199.15 +$19.91 1.50
Higher: at least 2% 9 5 / 4 +$758.94 +$84.33 8.05
All trades 19 7 / 12 +$958.09 +$50.43 2.90

Profit factor here divides positive recorded P&L by the absolute value of negative recorded P&L. There were no zero-P&L trades. The group totals reconcile to the full trade list without changing the strategy or removing losses.

Different historical averages, very small samples

Author-created analysis of retained executed trades: 10 lower-volatility entries and nine higher-volatility entries. These averages are descriptive; they are not a native regime report or a separately executed filtered strategy.
View example data
Entry groupMean recorded P&L ($)
Lower19.91476985
Higher84.32658581

The higher group still includes four losses. For example, the April 4 entry had a trailing proxy of 3.55% and recorded a $66.90 loss. Conversely, the April 21 entry had a 1.18% proxy and became the run’s largest winner, earning $431.62. A group average does not make every entry in that group attractive.

Native exit segments answer a different question

Stratifyre’s native time segments include Exit Day of Week, Exit Month, and Exit Quarter. They group completed trades by their UTC exit timestamp. In this run, the Exit Month totals were April +$353.61 across six trades, May +$487.08 across seven, and June +$117.39 across six.

Actual native Exit Month comparison with columns 4, 5 and 6 and PnL contributions 36.9, 50.8 and 12.3 percent
The actual native Exit Month view: 4, 5, and 6 mean April, May, and June. Missing return, Sharpe, and drawdown fields remain blank. This screen does not show the author-created volatility groups.

An exit-month result tells you when completed trade P&L was attributed. It does not establish which conditions were present at entry. Similarly, grouping trades by their eventual return identifies outcome sizes; it cannot provide a condition known before taking the trade.

Turn the observation into a new test

Nine and ten trades are too few to establish a dependable regime effect. Trades share one instrument and one quarter; overlapping volatility windows are not independent experiments. Fixed 0.05 BTC quantity also gives different dollar exposure as price changes, so these averages are not an equal-risk comparison.

Volatility can change after entry. We held each entry label fixed, rather than relabeling a trade as market conditions evolved. This analysis neither measures time spent in each regime nor estimates marked-to-market drawdown for separate regime portfolios. It also does not revalidate the original indicator warmup or chart-to-fill replay timing.

A useful next experiment would freeze the same labels and unchanged rules for an untouched window, keep all outcomes, and reconcile actual charged costs. If you then propose a volatility entry filter, test it as a new strategy with its own cash, skipped signals, and trade sequence. Subtracting one group’s trades from this report cannot reproduce that execution.

Avoid repeatedly trying boundaries until a historical split looks convincing: searching many variants on the same data can produce false discoveries, as discussed in Bailey and colleagues’ original backtest-overfitting research. We have not calculated an overfitting probability or statistical significance for this example.

Start by inspecting the available performance segments and writing down exactly which timestamp each uses. Preserve that distinction when adding your own entry-time labels, then use a separate evaluation window to test the resulting hypothesis.

Put your strategy rules to the test

Build your strategy, inspect historical trades, and review the assumptions behind your results.

Build and test your strategy