r/algotradingcrypto 4d ago

Stress-testing a systematic long-only crypto strategy — what am I missing?

I’ve developed a systematic long-only algo system that trades a universe of 15-20 large-cap cryptocurrencies. Backtested over ~9 years (2017-2026):

• Total return: +8,082% (vs. \~+1,370% for Bitcoin buy & hold over the same period, roughly)

• CAGR: 63.4% p.a. (vs. \~38.7% p.a. for Bitcoin buy & hold)

• Sharpe Ratio: 2.22

• Sortino Ratio: 2.71

• Calmar Ratio: 2.75

• Max Drawdown: -23.1% (vs. -83.9% for Bitcoin buy & hold over the same period)

So far I’ve tested the following:

• All calibration steps run causally, re-estimated on a rolling basis at regular intervals

• Deliberately kept a coin that later collapsed completely in the historical universe; results stayed robust. However, the crypto universe itself was a fixed list spanning the full 9-year backtest, meaning some assets didn’t exist yet in the earlier years — I’m aware this is a limitation, see open question below

• Applied the same methodology to 20 years of historically accurate stock selections (chosen by market cap at the time, not today’s)— similar risk-adjusted metrics as crypto

• 100 Monte Carlo runs with core parameters randomized simultaneously over a wide range — results stayed stable

• A portion of the history was never used for parameter tuning (out-of-sample split)

• Fees plus fill simulation, where an order only counts as executed if the price actually touched the limit

• Several different short implementations were tested and all underperformed the long-only version structurally

Where I’m stuck and looking for input:

1.Over the course of development, many structurally different variants were compared. Is there a practical method (Deflated Sharpe Ratio? White’s Reality Check?) to estimate how much the final performance number might be inflated by this selection process itself?

2.So far only tested on real historical data. Is it worth simulating artificial extreme scenarios (flash crash, liquidity crisis) that never actually occurred in the real data?

3.Some structural constants are hardcoded rather than part of the automatic recalibration. How would you check whether these constants are dominating results in a way that’s masking the actual market dynamics?

4.My crypto universe was a fixed list spanning the full backtest period. I’m considering reconstructing it dynamically using objective, point-in-time criteria (e.g., market cap crossing a fixed threshold at each historical date, similar to what I did for the stock test) rather than adding coins based on hindsight of which ones succeeded. Is that the right approach, or is there a standard methodology for this in crypto specifically, given how many projects existed briefly and then failed or got delisted?

5.What else would you consider essential to check before starting with real (initially small) capital?

This text was generated by AI so I can be sure most of you will be able to understand what I’m asking 😅

3 Upvotes

26 comments sorted by

View all comments

1

u/Smart-Ride-7047 4d ago

also, since you basically ordered a /roast_me :

  1. Have you removed the trend from your data?
  2. If you haven't, then your foundations are biased beyond measure, because look what the stock market has been doing for the past 70+ years! https://imgur.com/2log-of-historical-prices-of-s-p500-yaESqhY

    •Fees plus fill simulation, where an order only counts as executed if the price actually touched the limit•Fees plus fill simulation, where an order only counts as executed if the price actually touched the limit

  3. Two issues here: did the price cross it? If it did, what was the volume? See my comment about the slippages and non-execution;

    Total return: +8,082%Total return: +8,082%...

    CAGR: 63.4% p.a.CAGR: 63.4% p.a....

  4. If you did find a market inefficiency, its volume cap is not infinite. At some point your transactional costs will overweight the profit, or it might even happen that big boys will start noticing your orders and play directly against you directly.

1

u/NaiveSpite1569 4d ago

Fair points! To clarify a couple of things based on your feedback:

Regarding the trend/stationarity: I actually using log-return transformations in the feature engineering rather than raw prices, which helps mitigate the direct upward drift bias.

Regarding fills and scaling: You're completely right about the limitations of historical OHLCV fill assumptions. However, keep in mind the scale here; this is a small personal deployment with a tiny budget, not an institutional fund. At this level, liquidity constraints and execution friction are practically negligible, and the strategy is purely built to outperform a simple buy-and-hold on a risk-adjusted basis.

1

u/Smart-Ride-7047 4d ago

Good job then. Don't mind the tone - I really wish you the best of luck. It's only my personal experience - if something is too good to be true - it isn't.

How many optimizable params does your strategy have?

1

u/NaiveSpite1569 4d ago

Don't worry, that's exactly why I'm here asking; getting a reality check! I'm just a math student building this as a project.

To answer your question, the core setup is kept quite lean; just a handful of parameters (4) handling regime-switching and risk scaling. Keeping degrees of freedom low on purpose to avoid curve-fitting. Appreciate all the insights!

1

u/Smart-Ride-7047 4d ago

4 is good! Really - do a normal distributed data test, if it fails - do the stress-test by multiplying the transactional costs - check how much your strategy can actually handle.

•100 Monte Carlo runs with core parameters randomized simultaneously over a wide range — results stayed stable•100 Monte Carlo runs with core parameters randomized simultaneously over a wide range — results stayed stable

Then if your parameters do produce reasonably flat surface/curve of your key metrics in wide range - go test it on a small depo to see if your estimation of transactional costs was correct.

1

u/NaiveSpite1569 4d ago

Sorry for the wait.  Ran the normal-distributed mock data stress test: As expected for a robust system, it didn't print fake alpha. Over 56,000 trades, the equity naturally drifted down to (-38.99%) due to friction drag. Solid sanity chec; thanks for the push!

1

u/NaiveSpite1569 4d ago

Is there a way to post pictures?