{"id":3609,"date":"2023-03-22T19:55:19","date_gmt":"2023-03-22T20:55:19","guid":{"rendered":"http:\/\/46.165.209.245\/~dporir\/backtesting-pitfalls\/"},"modified":"2025-10-27T16:03:18","modified_gmt":"2025-10-27T17:03:18","slug":"backtesting-pitfalls","status":"publish","type":"post","link":"https:\/\/forvest.io\/blog\/backtesting-pitfalls\/","title":{"rendered":"Common Backtesting Mistakes to Avoid in Crypto Investing"},"content":{"rendered":"<p>Most failed crypto backtests share avoidable flaws: look-ahead and survivorship bias, friction and liquidity blind spots, parameter cliffs, and one-era overfitting. Fix them with time-based splits (Design \u2192 OOS \u2192 Holdout), walk-forward validation, and simple robustness checks so results stay honest when markets shift.<\/p>\n<h2 data-start=\"540\" data-end=\"548\">TL;DR<\/h2>\n<ul data-start=\"549\" data-end=\"933\">\n<li data-start=\"549\" data-end=\"644\">\n<p data-start=\"551\" data-end=\"644\">Most \u201camazing\u201d backtests break due to <strong data-start=\"589\" data-end=\"620\">biases, frictions\/liquidity<\/strong>, and <strong data-start=\"626\" data-end=\"641\">overfitting<\/strong>.<\/p>\n<\/li>\n<li data-start=\"645\" data-end=\"754\">\n<p data-start=\"647\" data-end=\"754\">Build on three pillars: <strong data-start=\"671\" data-end=\"692\">time-based splits<\/strong>, <strong data-start=\"694\" data-end=\"721\">walk-forward validation<\/strong>, and <strong data-start=\"727\" data-end=\"751\">friction-in-the-loop<\/strong>.<\/p>\n<\/li>\n<li data-start=\"755\" data-end=\"861\">\n<p data-start=\"757\" data-end=\"861\">Choose <strong data-start=\"764\" data-end=\"786\">parameter plateaus<\/strong> (not spikes) and run <strong data-start=\"808\" data-end=\"835\">basic robustness checks<\/strong> before risking capital.<\/p>\n<\/li>\n<li data-start=\"862\" data-end=\"933\">\n<p data-start=\"864\" data-end=\"933\">A quick <strong data-start=\"872\" data-end=\"889\">Pre-Flight QA<\/strong> in Part 2 makes deployment decisions clear.<\/p>\n<\/li>\n<\/ul>\n<hr data-start=\"935\" data-end=\"938\" \/>\n<h2 data-start=\"940\" data-end=\"976\">Why most backtests fail investors<\/h2>\n<p data-start=\"977\" data-end=\"1347\">A backtest is a decision tool, not a trophy. Traders often optimize for the prettiest equity curve; investors need <strong data-start=\"1092\" data-end=\"1106\">durability<\/strong>\u2014results that survive regime shifts, fees, slippage, and imperfect execution. When a test leaks future information, ignores tradability, or hinges on a magic parameter that only works in one era, the curve looks amazing\u2026 until you deploy it.<\/p>\n<p data-start=\"1349\" data-end=\"1574\">Good investor backtests are boringly rigorous: they separate time properly, price in frictions <strong data-start=\"1444\" data-end=\"1454\">inside<\/strong> the loop, and prove the idea across windows. The goal isn\u2019t to maximize past CAGR\u2014it\u2019s to <strong data-start=\"1545\" data-end=\"1573\">minimize nasty surprises<\/strong>.<\/p>\n<p data-start=\"1349\" data-end=\"1574\"><img decoding=\"async\" class=\"emoji\" style=\"background-color: #ffffff;\" role=\"img\" draggable=\"false\" src=\"https:\/\/s.w.org\/images\/core\/emoji\/15.0.3\/svg\/1f4cc.svg\" alt=\"\ud83d\udccc\" \/>\u00a0<strong>Related:<\/strong>\u00a0Want to start from the basics? See\u00a0<a href=\"https:\/\/forvest.io\/blog\/crypto-portfolio-backtesting-guide\/\"><strong>Crypto Portfolio Backtesting \u2014 The Complete Guide<\/strong><\/a><\/p>\n<hr data-start=\"1576\" data-end=\"1579\" \/>\n<div id=\"attachment_4492\" style=\"width: 810px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-4492\" class=\"wp-image-4492 size-full\" src=\"https:\/\/forvest.io\/blog\/wp-content\/uploads\/2023\/03\/Backtesting-bias-traps-illustration.jpg\" alt=\"Backtesting bias traps illustration \u2014 comparing a perfect curve with a realistic equity line, showing look-ahead and survivorship bias visually.\" width=\"800\" height=\"457\" srcset=\"https:\/\/forvest.io\/blog\/wp-content\/uploads\/2023\/03\/Backtesting-bias-traps-illustration.jpg 800w, https:\/\/forvest.io\/blog\/wp-content\/uploads\/2023\/03\/Backtesting-bias-traps-illustration-300x171.jpg 300w, https:\/\/forvest.io\/blog\/wp-content\/uploads\/2023\/03\/Backtesting-bias-traps-illustration-768x439.jpg 768w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><p id=\"caption-attachment-4492\" class=\"wp-caption-text\">Visualizing bias traps \u2014 perfect curves often hide future leaks and missing failures.<\/p><\/div>\n<h2 data-start=\"1581\" data-end=\"1618\">Top mistakes (and how to fix each)<\/h2>\n<h3 data-start=\"1620\" data-end=\"1642\">1) Look-ahead bias<\/h3>\n<p data-start=\"1643\" data-end=\"1812\"><strong data-start=\"1643\" data-end=\"1665\">What it looks like<\/strong><br data-start=\"1665\" data-end=\"1668\" \/>Features or filters computed with information that wasn\u2019t available at decision time (e.g., endpoint-dependent indicators, future-aware labels).<\/p>\n<p data-start=\"1814\" data-end=\"1934\"><strong data-start=\"1814\" data-end=\"1830\">Why it hurts<\/strong><br data-start=\"1830\" data-end=\"1833\" \/>You\u2019re borrowing tomorrow\u2019s certainty to \u201cpredict\u201d yesterday. Live results won\u2019t have that privilege.<\/p>\n<p data-start=\"1936\" data-end=\"1945\"><strong data-start=\"1936\" data-end=\"1943\">Fix<\/strong><\/p>\n<ul data-start=\"1946\" data-end=\"2153\">\n<li data-start=\"1946\" data-end=\"2018\">\n<p data-start=\"1948\" data-end=\"2018\">Lock time indices; compute all features from <strong data-start=\"1993\" data-end=\"2010\">strictly past<\/strong> data.<\/p>\n<\/li>\n<li data-start=\"2019\" data-end=\"2089\">\n<p data-start=\"2021\" data-end=\"2089\">Rebuild the historical data pipeline exactly as it would have run.<\/p>\n<\/li>\n<li data-start=\"2090\" data-end=\"2153\">\n<p data-start=\"2092\" data-end=\"2153\">Use <strong data-start=\"2096\" data-end=\"2113\">chronological<\/strong> splits only (no shuffling across eras).<\/p>\n<\/li>\n<\/ul>\n<hr data-start=\"2155\" data-end=\"2158\" \/>\n<h3 data-start=\"2160\" data-end=\"2184\">2) Survivorship bias<\/h3>\n<p data-start=\"2185\" data-end=\"2290\"><strong data-start=\"2185\" data-end=\"2207\">What it looks like<\/strong><br data-start=\"2207\" data-end=\"2210\" \/>Testing on today\u2019s survivors only; delisted\/failed projects vanish from history.<\/p>\n<p data-start=\"2292\" data-end=\"2380\"><strong data-start=\"2292\" data-end=\"2308\">Why it hurts<\/strong><br data-start=\"2308\" data-end=\"2311\" \/>Inflates returns and understates drawdowns, especially in alt cycles.<\/p>\n<p data-start=\"2382\" data-end=\"2391\"><strong data-start=\"2382\" data-end=\"2389\">Fix<\/strong><\/p>\n<ul data-start=\"2392\" data-end=\"2574\">\n<li data-start=\"2392\" data-end=\"2461\">\n<p data-start=\"2394\" data-end=\"2461\">Use a <strong data-start=\"2400\" data-end=\"2432\">complete historical universe<\/strong> (including dead\/delisted).<\/p>\n<\/li>\n<li data-start=\"2462\" data-end=\"2534\">\n<p data-start=\"2464\" data-end=\"2534\">Apply <strong data-start=\"2470\" data-end=\"2494\">liquidity\/market-cap<\/strong> filters per window (not fixed lists).<\/p>\n<\/li>\n<li data-start=\"2535\" data-end=\"2574\">\n<p data-start=\"2537\" data-end=\"2574\">Document excluded assets and reasons.<\/p>\n<\/li>\n<\/ul>\n<hr data-start=\"2576\" data-end=\"2579\" \/>\n<h3 data-start=\"2581\" data-end=\"2621\">3) Frictions &amp; liquidity blind spots<\/h3>\n<p data-start=\"2622\" data-end=\"2736\"><strong data-start=\"2622\" data-end=\"2644\">What it looks like<\/strong><br data-start=\"2644\" data-end=\"2647\" \/>Ignoring commissions, spreads, slippage, and venue depth\u2014or applying them after the fact.<\/p>\n<p data-start=\"2738\" data-end=\"2844\"><strong data-start=\"2738\" data-end=\"2754\">Why it hurts<\/strong><br data-start=\"2754\" data-end=\"2757\" \/>Costs compound; thin books move price against you. High turnover can erase paper edges.<\/p>\n<p data-start=\"2846\" data-end=\"2855\"><strong data-start=\"2846\" data-end=\"2853\">Fix<\/strong><\/p>\n<ul data-start=\"2856\" data-end=\"3036\">\n<li data-start=\"2856\" data-end=\"2914\">\n<p data-start=\"2858\" data-end=\"2914\">Model <strong data-start=\"2864\" data-end=\"2899\">fees + slippage inside the loop<\/strong> (per trade).<\/p>\n<\/li>\n<li data-start=\"2915\" data-end=\"2978\">\n<p data-start=\"2917\" data-end=\"2978\">Enforce <strong data-start=\"2925\" data-end=\"2950\">min volume\/market-cap<\/strong> per window; cap turnover.<\/p>\n<\/li>\n<li data-start=\"2979\" data-end=\"3036\">\n<p data-start=\"2981\" data-end=\"3036\"><strong data-start=\"2981\" data-end=\"2991\">Stress<\/strong> costs at 1.5\u20132\u00d7 to see if the edge survives.<\/p>\n<\/li>\n<\/ul>\n<hr data-start=\"3038\" data-end=\"3041\" \/>\n<div id=\"attachment_4493\" style=\"width: 810px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-4493\" class=\"wp-image-4493 size-full\" src=\"https:\/\/forvest.io\/blog\/wp-content\/uploads\/2023\/03\/Robust-versus-fragile-parameter.jpg\" alt=\"Robust versus fragile parameter illustration \u2014 showing a wide plateau for stability and a narrow spike for overfitting risk.\" width=\"800\" height=\"457\" srcset=\"https:\/\/forvest.io\/blog\/wp-content\/uploads\/2023\/03\/Robust-versus-fragile-parameter.jpg 800w, https:\/\/forvest.io\/blog\/wp-content\/uploads\/2023\/03\/Robust-versus-fragile-parameter-300x171.jpg 300w, https:\/\/forvest.io\/blog\/wp-content\/uploads\/2023\/03\/Robust-versus-fragile-parameter-768x439.jpg 768w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><p id=\"caption-attachment-4493\" class=\"wp-caption-text\">Choose stability over perfection \u2014 plateaus survive, spikes break.<\/p><\/div>\n<h3 data-start=\"3043\" data-end=\"3082\">4) Parameter cliffs (curve fitting)<\/h3>\n<p data-start=\"3083\" data-end=\"3213\"><strong data-start=\"3083\" data-end=\"3105\">What it looks like<\/strong><br data-start=\"3105\" data-end=\"3108\" \/>The system \u201cworks\u201d only at a razor-thin setting (e.g., 127-day lookback is magical; 120 or 130 break it).<\/p>\n<p data-start=\"3215\" data-end=\"3300\"><strong data-start=\"3215\" data-end=\"3231\">Why it hurts<\/strong><br data-start=\"3231\" data-end=\"3234\" \/>Cliffs signal you fit noise; small live differences flip outcomes.<\/p>\n<p data-start=\"3302\" data-end=\"3311\"><strong data-start=\"3302\" data-end=\"3309\">Fix<\/strong><\/p>\n<ul data-start=\"3312\" data-end=\"3504\">\n<li data-start=\"3312\" data-end=\"3385\">\n<p data-start=\"3314\" data-end=\"3385\">Prefer <strong data-start=\"3321\" data-end=\"3333\">plateaus<\/strong>\u2014choose parameters from a <strong data-start=\"3359\" data-end=\"3382\">broad stable region<\/strong>.<\/p>\n<\/li>\n<li data-start=\"3386\" data-end=\"3436\">\n<p data-start=\"3388\" data-end=\"3436\">Keep rules simple; avoid chains of thresholds.<\/p>\n<\/li>\n<li data-start=\"3437\" data-end=\"3504\">\n<p data-start=\"3439\" data-end=\"3504\">Validate stability with <strong data-start=\"3463\" data-end=\"3482\">rolling windows<\/strong> and mild noise tests.<\/p>\n<\/li>\n<\/ul>\n<hr data-start=\"3506\" data-end=\"3509\" \/>\n<h3 data-start=\"3511\" data-end=\"3536\">5) One-era dependence<\/h3>\n<p data-start=\"3537\" data-end=\"3635\"><strong data-start=\"3537\" data-end=\"3559\">What it looks like<\/strong><br data-start=\"3559\" data-end=\"3562\" \/>Shines in a bull (e.g., 2020\u20132021); bleeds in 2022 bear or sideways chop.<\/p>\n<p data-start=\"3637\" data-end=\"3732\"><strong data-start=\"3637\" data-end=\"3653\">Why it hurts<\/strong><br data-start=\"3653\" data-end=\"3656\" \/>Live markets rotate regimes. A single-phase hero won\u2019t survive a full cycle.<\/p>\n<p data-start=\"3734\" data-end=\"3743\"><strong data-start=\"3734\" data-end=\"3741\">Fix<\/strong><\/p>\n<ul data-start=\"3744\" data-end=\"3977\">\n<li data-start=\"3744\" data-end=\"3816\">\n<p data-start=\"3746\" data-end=\"3816\">Slice results by <strong data-start=\"3763\" data-end=\"3785\">bull\/bear\/sideways<\/strong>; name the weak phase openly.<\/p>\n<\/li>\n<li data-start=\"3817\" data-end=\"3898\">\n<p data-start=\"3819\" data-end=\"3898\">Add <strong data-start=\"3823\" data-end=\"3841\">regime filters<\/strong> or slower cadence in chop; constrain exposure in bear.<\/p>\n<\/li>\n<li data-start=\"3899\" data-end=\"3977\">\n<p data-start=\"3901\" data-end=\"3977\">Require the strategy\u2019s <strong data-start=\"3924\" data-end=\"3939\">personality<\/strong> to remain recognizable across slices.<\/p>\n<\/li>\n<\/ul>\n<hr data-start=\"3979\" data-end=\"3982\" \/>\n<h3 data-start=\"3984\" data-end=\"4019\">6) No holdout \/ no walk-forward<\/h3>\n<p data-start=\"4020\" data-end=\"4134\"><strong data-start=\"4020\" data-end=\"4042\">What it looks like<\/strong><br data-start=\"4042\" data-end=\"4045\" \/>Optimizing on one span and reporting the same span; or \u201cpeeking\u201d and retuning repeatedly.<\/p>\n<p data-start=\"4136\" data-end=\"4249\"><strong data-start=\"4136\" data-end=\"4152\">Why it hurts<\/strong><br data-start=\"4152\" data-end=\"4155\" \/>You don\u2019t know if the idea generalizes. Retuning after seeing results is hindsight dressed up.<\/p>\n<p data-start=\"4251\" data-end=\"4260\"><strong data-start=\"4251\" data-end=\"4258\">Fix<\/strong><\/p>\n<ul data-start=\"4261\" data-end=\"4478\">\n<li data-start=\"4261\" data-end=\"4343\">\n<p data-start=\"4263\" data-end=\"4343\">Split by time: <strong data-start=\"4278\" data-end=\"4293\">Design (IS)<\/strong> \u2192 <strong data-start=\"4296\" data-end=\"4318\">Validation (OOS-1)<\/strong> \u2192 <strong data-start=\"4321\" data-end=\"4340\">Holdout (OOS-2)<\/strong>.<\/p>\n<\/li>\n<li data-start=\"4344\" data-end=\"4387\">\n<p data-start=\"4346\" data-end=\"4387\"><strong data-start=\"4346\" data-end=\"4368\">Touch Holdout once<\/strong> at the very end.<\/p>\n<\/li>\n<li data-start=\"4388\" data-end=\"4478\">\n<p data-start=\"4390\" data-end=\"4478\">Add <strong data-start=\"4394\" data-end=\"4410\">walk-forward<\/strong>: sequential train-then-test windows stitched into one equity curve.<\/p>\n<\/li>\n<\/ul>\n<p><img decoding=\"async\" class=\"emoji\" role=\"img\" draggable=\"false\" src=\"https:\/\/s.w.org\/images\/core\/emoji\/15.0.3\/svg\/1f4cc.svg\" alt=\"\ud83d\udccc\" \/>\u00a0<strong>Related:<\/strong>\u00a0 \u00a0Learn more about <strong><a href=\"https:\/\/forvest.io\/blog\/types-of-backtest\/\">Types of Investment Backtests: Historical, Walk-Forward &amp; Live<\/a><\/strong><\/p>\n<hr data-start=\"4480\" data-end=\"4483\" \/>\n<h3 data-start=\"4485\" data-end=\"4513\">7) Unrealistic execution<\/h3>\n<p data-start=\"4514\" data-end=\"4647\"><strong data-start=\"4514\" data-end=\"4536\">What it looks like<\/strong><br data-start=\"4536\" data-end=\"4539\" \/>Assuming perfect fills at close, no latency, never missing a rebalance, and unlimited capacity in thin alts.<\/p>\n<p data-start=\"4649\" data-end=\"4785\"><strong data-start=\"4649\" data-end=\"4665\">Why it hurts<\/strong><br data-start=\"4665\" data-end=\"4668\" \/>Real portfolios miss trades, slip by minutes\/days, or partially fill. Paper edges vanish under friction and disorder.<\/p>\n<p data-start=\"4787\" data-end=\"4796\"><strong data-start=\"4787\" data-end=\"4794\">Fix<\/strong><\/p>\n<ul data-start=\"4797\" data-end=\"5029\">\n<li data-start=\"4797\" data-end=\"4875\">\n<p data-start=\"4799\" data-end=\"4875\">Add <strong data-start=\"4803\" data-end=\"4819\">timing drift<\/strong> (\u00b11\u20132 days) and <strong data-start=\"4836\" data-end=\"4853\">missed-action<\/strong> tests (~10% skips).<\/p>\n<\/li>\n<li data-start=\"4876\" data-end=\"4951\">\n<p data-start=\"4878\" data-end=\"4951\">Use <strong data-start=\"4882\" data-end=\"4901\">path dispersion<\/strong> (Monte Carlo resampling) to see outcome spread.<\/p>\n<\/li>\n<li data-start=\"4952\" data-end=\"5029\">\n<p data-start=\"4954\" data-end=\"5029\">Start live with <strong data-start=\"4970\" data-end=\"4984\">small size<\/strong> and confirm fills\/latency match assumptions.<\/p>\n<\/li>\n<\/ul>\n<p data-start=\"4954\" data-end=\"5029\"><span style=\"font-size: 24px; font-weight: bold;\">Time-based split that matches investor reality<\/span><\/p>\n<p data-start=\"50\" data-end=\"181\">Backtests must respect time. Use chronological splits so you never \u201clearn\u201d from the future and you can judge generalization fairly.<\/p>\n<p data-start=\"183\" data-end=\"241\"><strong data-start=\"183\" data-end=\"241\">Table \u2014 Time-based split that matches investor reality<\/strong><\/p>\n<div class=\"_tableContainer_1rjym_1\">\n<div class=\"group _tableWrapper_1rjym_13 flex w-fit flex-col-reverse\" tabindex=\"-1\">\n<table class=\"w-fit min-w-(--thread-content-width)\" data-start=\"243\" data-end=\"620\">\n<thead data-start=\"243\" data-end=\"287\">\n<tr data-start=\"243\" data-end=\"287\">\n<th data-start=\"243\" data-end=\"249\" data-col-size=\"sm\">Phase<\/th>\n<th data-start=\"249\" data-end=\"268\" data-col-size=\"sm\">Share of history<\/th>\n<th data-start=\"268\" data-end=\"278\" data-col-size=\"sm\">Purpose<\/th>\n<th data-start=\"278\" data-end=\"287\" data-col-size=\"sm\">Rules<\/th>\n<\/tr>\n<\/thead>\n<tbody data-start=\"312\" data-end=\"620\">\n<tr data-start=\"312\" data-end=\"426\">\n<td data-start=\"312\" data-end=\"331\" data-col-size=\"sm\">Design (In-Sample)<\/td>\n<td data-start=\"331\" data-end=\"350\" data-col-size=\"sm\">~60\u201370% earliest<\/td>\n<td data-start=\"350\" data-end=\"384\" data-col-size=\"sm\">Build simple, explainable logic<\/td>\n<td data-start=\"384\" data-end=\"426\" data-col-size=\"sm\">Limit variants; avoid complexity creep<\/td>\n<\/tr>\n<tr data-start=\"427\" data-end=\"530\">\n<td data-start=\"427\" data-end=\"446\" data-col-size=\"sm\">Validation (OOS-1)<\/td>\n<td data-start=\"446\" data-end=\"461\" data-col-size=\"sm\">~15\u201320% next<\/td>\n<td data-start=\"461\" data-end=\"494\" data-col-size=\"sm\">Test only shortlisted variants<\/td>\n<td data-start=\"494\" data-end=\"530\" data-col-size=\"sm\">No retuning after seeing results<\/td>\n<\/tr>\n<tr data-start=\"531\" data-end=\"620\">\n<td data-start=\"531\" data-end=\"547\" data-col-size=\"sm\">Holdout (OOS-2)<\/td>\n<td data-start=\"547\" data-end=\"562\" data-col-size=\"sm\">~15\u201320% last<\/td>\n<td data-start=\"562\" data-end=\"584\" data-col-size=\"sm\">One-time final exam<\/td>\n<td data-start=\"584\" data-end=\"620\" data-col-size=\"sm\">Touch once; confirm generalization<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p data-start=\"622\" data-end=\"852\"><strong data-start=\"622\" data-end=\"641\">How to read it:<\/strong> Similar character between Design and OOS-1 is a good sign; graceful (not catastrophic) degradation in Holdout suggests real signal. If results collapse when you move forward in time, the edge is likely overfit.<\/p>\n<hr data-start=\"854\" data-end=\"857\" \/>\n<h2 data-start=\"859\" data-end=\"900\">Robustness checks that actually matter<\/h2>\n<p data-start=\"901\" data-end=\"1021\">Once you have a \u201cgood\u201d result, try to break it on purpose. If it survives these tests, you probably have something real.<\/p>\n<p data-start=\"1023\" data-end=\"1067\"><strong data-start=\"1023\" data-end=\"1067\">Table \u2014 Robustness Stress-Test Checklist<\/strong><\/p>\n<div class=\"_tableContainer_1rjym_1\">\n<div class=\"group _tableWrapper_1rjym_13 flex w-fit flex-col-reverse\" tabindex=\"-1\">\n<table class=\"w-fit min-w-(--thread-content-width)\" data-start=\"1069\" data-end=\"1871\">\n<thead data-start=\"1069\" data-end=\"1123\">\n<tr data-start=\"1069\" data-end=\"1123\">\n<th data-start=\"1069\" data-end=\"1078\" data-col-size=\"sm\">Category<\/th>\n<th data-start=\"1078\" data-end=\"1085\" data-col-size=\"sm\">Test<\/th>\n<th data-start=\"1085\" data-end=\"1099\" data-col-size=\"sm\">What you do<\/th>\n<th data-start=\"1099\" data-end=\"1123\" data-col-size=\"md\">What you want to see<\/th>\n<\/tr>\n<\/thead>\n<tbody data-start=\"1148\" data-end=\"1871\">\n<tr data-start=\"1148\" data-end=\"1237\">\n<td data-start=\"1148\" data-end=\"1157\" data-col-size=\"sm\">Friction<\/td>\n<td data-start=\"1157\" data-end=\"1171\" data-col-size=\"sm\">Cost stress<\/td>\n<td data-start=\"1171\" data-end=\"1196\" data-col-size=\"sm\">1.5\u20132\u00d7 fees &amp; slippage<\/td>\n<td data-start=\"1196\" data-end=\"1237\" data-col-size=\"md\">Character survives; not a thesis flip<\/td>\n<\/tr>\n<tr data-start=\"1238\" data-end=\"1346\">\n<td data-start=\"1238\" data-end=\"1243\" data-col-size=\"sm\">Data<\/td>\n<td data-start=\"1243\" data-end=\"1261\" data-col-size=\"sm\">Noise injection<\/td>\n<td data-start=\"1261\" data-end=\"1299\" data-col-size=\"sm\">\u00b10.5\u20131.0% price jitter on rebalance<\/td>\n<td data-start=\"1299\" data-end=\"1346\" data-col-size=\"md\">Rankings stable; metrics degrade gracefully<\/td>\n<\/tr>\n<tr data-start=\"1347\" data-end=\"1448\">\n<td data-start=\"1347\" data-end=\"1354\" data-col-size=\"sm\">Timing<\/td>\n<td data-start=\"1354\" data-end=\"1367\" data-col-size=\"sm\">Drift test<\/td>\n<td data-start=\"1367\" data-end=\"1398\" data-col-size=\"sm\">Shift rebalance by \u00b11\u20132 days<\/td>\n<td data-start=\"1398\" data-end=\"1448\" data-col-size=\"md\">No regime personality swap; similar DD ceiling<\/td>\n<\/tr>\n<tr data-start=\"1449\" data-end=\"1569\">\n<td data-start=\"1449\" data-end=\"1459\" data-col-size=\"sm\">Liquidity<\/td>\n<td data-start=\"1459\" data-end=\"1480\" data-col-size=\"sm\">Tradability filter<\/td>\n<td data-start=\"1480\" data-end=\"1516\" data-col-size=\"sm\">Enforce min volume\/cap per window<\/td>\n<td data-start=\"1516\" data-end=\"1569\" data-col-size=\"md\">Returns stay believable; turnover drops if needed<\/td>\n<\/tr>\n<tr data-start=\"1570\" data-end=\"1670\">\n<td data-start=\"1570\" data-end=\"1575\" data-col-size=\"sm\">Path<\/td>\n<td data-start=\"1575\" data-end=\"1589\" data-col-size=\"sm\">Monte Carlo<\/td>\n<td data-start=\"1589\" data-end=\"1627\" data-col-size=\"sm\">Resample day\/order; view dispersion<\/td>\n<td data-start=\"1627\" data-end=\"1670\" data-col-size=\"md\">Middle of distribution still investable<\/td>\n<\/tr>\n<tr data-start=\"1671\" data-end=\"1780\">\n<td data-start=\"1671\" data-end=\"1681\" data-col-size=\"sm\">Execution<\/td>\n<td data-start=\"1681\" data-end=\"1698\" data-col-size=\"sm\">Missed actions<\/td>\n<td data-start=\"1698\" data-end=\"1730\" data-col-size=\"sm\">Randomly skip ~10% rebalances<\/td>\n<td data-start=\"1730\" data-end=\"1780\" data-col-size=\"md\">No collapse; slightly lower but intact profile<\/td>\n<\/tr>\n<tr data-start=\"1781\" data-end=\"1871\">\n<td data-start=\"1781\" data-end=\"1788\" data-col-size=\"sm\">Regime<\/td>\n<td data-start=\"1788\" data-end=\"1803\" data-col-size=\"sm\">Sliced tests<\/td>\n<td data-start=\"1803\" data-end=\"1836\" data-col-size=\"sm\">Bull \/ bear \/ sideways subsets<\/td>\n<td data-start=\"1836\" data-end=\"1871\" data-col-size=\"md\">Known weak phase but bounded pain<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<hr data-start=\"1873\" data-end=\"1876\" \/>\n<h2 data-start=\"1878\" data-end=\"1916\">Pre-Flight QA (30-minute checklist)<\/h2>\n<ul class=\"contains-task-list\" data-start=\"1917\" data-end=\"2852\">\n<li class=\"task-list-item\" data-start=\"1917\" data-end=\"2027\">\n<p data-start=\"1919\" data-end=\"2027\">\u00a0<strong data-start=\"1923\" data-end=\"1947\">Chronological splits<\/strong> in place (Design \u2192 OOS-1 \u2192 Holdout), covering at least one bull and one bear.<\/p>\n<\/li>\n<li class=\"task-list-item\" data-start=\"2028\" data-end=\"2129\">\n<p data-start=\"2030\" data-end=\"2129\"><strong data-start=\"2034\" data-end=\"2058\">Friction-in-the-loop<\/strong> (fees, slippage, and basic liquidity constraints modeled per trade).<\/p>\n<\/li>\n<li class=\"task-list-item\" data-start=\"2130\" data-end=\"2225\">\n<p data-start=\"2132\" data-end=\"2225\"><strong data-start=\"2136\" data-end=\"2157\">Parameter plateau<\/strong> chosen (not a single spike); rules remain simple and explainable.<\/p>\n<\/li>\n<li class=\"task-list-item\" data-start=\"2226\" data-end=\"2326\">\n<p data-start=\"2228\" data-end=\"2326\">\u00a0<strong data-start=\"2232\" data-end=\"2248\">Walk-forward<\/strong> run with 3\u20134 rolling windows; stitched equity shows consistent personality.<\/p>\n<\/li>\n<li class=\"task-list-item\" data-start=\"2327\" data-end=\"2386\">\n<p data-start=\"2329\" data-end=\"2386\">\u00a0<strong data-start=\"2333\" data-end=\"2348\">Cost stress<\/strong> at 1.5\u20132\u00d7 does not flip the thesis.<\/p>\n<\/li>\n<li class=\"task-list-item\" data-start=\"2387\" data-end=\"2476\">\n<p data-start=\"2389\" data-end=\"2476\">\u00a0<strong data-start=\"2393\" data-end=\"2409\">Timing drift<\/strong> (\u00b11\u20132 days) and <strong data-start=\"2426\" data-end=\"2443\">missed-action<\/strong> tests do not collapse results.<\/p>\n<\/li>\n<li class=\"task-list-item\" data-start=\"2477\" data-end=\"2570\">\n<p data-start=\"2479\" data-end=\"2570\"><strong data-start=\"2483\" data-end=\"2502\">Noise injection<\/strong> (mild price jitter) degrades gracefully; rankings largely stable.<\/p>\n<\/li>\n<li class=\"task-list-item\" data-start=\"2571\" data-end=\"2660\">\n<p data-start=\"2573\" data-end=\"2660\"><strong data-start=\"2577\" data-end=\"2594\">Regime slices<\/strong> reviewed (bull\/bear\/sideways); weak phase is known and bounded.<\/p>\n<\/li>\n<li class=\"task-list-item\" data-start=\"2661\" data-end=\"2744\">\n<p data-start=\"2663\" data-end=\"2744\">\u00a0<strong data-start=\"2667\" data-end=\"2687\">Liquidity filter<\/strong> applied per window; turnover is economically sensible.<\/p>\n<\/li>\n<li class=\"task-list-item\" data-start=\"2745\" data-end=\"2852\">\n<p data-start=\"2747\" data-end=\"2852\">\u00a0<strong data-start=\"2751\" data-end=\"2774\">Optimization report<\/strong> completed (objective, splits, settings, metrics, robustness notes, decision).<\/p>\n<\/li>\n<\/ul>\n<hr data-start=\"2854\" data-end=\"2857\" \/>\n<h2 data-start=\"2859\" data-end=\"2892\">What to publish (and what not)<\/h2>\n<p data-start=\"2893\" data-end=\"2907\"><strong data-start=\"2893\" data-end=\"2905\">Publish:<\/strong><\/p>\n<ul data-start=\"2908\" data-end=\"3365\">\n<li data-start=\"2908\" data-end=\"3001\">\n<p data-start=\"2910\" data-end=\"3001\">Clear <strong data-start=\"2916\" data-end=\"2929\">objective<\/strong> (e.g., balance return vs. drawdown) and <strong data-start=\"2970\" data-end=\"2981\">cadence<\/strong> (weekly\/monthly).<\/p>\n<\/li>\n<li data-start=\"3002\" data-end=\"3075\">\n<p data-start=\"3004\" data-end=\"3075\">Splits (<strong data-start=\"3012\" data-end=\"3034\">Design\/OOS\/Holdout<\/strong>) and a short <strong data-start=\"3048\" data-end=\"3064\">walk-forward<\/strong> summary.<\/p>\n<\/li>\n<li data-start=\"3076\" data-end=\"3172\">\n<p data-start=\"3078\" data-end=\"3172\">Core metrics: <strong data-start=\"3092\" data-end=\"3169\">CAGR, Max DD, Sharpe\/Calmar, worst year\/month, time under water, turnover<\/strong>.<\/p>\n<\/li>\n<li data-start=\"3173\" data-end=\"3241\">\n<p data-start=\"3175\" data-end=\"3241\">Short <strong data-start=\"3181\" data-end=\"3199\">regime profile<\/strong> (how it behaved in bull\/bear\/sideways).<\/p>\n<\/li>\n<li data-start=\"3242\" data-end=\"3301\">\n<p data-start=\"3244\" data-end=\"3301\">One paragraph on <strong data-start=\"3261\" data-end=\"3286\">frictions &amp; liquidity<\/strong> assumptions.<\/p>\n<\/li>\n<li data-start=\"3302\" data-end=\"3365\">\n<p data-start=\"3304\" data-end=\"3365\">One paragraph on <strong data-start=\"3321\" data-end=\"3343\">known risks\/limits<\/strong> (where it struggles).<\/p>\n<\/li>\n<\/ul>\n<p data-start=\"3367\" data-end=\"3379\"><strong data-start=\"3367\" data-end=\"3377\">Avoid:<\/strong><\/p>\n<ul data-start=\"3380\" data-end=\"3566\">\n<li data-start=\"3380\" data-end=\"3428\">\n<p data-start=\"3382\" data-end=\"3428\">Cherry-picked subperiods without disclosure.<\/p>\n<\/li>\n<li data-start=\"3429\" data-end=\"3493\">\n<p data-start=\"3431\" data-end=\"3493\">Hyper-precise \u201cmagic\u201d parameters with no stability evidence.<\/p>\n<\/li>\n<li data-start=\"3494\" data-end=\"3566\">\n<p data-start=\"3496\" data-end=\"3566\">Unrealistic execution assumptions (perfect fills, unlimited capacity).<\/p>\n<\/li>\n<\/ul>\n<hr data-start=\"3568\" data-end=\"3571\" \/>\n<h2 data-start=\"3573\" data-end=\"3606\">From backtest to live (safely)<\/h2>\n<ol data-start=\"3607\" data-end=\"4093\">\n<li data-start=\"3607\" data-end=\"3695\">\n<p data-start=\"3610\" data-end=\"3695\"><strong data-start=\"3610\" data-end=\"3641\">Paper first (or tiny-live).<\/strong> Track fills, latency, and slippage vs. assumptions.<\/p>\n<\/li>\n<li data-start=\"3696\" data-end=\"3817\">\n<p data-start=\"3699\" data-end=\"3817\"><strong data-start=\"3699\" data-end=\"3719\">Automate alerts.<\/strong> Translate your thresholds\/bands into simple price alerts so you execute your plan, not emotion.<\/p>\n<\/li>\n<li data-start=\"3818\" data-end=\"3915\">\n<p data-start=\"3821\" data-end=\"3915\"><strong data-start=\"3821\" data-end=\"3841\">Scale gradually.<\/strong> Increase size only after paper\/tiny-live behavior matches expectations.<\/p>\n<\/li>\n<li data-start=\"3916\" data-end=\"4020\">\n<p data-start=\"3919\" data-end=\"4020\"><strong data-start=\"3919\" data-end=\"3941\">Review on cadence.<\/strong> Recheck robustness quarterly or when regimes shift; avoid constant retuning.<\/p>\n<\/li>\n<li data-start=\"4021\" data-end=\"4093\">\n<p data-start=\"4024\" data-end=\"4093\"><strong data-start=\"4024\" data-end=\"4045\">Document changes.<\/strong> Version parameters and keep a short change log.<\/p>\n<\/li>\n<\/ol>\n<hr data-start=\"4095\" data-end=\"4098\" \/>\n<h2 data-start=\"4100\" data-end=\"4113\">Conclusion<\/h2>\n<p data-start=\"4114\" data-end=\"4421\" data-is-last-node=\"\" data-is-only-node=\"\">Reliable backtesting is about evidence, not aesthetics. Respect time, select parameters from plateaus, and pressure-test the idea with costs, timing, noise, liquidity, execution, and regime slices. If the strategy\u2019s character holds together after all that, you\u2019ve earned the right to take it live\u2014carefully.<\/p>\n<h3 data-start=\"269\" data-end=\"296\">Related Forvest Tools in Our <a href=\"https:\/\/forvest.io\/fortuna-abilities\/\">AI Assistant, Fortuna <\/a><\/h3>\n<p data-start=\"298\" data-end=\"586\"><strong data-start=\"298\" data-end=\"382\"><a class=\"decorated-link cursor-pointer\" href=\"https:\/\/forvest.io\/fortuna-abilities\/trust-score-analysis\/\" target=\"_new\" rel=\"noopener\" data-start=\"300\" data-end=\"380\">Forvest Trust Score<\/a><\/strong> helps investors evaluate crypto projects based on real transparency and reliability metrics. It identifies trustworthy assets and highlights hidden risks, guiding you toward safer investment decisions.<\/p>\n<p data-start=\"588\" data-end=\"856\"><strong data-start=\"588\" data-end=\"667\"><a class=\"decorated-link cursor-pointer\" href=\"https:\/\/forvest.io\/fortuna-abilities\/alert\/\" target=\"_new\" rel=\"noopener\" data-start=\"590\" data-end=\"665\">Forvest Alerts<\/a><\/strong> keeps you informed about key market movements and sentiment shifts \u2014 not just prices, but also major news that may impact your portfolio \u2014 helping you stay proactive instead of reactive.<\/p>\n<p data-start=\"8718\" data-end=\"8738\" data-is-last-node=\"\" data-is-only-node=\"\"><em data-start=\"8718\" data-end=\"8738\" data-is-last-node=\"\">\u2014 Forvest Research<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"Avoid costly backtesting mistakes like overfitting, data snooping, and unrealistic assumptions. Learn how to build reliable trading strategies with smarter tests and real data.","protected":false},"author":5,"featured_media":4491,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[69],"tags":[],"class_list":["post-3609","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-backtest-optimization"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.2 (Yoast SEO v26.3) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Common Backtesting Mistakes in Crypto Investing | Forvest<\/title>\n<meta name=\"description\" content=\"Fix crypto backtesting mistakes\u2014biases, fees, overfitting\u2014using time-based splits, walk-forward validation, and simple robustness checks.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/forvest.io\/blog\/backtesting-pitfalls\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Common Backtesting Mistakes to Avoid in Crypto Investing\" \/>\n<meta property=\"og:description\" content=\"Fix crypto backtesting mistakes\u2014biases, fees, overfitting\u2014using time-based splits, walk-forward validation, and simple robustness checks.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/forvest.io\/blog\/backtesting-pitfalls\/\" \/>\n<meta property=\"og:site_name\" content=\"Forvest Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/fortunainvesting\" \/>\n<meta property=\"article:published_time\" content=\"2023-03-22T20:55:19+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-10-27T17:03:18+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/forvest.io\/blog\/wp-content\/uploads\/2023\/03\/Crypto-analysts-backtesting.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"800\" \/>\n\t<meta property=\"og:image:height\" content=\"457\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Forvest Team\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@forvest_io\" \/>\n<meta name=\"twitter:site\" content=\"@forvest_io\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Forvest Team\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":[\"Article\",\"BlogPosting\"],\"@id\":\"https:\/\/forvest.io\/blog\/backtesting-pitfalls\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/forvest.io\/blog\/backtesting-pitfalls\/\"},\"author\":{\"name\":\"Forvest Team\",\"@id\":\"https:\/\/forvest.io\/blog\/#\/schema\/person\/a6baddec39b083245c574477d0e23b16\"},\"headline\":\"Common Backtesting Mistakes to Avoid in Crypto Investing\",\"datePublished\":\"2023-03-22T20:55:19+00:00\",\"dateModified\":\"2025-10-27T17:03:18+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/forvest.io\/blog\/backtesting-pitfalls\/\"},\"wordCount\":1353,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\/\/forvest.io\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/forvest.io\/blog\/backtesting-pitfalls\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/forvest.io\/blog\/wp-content\/uploads\/2023\/03\/Crypto-analysts-backtesting.jpg\",\"articleSection\":[\"Backtest &amp; Optimization\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/forvest.io\/blog\/backtesting-pitfalls\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/forvest.io\/blog\/backtesting-pitfalls\/\",\"url\":\"https:\/\/forvest.io\/blog\/backtesting-pitfalls\/\",\"name\":\"Common Backtesting Mistakes in Crypto Investing | Forvest\",\"isPartOf\":{\"@id\":\"https:\/\/forvest.io\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/forvest.io\/blog\/backtesting-pitfalls\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/forvest.io\/blog\/backtesting-pitfalls\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/forvest.io\/blog\/wp-content\/uploads\/2023\/03\/Crypto-analysts-backtesting.jpg\",\"datePublished\":\"2023-03-22T20:55:19+00:00\",\"dateModified\":\"2025-10-27T17:03:18+00:00\",\"description\":\"Fix crypto backtesting mistakes\u2014biases, fees, overfitting\u2014using time-based splits, walk-forward validation, and simple robustness checks.\",\"breadcrumb\":{\"@id\":\"https:\/\/forvest.io\/blog\/backtesting-pitfalls\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/forvest.io\/blog\/backtesting-pitfalls\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/forvest.io\/blog\/backtesting-pitfalls\/#primaryimage\",\"url\":\"https:\/\/forvest.io\/blog\/wp-content\/uploads\/2023\/03\/Crypto-analysts-backtesting.jpg\",\"contentUrl\":\"https:\/\/forvest.io\/blog\/wp-content\/uploads\/2023\/03\/Crypto-analysts-backtesting.jpg\",\"width\":800,\"height\":457,\"caption\":\"Crypto investors analyzing backtesting data to identify and fix common testing mistakes for more reliable investment decisions.\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/forvest.io\/blog\/backtesting-pitfalls\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Forvest Blog\",\"item\":\"https:\/\/forvest.io\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Common Backtesting Mistakes to Avoid in Crypto Investing\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/forvest.io\/blog\/#website\",\"url\":\"https:\/\/forvest.io\/blog\/\",\"name\":\"Forvest Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/forvest.io\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/forvest.io\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/forvest.io\/blog\/#organization\",\"name\":\"forvest\",\"url\":\"https:\/\/forvest.io\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/forvest.io\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/forvest.io\/blog\/wp-content\/uploads\/2025\/05\/cropped-png-logo-of-blog-min-1.png\",\"contentUrl\":\"https:\/\/forvest.io\/blog\/wp-content\/uploads\/2025\/05\/cropped-png-logo-of-blog-min-1.png\",\"width\":512,\"height\":512,\"caption\":\"forvest\"},\"image\":{\"@id\":\"https:\/\/forvest.io\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/fortunainvesting\",\"https:\/\/x.com\/forvest_io\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/forvest.io\/blog\/#\/schema\/person\/a6baddec39b083245c574477d0e23b16\",\"name\":\"Forvest Team\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/forvest.io\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/db37486609f66f0132505c4378fe052c?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/db37486609f66f0132505c4378fe052c?s=96&d=mm&r=g\",\"caption\":\"Forvest Team\"},\"description\":\"The Forvest Research Team combines human expertise and AI-driven analysis to deliver reliable, data-backed insights. Each article is reviewed collaboratively to help investors understand market trends and manage risk more effectively.\",\"sameAs\":[\"https:\/\/www.linkedin.com\/company\/forvest-io\/\"],\"url\":\"https:\/\/forvest.io\/blog\/author\/forvest-team\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Common Backtesting Mistakes in Crypto Investing | Forvest","description":"Fix crypto backtesting mistakes\u2014biases, fees, overfitting\u2014using time-based splits, walk-forward validation, and simple robustness checks.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/forvest.io\/blog\/backtesting-pitfalls\/","og_locale":"en_US","og_type":"article","og_title":"Common Backtesting Mistakes to Avoid in Crypto Investing","og_description":"Fix crypto backtesting mistakes\u2014biases, fees, overfitting\u2014using time-based splits, walk-forward validation, and simple robustness checks.","og_url":"https:\/\/forvest.io\/blog\/backtesting-pitfalls\/","og_site_name":"Forvest Blog","article_publisher":"https:\/\/www.facebook.com\/fortunainvesting","article_published_time":"2023-03-22T20:55:19+00:00","article_modified_time":"2025-10-27T17:03:18+00:00","og_image":[{"width":800,"height":457,"url":"https:\/\/forvest.io\/blog\/wp-content\/uploads\/2023\/03\/Crypto-analysts-backtesting.jpg","type":"image\/jpeg"}],"author":"Forvest Team","twitter_card":"summary_large_image","twitter_creator":"@forvest_io","twitter_site":"@forvest_io","twitter_misc":{"Written by":"Forvest Team","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":["Article","BlogPosting"],"@id":"https:\/\/forvest.io\/blog\/backtesting-pitfalls\/#article","isPartOf":{"@id":"https:\/\/forvest.io\/blog\/backtesting-pitfalls\/"},"author":{"name":"Forvest Team","@id":"https:\/\/forvest.io\/blog\/#\/schema\/person\/a6baddec39b083245c574477d0e23b16"},"headline":"Common Backtesting Mistakes to Avoid in Crypto Investing","datePublished":"2023-03-22T20:55:19+00:00","dateModified":"2025-10-27T17:03:18+00:00","mainEntityOfPage":{"@id":"https:\/\/forvest.io\/blog\/backtesting-pitfalls\/"},"wordCount":1353,"commentCount":1,"publisher":{"@id":"https:\/\/forvest.io\/blog\/#organization"},"image":{"@id":"https:\/\/forvest.io\/blog\/backtesting-pitfalls\/#primaryimage"},"thumbnailUrl":"https:\/\/forvest.io\/blog\/wp-content\/uploads\/2023\/03\/Crypto-analysts-backtesting.jpg","articleSection":["Backtest &amp; Optimization"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/forvest.io\/blog\/backtesting-pitfalls\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/forvest.io\/blog\/backtesting-pitfalls\/","url":"https:\/\/forvest.io\/blog\/backtesting-pitfalls\/","name":"Common Backtesting Mistakes in Crypto Investing | Forvest","isPartOf":{"@id":"https:\/\/forvest.io\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/forvest.io\/blog\/backtesting-pitfalls\/#primaryimage"},"image":{"@id":"https:\/\/forvest.io\/blog\/backtesting-pitfalls\/#primaryimage"},"thumbnailUrl":"https:\/\/forvest.io\/blog\/wp-content\/uploads\/2023\/03\/Crypto-analysts-backtesting.jpg","datePublished":"2023-03-22T20:55:19+00:00","dateModified":"2025-10-27T17:03:18+00:00","description":"Fix crypto backtesting mistakes\u2014biases, fees, overfitting\u2014using time-based splits, walk-forward validation, and simple robustness checks.","breadcrumb":{"@id":"https:\/\/forvest.io\/blog\/backtesting-pitfalls\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/forvest.io\/blog\/backtesting-pitfalls\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/forvest.io\/blog\/backtesting-pitfalls\/#primaryimage","url":"https:\/\/forvest.io\/blog\/wp-content\/uploads\/2023\/03\/Crypto-analysts-backtesting.jpg","contentUrl":"https:\/\/forvest.io\/blog\/wp-content\/uploads\/2023\/03\/Crypto-analysts-backtesting.jpg","width":800,"height":457,"caption":"Crypto investors analyzing backtesting data to identify and fix common testing mistakes for more reliable investment decisions."},{"@type":"BreadcrumbList","@id":"https:\/\/forvest.io\/blog\/backtesting-pitfalls\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Forvest Blog","item":"https:\/\/forvest.io\/blog\/"},{"@type":"ListItem","position":2,"name":"Common Backtesting Mistakes to Avoid in Crypto Investing"}]},{"@type":"WebSite","@id":"https:\/\/forvest.io\/blog\/#website","url":"https:\/\/forvest.io\/blog\/","name":"Forvest Blog","description":"","publisher":{"@id":"https:\/\/forvest.io\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/forvest.io\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/forvest.io\/blog\/#organization","name":"forvest","url":"https:\/\/forvest.io\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/forvest.io\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/forvest.io\/blog\/wp-content\/uploads\/2025\/05\/cropped-png-logo-of-blog-min-1.png","contentUrl":"https:\/\/forvest.io\/blog\/wp-content\/uploads\/2025\/05\/cropped-png-logo-of-blog-min-1.png","width":512,"height":512,"caption":"forvest"},"image":{"@id":"https:\/\/forvest.io\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/fortunainvesting","https:\/\/x.com\/forvest_io"]},{"@type":"Person","@id":"https:\/\/forvest.io\/blog\/#\/schema\/person\/a6baddec39b083245c574477d0e23b16","name":"Forvest Team","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/forvest.io\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/db37486609f66f0132505c4378fe052c?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/db37486609f66f0132505c4378fe052c?s=96&d=mm&r=g","caption":"Forvest Team"},"description":"The Forvest Research Team combines human expertise and AI-driven analysis to deliver reliable, data-backed insights. Each article is reviewed collaboratively to help investors understand market trends and manage risk more effectively.","sameAs":["https:\/\/www.linkedin.com\/company\/forvest-io\/"],"url":"https:\/\/forvest.io\/blog\/author\/forvest-team\/"}]}},"_links":{"self":[{"href":"https:\/\/forvest.io\/blog\/wp-json\/wp\/v2\/posts\/3609","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/forvest.io\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/forvest.io\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/forvest.io\/blog\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/forvest.io\/blog\/wp-json\/wp\/v2\/comments?post=3609"}],"version-history":[{"count":6,"href":"https:\/\/forvest.io\/blog\/wp-json\/wp\/v2\/posts\/3609\/revisions"}],"predecessor-version":[{"id":4518,"href":"https:\/\/forvest.io\/blog\/wp-json\/wp\/v2\/posts\/3609\/revisions\/4518"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/forvest.io\/blog\/wp-json\/wp\/v2\/media\/4491"}],"wp:attachment":[{"href":"https:\/\/forvest.io\/blog\/wp-json\/wp\/v2\/media?parent=3609"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/forvest.io\/blog\/wp-json\/wp\/v2\/categories?post=3609"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/forvest.io\/blog\/wp-json\/wp\/v2\/tags?post=3609"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}