﻿{"id":4478,"date":"2025-10-26T11:25:21","date_gmt":"2025-10-26T12:25:21","guid":{"rendered":"https:\/\/forvest.io\/blog\/?p=4478"},"modified":"2025-11-26T06:12:34","modified_gmt":"2025-11-26T07:12:34","slug":"backtest-optimization-crypto","status":"publish","type":"post","link":"https:\/\/forvest.io\/blog\/backtest-optimization-crypto\/","title":{"rendered":"Backtest Optimization: Avoid Overfitting &#038; Improve Robustness"},"content":{"rendered":"<p data-start=\"371\" data-end=\"676\">Most backtests don\u2019t fail because the idea is bad\u2014they fail because the <strong data-start=\"443\" data-end=\"459\">optimization<\/strong> was. This guide shows crypto investors how to avoid <strong data-start=\"512\" data-end=\"527\">overfitting<\/strong> with time-based splits, walk-forward validation, and parameter-range thinking so results hold up outside the lab and across changing market regimes.<\/p>\n<hr data-start=\"678\" data-end=\"681\" \/>\n<h2 data-start=\"683\" data-end=\"691\">TL;DR<\/h2>\n<ul data-start=\"692\" data-end=\"1097\">\n<li data-start=\"692\" data-end=\"782\">\n<p data-start=\"694\" data-end=\"782\"><strong data-start=\"694\" data-end=\"728\">Overfitting = tuning to noise.<\/strong> If tiny tweaks kill results, you never had an edge.<\/p>\n<\/li>\n<li data-start=\"783\" data-end=\"859\">\n<p data-start=\"785\" data-end=\"859\">Split data <strong data-start=\"796\" data-end=\"815\">chronologically<\/strong> (design vs. out-of-sample), not randomly.<\/p>\n<\/li>\n<li data-start=\"860\" data-end=\"929\">\n<p data-start=\"862\" data-end=\"929\">Prefer <strong data-start=\"869\" data-end=\"898\">parameter ranges\/plateaus<\/strong> over single \u201cmagic numbers.\u201d<\/p>\n<\/li>\n<li data-start=\"930\" data-end=\"1010\">\n<p data-start=\"932\" data-end=\"1010\">Validate with <strong data-start=\"946\" data-end=\"970\">walk-forward windows<\/strong> (12\u201318 months) and a full risk panel.<\/p>\n<\/li>\n<li data-start=\"1011\" data-end=\"1097\">\n<p data-start=\"1013\" data-end=\"1097\">Keep <strong data-start=\"1018\" data-end=\"1047\">fees, slippage, liquidity<\/strong> inside the optimization loop\u2014not bolted on later.<\/p>\n<\/li>\n<\/ul>\n<p data-start=\"1013\" data-end=\"1097\"><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=\"1099\" data-end=\"1102\" \/>\n<h2 data-start=\"1104\" data-end=\"1156\">Why \u201coptimization\u201d often makes backtests worse<\/h2>\n<p data-start=\"1157\" data-end=\"1397\">Optimization should smooth rough edges. In practice it often sculpts a museum-grade equity curve that <strong data-start=\"1259\" data-end=\"1295\">breaks the moment regimes change<\/strong>. Crypto is ruthless: narratives flip, order books thin, and what worked in 2021 may not survive 2025.<\/p>\n<p data-start=\"1399\" data-end=\"1650\"><strong data-start=\"1399\" data-end=\"1407\">Good<\/strong> optimization clarifies the <strong data-start=\"1435\" data-end=\"1444\">logic<\/strong> and picks <strong data-start=\"1455\" data-end=\"1474\">stable settings<\/strong>. <strong data-start=\"1476\" data-end=\"1483\">Bad<\/strong> optimization hunts the best historical number and calls it \u201cedge.\u201d<br data-start=\"1550\" data-end=\"1553\" \/>Investor mindset: you\u2019re not trying to win last year\u2014you\u2019re trying to <strong data-start=\"1623\" data-end=\"1649\">survive the next cycle<\/strong>.<\/p>\n<hr data-start=\"1652\" data-end=\"1655\" \/>\n<h2 data-start=\"1657\" data-end=\"1711\">Overfitting in plain English: what it looks like<\/h2>\n<p data-start=\"1712\" data-end=\"1817\">When a strategy only works with one ultra-specific setting, you\u2019re buying <strong data-start=\"1786\" data-end=\"1795\">noise<\/strong> as if it were signal.<\/p>\n<p data-start=\"1819\" data-end=\"2259\"><strong> Table 1 \u2014 Overfitting symptoms and why investors should care:<\/strong><\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"192\"><strong>Symptom<\/strong><\/td>\n<td width=\"192\"><strong>What you see<\/strong><\/td>\n<td width=\"192\"><strong>Investor risk<\/strong><\/td>\n<\/tr>\n<tr>\n<td width=\"192\">Parameter cliffs<\/td>\n<td width=\"192\">One hyper\u2011specific value required<\/td>\n<td width=\"192\">Fragile in the wild<\/td>\n<\/tr>\n<tr>\n<td width=\"192\">Perfect curve<\/td>\n<td width=\"192\">Suspiciously smooth equity<\/td>\n<td width=\"192\">Likely fit to noise<\/td>\n<\/tr>\n<tr>\n<td width=\"192\">Era dependence<\/td>\n<td width=\"192\">Works in one market phase only<\/td>\n<td width=\"192\">Regime risk later<\/td>\n<\/tr>\n<tr>\n<td width=\"192\">High turnover<\/td>\n<td width=\"192\">Lots of tiny \u201ctweaks\u201d and trades<\/td>\n<td width=\"192\">Fees\/slippage will eat returns<\/td>\n<\/tr>\n<tr>\n<td width=\"192\">OOS collapse<\/td>\n<td width=\"192\">Fails right after training (out of sample)<\/td>\n<td width=\"192\">No real edge<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<blockquote>\n<p data-start=\"1819\" data-end=\"2259\">Human test: if you can\u2019t describe the strategy in <strong data-start=\"2311\" data-end=\"2327\">one sentence<\/strong>, it\u2019s probably over-fitted.<\/p>\n<\/blockquote>\n<hr data-start=\"2357\" data-end=\"2360\" \/>\n<h2 data-start=\"2362\" data-end=\"2407\">The optimization traps unique to crypto<\/h2>\n<ul data-start=\"2408\" data-end=\"2901\">\n<li data-start=\"2408\" data-end=\"2473\">\n<p data-start=\"2410\" data-end=\"2473\"><strong data-start=\"2410\" data-end=\"2428\">Data snooping:<\/strong> trying many ideas, reporting only winners.<\/p>\n<\/li>\n<li data-start=\"2474\" data-end=\"2551\">\n<p data-start=\"2476\" data-end=\"2551\"><strong data-start=\"2476\" data-end=\"2499\">Leakage\/look-ahead:<\/strong> using information not available at decision time.<\/p>\n<\/li>\n<li data-start=\"2552\" data-end=\"2628\">\n<p data-start=\"2554\" data-end=\"2628\"><strong data-start=\"2554\" data-end=\"2576\">Survivorship bias:<\/strong> building universes with only coins that survived.<\/p>\n<\/li>\n<li data-start=\"2629\" data-end=\"2716\">\n<p data-start=\"2631\" data-end=\"2716\"><strong data-start=\"2631\" data-end=\"2654\">Friction blindness:<\/strong> optimizing pre-cost P&amp;L; edge vanishes after fees\/slippage.<\/p>\n<\/li>\n<li data-start=\"2717\" data-end=\"2819\">\n<p data-start=\"2719\" data-end=\"2819\"><strong data-start=\"2719\" data-end=\"2740\">Over-granularity:<\/strong> optimizing daily\/hourly while your behavior is monthly (investor vs trader).<\/p>\n<\/li>\n<li data-start=\"2820\" data-end=\"2901\">\n<p data-start=\"2822\" data-end=\"2901\"><strong data-start=\"2822\" data-end=\"2840\">Regime myopia:<\/strong> training on one mood and mistaking regime effects for skill.<\/p>\n<\/li>\n<\/ul>\n<p data-start=\"2903\" data-end=\"2958\">Fixing this isn\u2019t wizardry\u2014it\u2019s <strong data-start=\"2935\" data-end=\"2957\">process discipline<\/strong>.<\/p>\n<hr data-start=\"2960\" data-end=\"2963\" \/>\n<h2 data-start=\"2965\" data-end=\"3020\">Split your data the way time works (not randomly)<\/h2>\n<p data-start=\"3021\" data-end=\"3098\">Markets are time-dependent. Random K-fold is for i.i.d. data, not portfolios.<\/p>\n<p data-start=\"3100\" data-end=\"3512\"><strong>Table 2 \u2014 Time-based split that matches investor reality:<\/strong><\/p>\n<table class=\"w-fit min-w-(--thread-content-width)\" data-start=\"62\" data-end=\"439\" data-is-last-node=\"\" data-is-only-node=\"\">\n<thead data-start=\"62\" data-end=\"106\">\n<tr data-start=\"62\" data-end=\"106\">\n<th data-start=\"62\" data-end=\"68\" data-col-size=\"sm\">Phase<\/th>\n<th data-start=\"68\" data-end=\"87\" data-col-size=\"sm\">Share of history<\/th>\n<th data-start=\"87\" data-end=\"97\" data-col-size=\"sm\">Purpose<\/th>\n<th data-start=\"97\" data-end=\"106\" data-col-size=\"sm\">Rules<\/th>\n<\/tr>\n<\/thead>\n<tbody data-start=\"131\" data-end=\"439\" data-is-last-node=\"\">\n<tr data-start=\"131\" data-end=\"245\">\n<td data-start=\"131\" data-end=\"150\" data-col-size=\"sm\">Design (In-Sample)<\/td>\n<td data-start=\"150\" data-end=\"169\" data-col-size=\"sm\">~60\u201370% earliest<\/td>\n<td data-start=\"169\" data-end=\"203\" data-col-size=\"sm\">Build simple, explainable logic<\/td>\n<td data-start=\"203\" data-end=\"245\" data-col-size=\"sm\">Limit variants; avoid complexity creep<\/td>\n<\/tr>\n<tr data-start=\"246\" data-end=\"349\">\n<td data-start=\"246\" data-end=\"265\" data-col-size=\"sm\">Validation (OOS-1)<\/td>\n<td data-start=\"265\" data-end=\"280\" data-col-size=\"sm\">~15\u201320% next<\/td>\n<td data-start=\"280\" data-end=\"313\" data-col-size=\"sm\">Test only shortlisted variants<\/td>\n<td data-start=\"313\" data-end=\"349\" data-col-size=\"sm\">No retuning after seeing results<\/td>\n<\/tr>\n<tr data-start=\"350\" data-end=\"439\" data-is-last-node=\"\">\n<td data-start=\"350\" data-end=\"366\" data-col-size=\"sm\">Holdout (OOS-2)<\/td>\n<td data-start=\"366\" data-end=\"381\" data-col-size=\"sm\">~15\u201320% last<\/td>\n<td data-start=\"381\" data-end=\"403\" data-col-size=\"sm\">One-time final exam<\/td>\n<td data-start=\"403\" data-end=\"439\" data-is-last-node=\"\" data-col-size=\"sm\">Touch once; confirm generalization<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"3514\" data-end=\"3527\">Guidelines:<\/p>\n<ul data-start=\"3528\" data-end=\"3818\">\n<li data-start=\"3528\" data-end=\"3602\">\n<p data-start=\"3530\" data-end=\"3602\">Ensure the full span covers <strong data-start=\"3558\" data-end=\"3578\">multiple regimes<\/strong> (bull\/bear\/sideways).<\/p>\n<\/li>\n<li data-start=\"3603\" data-end=\"3698\">\n<p data-start=\"3605\" data-end=\"3698\">Keep cadence <strong data-start=\"3618\" data-end=\"3642\">investor-appropriate<\/strong> (weekly\/monthly), or you\u2019ll optimize execution noise.<\/p>\n<\/li>\n<li data-start=\"3699\" data-end=\"3818\">\n<p data-start=\"3701\" data-end=\"3818\">Evaluate with a <strong data-start=\"3717\" data-end=\"3726\">panel<\/strong>, not one number: CAGR, Max DD, Sharpe\/Calmar, worst year\/month, time under water, turnover.<\/p>\n<\/li>\n<\/ul>\n<p data-start=\"3820\" data-end=\"3946\">What you want to see: similar character between design and validation, and <strong data-start=\"3895\" data-end=\"3907\">graceful<\/strong> (not catastrophic) degradation in OOS.<\/p>\n<hr data-start=\"3948\" data-end=\"3951\" \/>\n<div id=\"attachment_4485\" style=\"width: 810px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-4485\" class=\"wp-image-4485 size-full\" src=\"https:\/\/forvest.io\/blog\/wp-content\/uploads\/2025\/10\/stability-heatmap-showing.jpg\" alt=\"Parameter stability heatmap showing a broad plateau versus a sharp spike\u2014visualizing robust parameter selection for backtests.\" width=\"800\" height=\"457\" srcset=\"https:\/\/forvest.io\/blog\/wp-content\/uploads\/2025\/10\/stability-heatmap-showing.jpg 800w, https:\/\/forvest.io\/blog\/wp-content\/uploads\/2025\/10\/stability-heatmap-showing-300x171.jpg 300w, https:\/\/forvest.io\/blog\/wp-content\/uploads\/2025\/10\/stability-heatmap-showing-768x439.jpg 768w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><p id=\"caption-attachment-4485\" class=\"wp-caption-text\">Choose the plateau, not the spike\u2014stable parameters survive real markets.<\/p><\/div>\n<h2 data-start=\"3953\" data-end=\"3993\">Parameter ranges &gt; \u201cmagic numbers\u201d<\/h2>\n<p data-start=\"3994\" data-end=\"4083\">When you sweep parameters, don\u2019t ask \u201cWhere is the peak?\u201d Ask \u201c<strong data-start=\"4057\" data-end=\"4082\">Where is the plateau?<\/strong>\u201d<\/p>\n<ul data-start=\"4085\" data-end=\"4312\">\n<li data-start=\"4085\" data-end=\"4174\">\n<p data-start=\"4087\" data-end=\"4174\">A <strong data-start=\"4089\" data-end=\"4100\">plateau<\/strong> is a continuous region with \u201cgood-enough\u201d results across many settings.<\/p>\n<\/li>\n<li data-start=\"4175\" data-end=\"4247\">\n<p data-start=\"4177\" data-end=\"4247\">Choose settings <strong data-start=\"4193\" data-end=\"4203\">inside<\/strong> the plateau, ideally <strong data-start=\"4225\" data-end=\"4244\">near its center<\/strong>.<\/p>\n<\/li>\n<li data-start=\"4248\" data-end=\"4312\">\n<p data-start=\"4250\" data-end=\"4312\">If you only see sharp spikes, you found <strong data-start=\"4290\" data-end=\"4299\">noise<\/strong>, not signal.<\/p>\n<\/li>\n<\/ul>\n<p data-start=\"4314\" data-end=\"4426\">Investor benefit: plateaus tolerate messy reality\u2014slight data differences, minor delays, or a changing coin mix.<\/p>\n<hr data-start=\"4428\" data-end=\"4431\" \/>\n<div id=\"attachment_4486\" style=\"width: 810px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-4486\" class=\"wp-image-4486 size-full\" src=\"https:\/\/forvest.io\/blog\/wp-content\/uploads\/2025\/10\/Walk-forward-validation.jpg\" alt=\"Walk-forward validation timeline with stitched equity curve across rolling training and out-of-sample windows.\" width=\"800\" height=\"457\" srcset=\"https:\/\/forvest.io\/blog\/wp-content\/uploads\/2025\/10\/Walk-forward-validation.jpg 800w, https:\/\/forvest.io\/blog\/wp-content\/uploads\/2025\/10\/Walk-forward-validation-300x171.jpg 300w, https:\/\/forvest.io\/blog\/wp-content\/uploads\/2025\/10\/Walk-forward-validation-768x439.jpg 768w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><p id=\"caption-attachment-4486\" class=\"wp-caption-text\">Walk-forward links recent learning to the next unseen window\u2014closer to real deployment.<\/p><\/div>\n<h2 data-start=\"4433\" data-end=\"4485\">Walk-forward validation: rolling reality check<\/h2>\n<p data-start=\"4486\" data-end=\"4661\">Static splits can still get lucky. <strong data-start=\"4521\" data-end=\"4537\">Walk-forward<\/strong> mimics how you\u2019ll actually invest: learn from the recent past, then apply to the <strong data-start=\"4619\" data-end=\"4634\">next unseen<\/strong> window, and chain results.<\/p>\n<p data-start=\"4663\" data-end=\"4694\">How (weekly\/monthly cadence):<\/p>\n<ol data-start=\"4695\" data-end=\"4909\">\n<li data-start=\"4695\" data-end=\"4753\">\n<p data-start=\"4698\" data-end=\"4753\">Pick <strong data-start=\"4703\" data-end=\"4718\">12\u201318-month<\/strong> windows; keep tuning <strong data-start=\"4740\" data-end=\"4750\">modest<\/strong>.<\/p>\n<\/li>\n<li data-start=\"4754\" data-end=\"4816\">\n<p data-start=\"4757\" data-end=\"4816\">Lock parameters (or ranges with a simple selection rule).<\/p>\n<\/li>\n<li data-start=\"4817\" data-end=\"4860\">\n<p data-start=\"4820\" data-end=\"4860\">Run on the <strong data-start=\"4831\" data-end=\"4839\">next<\/strong> window (true OOS).<\/p>\n<\/li>\n<li data-start=\"4861\" data-end=\"4909\">\n<p data-start=\"4864\" data-end=\"4909\">Roll forward and <strong data-start=\"4881\" data-end=\"4891\">stitch<\/strong> the equity curve.<\/p>\n<\/li>\n<\/ol>\n<p data-start=\"4911\" data-end=\"4921\">Inspect:<\/p>\n<ul data-start=\"4922\" data-end=\"5133\">\n<li data-start=\"4922\" data-end=\"5004\">\n<p data-start=\"4924\" data-end=\"5004\">Rolling <strong data-start=\"4932\" data-end=\"4942\">Max DD<\/strong> and <strong data-start=\"4947\" data-end=\"4964\">Sharpe\/Calmar<\/strong>\u2014does the personality stay consistent?<\/p>\n<\/li>\n<li data-start=\"5005\" data-end=\"5074\">\n<p data-start=\"5007\" data-end=\"5074\"><strong data-start=\"5007\" data-end=\"5027\">Time under water<\/strong> per window\u2014does it blow out in some regimes?<\/p>\n<\/li>\n<li data-start=\"5075\" data-end=\"5133\">\n<p data-start=\"5077\" data-end=\"5133\"><strong data-start=\"5077\" data-end=\"5098\">Turnover vs costs<\/strong>\u2014does it become uneconomic in chop?<\/p>\n<\/li>\n<\/ul>\n<p data-start=\"5135\" data-end=\"5271\">Window guidance: too short = you fit noise; too long = you adapt too slowly. <strong data-start=\"5212\" data-end=\"5228\">12\u201318 months<\/strong> is a robust start for investor strategies.<\/p>\n<h2 data-start=\"161\" data-end=\"232\">A Practical Robustness Toolkit (what to do after \u201ca good result\u201d)<\/h2>\n<p data-start=\"233\" data-end=\"401\">A pretty equity curve isn\u2019t a green light. Now you try to <strong data-start=\"291\" data-end=\"300\">break<\/strong> your idea on purpose. If it survives, you likely have an edge. If it breaks, you just saved capital.<\/p>\n<h3 data-start=\"403\" data-end=\"449\">Stress tests that matter for investors<\/h3>\n<ul data-start=\"450\" data-end=\"1167\">\n<li data-start=\"450\" data-end=\"550\">\n<p data-start=\"452\" data-end=\"550\"><strong data-start=\"452\" data-end=\"472\">Friction stress:<\/strong> raise fees\/slippage by 1.5\u20132\u00d7. A fragile model flips from \u201cgreat\u201d to \u201cmeh.\u201d<\/p>\n<\/li>\n<li data-start=\"551\" data-end=\"651\">\n<p data-start=\"553\" data-end=\"651\"><strong data-start=\"553\" data-end=\"568\">Data noise:<\/strong> jitter prices \u00b10.5\u20131.0% randomly on rebalance days; does the ranking\/order flip?<\/p>\n<\/li>\n<li data-start=\"652\" data-end=\"742\">\n<p data-start=\"654\" data-end=\"742\"><strong data-start=\"654\" data-end=\"671\">Timing drift:<\/strong> shift rebalancing by \u00b11\u20132 days (or by clock hour for daily systems).<\/p>\n<\/li>\n<li data-start=\"743\" data-end=\"844\">\n<p data-start=\"745\" data-end=\"844\"><strong data-start=\"745\" data-end=\"767\">Liquidity realism:<\/strong> remove assets that fall below your minimum volume\/cap band in each window.<\/p>\n<\/li>\n<li data-start=\"845\" data-end=\"952\">\n<p data-start=\"847\" data-end=\"952\"><strong data-start=\"847\" data-end=\"867\">Path dependence:<\/strong> <strong data-start=\"868\" data-end=\"883\">Monte Carlo<\/strong> resample the return path (or day-order) to see outcome dispersion.<\/p>\n<\/li>\n<li data-start=\"953\" data-end=\"1068\">\n<p data-start=\"955\" data-end=\"1068\"><strong data-start=\"955\" data-end=\"980\">Bootstrap rebalances:<\/strong> randomly \u201cmiss\u201d a fraction of rebalances (e.g., 10%); execution imperfection is real.<\/p>\n<\/li>\n<li data-start=\"1069\" data-end=\"1167\">\n<p data-start=\"1071\" data-end=\"1167\"><strong data-start=\"1071\" data-end=\"1089\">Regime slices:<\/strong> test subsets: bull-only, bear-only, chop\/range. Look for profile consistency.<\/p>\n<\/li>\n<\/ul>\n<p data-start=\"1169\" data-end=\"1408\"><strong data-start=\"1169\" data-end=\"1202\">Investor reading of outcomes:<\/strong> You don\u2019t need identical numbers; you want <strong data-start=\"1246\" data-end=\"1269\">character stability<\/strong>: same rough drawdown ceiling, similar rolling Sharpe\/Calmar, and no sudden \u201cpersonality swap\u201d (e.g., becoming a momentum chaser in bears).<\/p>\n<hr data-start=\"1410\" data-end=\"1413\" \/>\n<h2 data-start=\"1415\" data-end=\"1479\">Parameter-Stability Maps (find the plateau, not the spike)<\/h2>\n<p data-start=\"1480\" data-end=\"1607\">Sweep your critical knobs (e.g., lookback 90\u2013240, threshold 0.5\u20131.5\u03c3). Don\u2019t cherry-pick the max; inspect the <strong data-start=\"1590\" data-end=\"1606\">neighborhood<\/strong>.<\/p>\n<p data-start=\"1609\" data-end=\"1628\">What to look for:<\/p>\n<ul data-start=\"1629\" data-end=\"1842\">\n<li data-start=\"1629\" data-end=\"1695\">\n<p data-start=\"1631\" data-end=\"1695\"><strong data-start=\"1631\" data-end=\"1644\">Plateaus:<\/strong> broad zones where CAGR\/Calmar remain acceptable.<\/p>\n<\/li>\n<li data-start=\"1696\" data-end=\"1765\">\n<p data-start=\"1698\" data-end=\"1765\"><strong data-start=\"1698\" data-end=\"1717\">Graceful edges:<\/strong> performance fades gradually as you move away.<\/p>\n<\/li>\n<li data-start=\"1766\" data-end=\"1842\">\n<p data-start=\"1768\" data-end=\"1842\"><strong data-start=\"1768\" data-end=\"1787\">No razor peaks:<\/strong> if one hyper-specific combo dominates, assume overfit.<\/p>\n<\/li>\n<\/ul>\n<p data-start=\"1844\" data-end=\"2054\">Investor habit: pick parameter <strong data-start=\"1875\" data-end=\"1885\">ranges<\/strong> you\u2019d be happy to live with (e.g., 120\u2013180 days), then lock a <strong data-start=\"1948\" data-end=\"1959\">central<\/strong> value (e.g., 150) or a <strong data-start=\"1983\" data-end=\"2008\">simple selection rule<\/strong> (e.g., choose the median in-range performer).<\/p>\n<hr data-start=\"2056\" data-end=\"2059\" \/>\n<h2 data-start=\"2061\" data-end=\"2108\">Regime Robustness (bull, bear, sideways)<\/h2>\n<p data-start=\"2109\" data-end=\"2200\">Crypto is regime-heavy. Your backtest should read like a <strong data-start=\"2166\" data-end=\"2185\">character sheet<\/strong> across phases.<\/p>\n<ul data-start=\"2202\" data-end=\"2435\">\n<li data-start=\"2202\" data-end=\"2266\">\n<p data-start=\"2204\" data-end=\"2266\"><strong data-start=\"2204\" data-end=\"2213\">Bull:<\/strong> Does the model keep up without taking reckless DD?<\/p>\n<\/li>\n<li data-start=\"2267\" data-end=\"2351\">\n<p data-start=\"2269\" data-end=\"2351\"><strong data-start=\"2269\" data-end=\"2278\">Bear:<\/strong> Does a trend\/regime filter meaningfully reduce losses vs buy-and-hold?<\/p>\n<\/li>\n<li data-start=\"2352\" data-end=\"2435\">\n<p data-start=\"2354\" data-end=\"2435\"><strong data-start=\"2354\" data-end=\"2367\">Sideways:<\/strong> Is turnover costing you? Consider widening bands or slower cadence.<\/p>\n<\/li>\n<\/ul>\n<p data-start=\"2437\" data-end=\"2611\">Rule of thumb: If the strategy\u2019s <strong data-start=\"2470\" data-end=\"2485\">worst phase<\/strong> is catastrophic relative to its peers (or cash), you don\u2019t have an investor model; you have a <strong data-start=\"2580\" data-end=\"2589\">trade<\/strong> pretending to be one.<\/p>\n<hr data-start=\"2613\" data-end=\"2616\" \/>\n<h2 data-start=\"2618\" data-end=\"2673\">Walk-Forward + Robustness = Deployment Readiness<\/h2>\n<p data-start=\"2674\" data-end=\"2743\">Your \u201cgo\/no-go\u201d isn\u2019t a single number; it\u2019s a <strong data-start=\"2720\" data-end=\"2742\">bundle of evidence<\/strong>:<\/p>\n<ul data-start=\"2744\" data-end=\"3032\">\n<li data-start=\"2744\" data-end=\"2799\">\n<p data-start=\"2746\" data-end=\"2799\">Time-based split passed (design \u2192 OOS-1 \u2192 holdout).<\/p>\n<\/li>\n<li data-start=\"2800\" data-end=\"2868\">\n<p data-start=\"2802\" data-end=\"2868\">Walk-forward curve stitched cleanly with consistent personality.<\/p>\n<\/li>\n<li data-start=\"2869\" data-end=\"2908\">\n<p data-start=\"2871\" data-end=\"2908\">Stress tests didn\u2019t flip the story.<\/p>\n<\/li>\n<li data-start=\"2909\" data-end=\"2957\">\n<p data-start=\"2911\" data-end=\"2957\">Parameters sit in a plateau, not on a cliff.<\/p>\n<\/li>\n<li data-start=\"2958\" data-end=\"3032\">\n<p data-start=\"2960\" data-end=\"3032\">Regime profile is intelligible (you know when it suffers, and how much).<\/p>\n<\/li>\n<\/ul>\n<p data-start=\"3034\" data-end=\"3106\"><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=\"3108\" data-end=\"3111\" \/>\n<p data-start=\"3174\" data-end=\"4020\"><strong data-start=\"3174\" data-end=\"3233\">Table 3 \u2014 Robustness Stress-Test Checklist\u00a0<\/strong><\/p>\n<table>\n<thead>\n<tr>\n<th>Category<\/th>\n<th>Test<\/th>\n<th>What you do<\/th>\n<th>What you want to see<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Friction<\/td>\n<td>Cost stress<\/td>\n<td>1.5\u20132\u00d7 fees &amp; slippage<\/td>\n<td>Character survives; not a total thesis flip<\/td>\n<\/tr>\n<tr>\n<td>Data<\/td>\n<td>Noise injection<\/td>\n<td>\u00b10.5\u20131.0% price jitter on rebalance<\/td>\n<td>Rankings stable; metrics degrade gracefully<\/td>\n<\/tr>\n<tr>\n<td>Timing<\/td>\n<td>Drift test<\/td>\n<td>Shift rebalance by \u00b11\u20132 days<\/td>\n<td>No regime personality swap; similar DD ceiling<\/td>\n<\/tr>\n<tr>\n<td>Liquidity<\/td>\n<td>Tradability filter<\/td>\n<td>Enforce min volume\/cap per window<\/td>\n<td>Returns stay believable; turnover drops if needed<\/td>\n<\/tr>\n<tr>\n<td>Path<\/td>\n<td>Monte Carlo<\/td>\n<td>Resample day\/order; view dispersion<\/td>\n<td>Middle of distribution still investable<\/td>\n<\/tr>\n<tr>\n<td>Execution<\/td>\n<td>Missed actions<\/td>\n<td>Randomly skip ~10% rebalances<\/td>\n<td>No collapse; slightly lower but intact profile<\/td>\n<\/tr>\n<tr>\n<td>Regime<\/td>\n<td>Sliced tests<\/td>\n<td>Bull \/ bear \/ sideways subsets<\/td>\n<td>Known weak phase but bounded pain<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr data-start=\"4022\" data-end=\"4025\" \/>\n<p data-start=\"4027\" data-end=\"5202\"><strong data-start=\"4027\" data-end=\"4082\">Table 4 \u2014 Optimization Report Template\u00a0<\/strong><\/p>\n<table>\n<thead>\n<tr>\n<th>Field<\/th>\n<th>What to record<\/th>\n<th>Example<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Strategy name<\/td>\n<td>One-line description<\/td>\n<td>\u201cEqW BTC\/ETH\/SOL + 30% cash on risk-off\u201d<\/td>\n<\/tr>\n<tr>\n<td>Objective<\/td>\n<td>What you optimize for<\/td>\n<td>\u201cSharpe \u2265 1.0; Max DD \u2264 30%\u201d<\/td>\n<\/tr>\n<tr>\n<td>Data span &amp; cadence<\/td>\n<td>Years &amp; frequency<\/td>\n<td>\u201c2019\u20132025, weekly\u201d<\/td>\n<\/tr>\n<tr>\n<td>Splits<\/td>\n<td>Design \/ OOS-1 \/ Holdout<\/td>\n<td>\u201c2019\u201322 \/ 2023 \/ 2024\u2013H1\u201d<\/td>\n<\/tr>\n<tr>\n<td>Friction model<\/td>\n<td>Fees, slippage, spreads<\/td>\n<td>\u201c0.10% fee, 0.05% slip; doubled in stress\u201d<\/td>\n<\/tr>\n<tr>\n<td>Parameter ranges<\/td>\n<td>Swept values<\/td>\n<td>\u201cLookback 120\u2013180; threshold 0.8\u20131.2\u03c3\u201d<\/td>\n<\/tr>\n<tr>\n<td>Chosen setting<\/td>\n<td>Inside the plateau?<\/td>\n<td>\u201c150d, 1.0\u03c3 (center of plateau)\u201d<\/td>\n<\/tr>\n<tr>\n<td>Core metrics<\/td>\n<td>CAGR \/ Max DD \/ Sharpe \/ Calmar<\/td>\n<td>\u201c19.2% \/ 28% \/ 1.14 \/ 0.69 (holdout)\u201d<\/td>\n<\/tr>\n<tr>\n<td>WF results<\/td>\n<td>Windows &amp; comments<\/td>\n<td>\u201c4\u00d715-mo; stable Sharpe, DD &lt; 30%\u201d<\/td>\n<\/tr>\n<tr>\n<td>Regime profile<\/td>\n<td>Bull \/ bear \/ chop<\/td>\n<td>\u201cBull strong; bear contained; chop manageable\u201d<\/td>\n<\/tr>\n<tr>\n<td>Stress tests<\/td>\n<td>Pass\/fail notes<\/td>\n<td>\u201cCost \u00d72: still viable; timing \u00b12d: OK\u201d<\/td>\n<\/tr>\n<tr>\n<td>Risks &amp; limits<\/td>\n<td>Where it breaks<\/td>\n<td>\u201cHigh-fee venues; thin coins; deep chop at high turnover\u201d<\/td>\n<\/tr>\n<tr>\n<td>Next actions<\/td>\n<td>What to improve<\/td>\n<td>\u201cWider bands in chop; cap SOL at 40%\u201d<\/td>\n<\/tr>\n<tr>\n<td>Decision<\/td>\n<td>Ship \/ Iterate \/ Drop<\/td>\n<td>\u201cShip small; monitor turnover &amp; DD alerts\u201d<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr data-start=\"5310\" data-end=\"5313\" \/>\n<h2 data-start=\"5315\" data-end=\"5366\">A Clean Optimization Workflow You Can Repeat<\/h2>\n<ol data-start=\"5367\" data-end=\"6031\">\n<li data-start=\"5367\" data-end=\"5450\">\n<p data-start=\"5370\" data-end=\"5450\"><strong data-start=\"5370\" data-end=\"5388\">Frame the goal<\/strong> (risk\/return). If you can\u2019t state it in one sentence, stop.<\/p>\n<\/li>\n<li data-start=\"5451\" data-end=\"5509\">\n<p data-start=\"5454\" data-end=\"5509\"><strong data-start=\"5454\" data-end=\"5474\">Time-based split<\/strong> (design \u2192 validation \u2192 holdout).<\/p>\n<\/li>\n<li data-start=\"5510\" data-end=\"5581\">\n<p data-start=\"5513\" data-end=\"5581\"><strong data-start=\"5513\" data-end=\"5537\">Friction-in-the-loop<\/strong> (fees, slippage, liquidity) from day one.<\/p>\n<\/li>\n<li data-start=\"5582\" data-end=\"5647\">\n<p data-start=\"5585\" data-end=\"5647\"><strong data-start=\"5585\" data-end=\"5624\">Parameter sweep \u2192 plateau selection<\/strong> (not spike-hunting).<\/p>\n<\/li>\n<li data-start=\"5648\" data-end=\"5720\">\n<p data-start=\"5651\" data-end=\"5720\"><strong data-start=\"5651\" data-end=\"5667\">Walk-forward<\/strong> (12\u201318-month steps), inspect rolling risk metrics.<\/p>\n<\/li>\n<li data-start=\"5721\" data-end=\"5826\">\n<p data-start=\"5724\" data-end=\"5826\"><strong data-start=\"5724\" data-end=\"5746\">Robustness battery<\/strong> (cost stress, noise, timing, liquidity, path, missed actions, regime slices).<\/p>\n<\/li>\n<li data-start=\"5827\" data-end=\"5887\">\n<p data-start=\"5830\" data-end=\"5887\"><strong data-start=\"5830\" data-end=\"5853\">Optimization report<\/strong> (Table 2), commit the evidence.<\/p>\n<\/li>\n<li data-start=\"5888\" data-end=\"5961\">\n<p data-start=\"5891\" data-end=\"5961\"><strong data-start=\"5891\" data-end=\"5912\">Paper \/ tiny-live<\/strong> with alerts; review vs. backtest expectations.<\/p>\n<\/li>\n<li data-start=\"5962\" data-end=\"6031\">\n<p data-start=\"5965\" data-end=\"6031\"><strong data-start=\"5965\" data-end=\"5984\">Scale prudently<\/strong> only after consistency shows up out of sample.<\/p>\n<\/li>\n<\/ol>\n<hr data-start=\"6033\" data-end=\"6036\" \/>\n<h2 data-start=\"6038\" data-end=\"6101\">Some Notes:<\/h2>\n<blockquote>\n<ul data-start=\"6102\" data-end=\"6428\">\n<li data-start=\"6102\" data-end=\"6206\">\n<p data-start=\"6104\" data-end=\"6206\">If you can\u2019t <strong data-start=\"6117\" data-end=\"6126\">sleep<\/strong> with the worst-case drawdown, the model will fail\u2014<strong data-start=\"6177\" data-end=\"6184\">you<\/strong> will deviate first.<\/p>\n<\/li>\n<li data-start=\"6207\" data-end=\"6286\">\n<p data-start=\"6209\" data-end=\"6286\">A slightly <strong data-start=\"6220\" data-end=\"6234\">worse CAGR<\/strong> with a <strong data-start=\"6242\" data-end=\"6258\">saner Max DD<\/strong> often wins the long game.<\/p>\n<\/li>\n<li data-start=\"6287\" data-end=\"6428\">\n<p data-start=\"6289\" data-end=\"6428\">When in doubt, <strong data-start=\"6304\" data-end=\"6313\">blend<\/strong> two robust but different characters (e.g., EqW+regime with a light momentum tilt), then re-test as <strong data-start=\"6413\" data-end=\"6420\">one<\/strong> policy.<\/p>\n<\/li>\n<\/ul>\n<\/blockquote>\n<hr data-start=\"6856\" data-end=\"6859\" \/>\n<h2 data-start=\"6861\" data-end=\"6906\">Conclusion \u2014 Stop Optimizing for Yesterday<\/h2>\n<p data-start=\"6907\" data-end=\"7170\">Robust optimization isn\u2019t about beating a backtest\u2014it\u2019s about <strong data-start=\"6969\" data-end=\"7014\">building a portfolio policy that survives<\/strong> fees, noise, timing, and mood swings. Choose plateaus, respect time, and try to <strong data-start=\"7095\" data-end=\"7104\">break<\/strong> your own idea. If it still stands, then\u2014and only then\u2014press \u201cgo.\u201d<\/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":"Most failed strategies are victims of bad optimization. This guide shows how to avoid curve fitting with time-based splits, walk-forward testing, parameter plateaus, and realistic cost\/liquidity modeling\u2014plus stress tests across market regimes.","protected":false},"author":1,"featured_media":4479,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[69],"tags":[],"class_list":["post-4478","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>Backtest Optimization: Avoid Overfitting &amp; Robustness | Forvest<\/title>\n<meta name=\"description\" content=\"how to optimize crypto backtests without overfitting\u2014time-based splits, walk-forward validation, friction modeling, and 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\/backtest-optimization-crypto\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Backtest Optimization: Avoid Overfitting &amp; Improve Robustness\" \/>\n<meta property=\"og:description\" content=\"how to optimize crypto backtests without overfitting\u2014time-based splits, walk-forward validation, friction modeling, and robustness checks.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/forvest.io\/blog\/backtest-optimization-crypto\/\" \/>\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=\"2025-10-26T12:25:21+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-11-26T07:12:34+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/forvest.io\/blog\/wp-content\/uploads\/2025\/10\/Team-of-crypto-analysts-optimizing.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=\"Reza Ebrahimi\" \/>\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=\"Reza Ebrahimi\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":[\"Article\",\"BlogPosting\"],\"@id\":\"https:\/\/forvest.io\/blog\/backtest-optimization-crypto\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/forvest.io\/blog\/backtest-optimization-crypto\/\"},\"author\":{\"name\":\"Reza Ebrahimi\",\"@id\":\"https:\/\/forvest.io\/blog\/#\/schema\/person\/8ed61714a8452b4636efa97985c127df\"},\"headline\":\"Backtest Optimization: Avoid Overfitting &#038; Improve Robustness\",\"datePublished\":\"2025-10-26T12:25:21+00:00\",\"dateModified\":\"2025-11-26T07:12:34+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/forvest.io\/blog\/backtest-optimization-crypto\/\"},\"wordCount\":1674,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/forvest.io\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/forvest.io\/blog\/backtest-optimization-crypto\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/forvest.io\/blog\/wp-content\/uploads\/2025\/10\/Team-of-crypto-analysts-optimizing.jpg\",\"articleSection\":[\"Backtest &amp; Optimization\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/forvest.io\/blog\/backtest-optimization-crypto\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/forvest.io\/blog\/backtest-optimization-crypto\/\",\"url\":\"https:\/\/forvest.io\/blog\/backtest-optimization-crypto\/\",\"name\":\"Backtest Optimization: Avoid Overfitting & Robustness | Forvest\",\"isPartOf\":{\"@id\":\"https:\/\/forvest.io\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/forvest.io\/blog\/backtest-optimization-crypto\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/forvest.io\/blog\/backtest-optimization-crypto\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/forvest.io\/blog\/wp-content\/uploads\/2025\/10\/Team-of-crypto-analysts-optimizing.jpg\",\"datePublished\":\"2025-10-26T12:25:21+00:00\",\"dateModified\":\"2025-11-26T07:12:34+00:00\",\"description\":\"how to optimize crypto backtests without overfitting\u2014time-based splits, walk-forward validation, friction modeling, and robustness checks.\",\"breadcrumb\":{\"@id\":\"https:\/\/forvest.io\/blog\/backtest-optimization-crypto\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/forvest.io\/blog\/backtest-optimization-crypto\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/forvest.io\/blog\/backtest-optimization-crypto\/#primaryimage\",\"url\":\"https:\/\/forvest.io\/blog\/wp-content\/uploads\/2025\/10\/Team-of-crypto-analysts-optimizing.jpg\",\"contentUrl\":\"https:\/\/forvest.io\/blog\/wp-content\/uploads\/2025\/10\/Team-of-crypto-analysts-optimizing.jpg\",\"width\":800,\"height\":457,\"caption\":\"From backtest to robustness\u2014visual workflow on real research desks.\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/forvest.io\/blog\/backtest-optimization-crypto\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Forvest Blog\",\"item\":\"https:\/\/forvest.io\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Backtest Optimization: Avoid Overfitting &#038; Improve Robustness\"}]},{\"@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\/8ed61714a8452b4636efa97985c127df\",\"name\":\"Reza Ebrahimi\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/forvest.io\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/forvest.io\/blog\/wp-content\/uploads\/nsl_avatars\/a798af9d64dbd253600fc969b932802b.jpg\",\"contentUrl\":\"https:\/\/forvest.io\/blog\/wp-content\/uploads\/nsl_avatars\/a798af9d64dbd253600fc969b932802b.jpg\",\"caption\":\"Reza Ebrahimi\"},\"description\":\"Reza Ebrahimi leads Forvest\u2019s vision for smarter crypto investing, sharing practical insights that help investors manage risk effectively.\",\"sameAs\":[\"https:\/\/www.reza-ebrahimi.ir\/\",\"https:\/\/www.linkedin.com\/in\/reza-ebrahimi-67748a127\/\"],\"birthDate\":\"1996-03-21\",\"gender\":\"Male\",\"knowsLanguage\":[\"English\",\"Farsi\"],\"jobTitle\":\"CEO\",\"worksFor\":\"Reza Ebrahimi\",\"url\":\"https:\/\/forvest.io\/blog\/author\/reza_ebrahimi\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Backtest Optimization: Avoid Overfitting & Robustness | Forvest","description":"how to optimize crypto backtests without overfitting\u2014time-based splits, walk-forward validation, friction modeling, and 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\/backtest-optimization-crypto\/","og_locale":"en_US","og_type":"article","og_title":"Backtest Optimization: Avoid Overfitting & Improve Robustness","og_description":"how to optimize crypto backtests without overfitting\u2014time-based splits, walk-forward validation, friction modeling, and robustness checks.","og_url":"https:\/\/forvest.io\/blog\/backtest-optimization-crypto\/","og_site_name":"Forvest Blog","article_publisher":"https:\/\/www.facebook.com\/fortunainvesting","article_published_time":"2025-10-26T12:25:21+00:00","article_modified_time":"2025-11-26T07:12:34+00:00","og_image":[{"width":800,"height":457,"url":"https:\/\/forvest.io\/blog\/wp-content\/uploads\/2025\/10\/Team-of-crypto-analysts-optimizing.jpg","type":"image\/jpeg"}],"author":"Reza Ebrahimi","twitter_card":"summary_large_image","twitter_creator":"@forvest_io","twitter_site":"@forvest_io","twitter_misc":{"Written by":"Reza Ebrahimi","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":["Article","BlogPosting"],"@id":"https:\/\/forvest.io\/blog\/backtest-optimization-crypto\/#article","isPartOf":{"@id":"https:\/\/forvest.io\/blog\/backtest-optimization-crypto\/"},"author":{"name":"Reza Ebrahimi","@id":"https:\/\/forvest.io\/blog\/#\/schema\/person\/8ed61714a8452b4636efa97985c127df"},"headline":"Backtest Optimization: Avoid Overfitting &#038; Improve Robustness","datePublished":"2025-10-26T12:25:21+00:00","dateModified":"2025-11-26T07:12:34+00:00","mainEntityOfPage":{"@id":"https:\/\/forvest.io\/blog\/backtest-optimization-crypto\/"},"wordCount":1674,"commentCount":0,"publisher":{"@id":"https:\/\/forvest.io\/blog\/#organization"},"image":{"@id":"https:\/\/forvest.io\/blog\/backtest-optimization-crypto\/#primaryimage"},"thumbnailUrl":"https:\/\/forvest.io\/blog\/wp-content\/uploads\/2025\/10\/Team-of-crypto-analysts-optimizing.jpg","articleSection":["Backtest &amp; Optimization"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/forvest.io\/blog\/backtest-optimization-crypto\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/forvest.io\/blog\/backtest-optimization-crypto\/","url":"https:\/\/forvest.io\/blog\/backtest-optimization-crypto\/","name":"Backtest Optimization: Avoid Overfitting & Robustness | Forvest","isPartOf":{"@id":"https:\/\/forvest.io\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/forvest.io\/blog\/backtest-optimization-crypto\/#primaryimage"},"image":{"@id":"https:\/\/forvest.io\/blog\/backtest-optimization-crypto\/#primaryimage"},"thumbnailUrl":"https:\/\/forvest.io\/blog\/wp-content\/uploads\/2025\/10\/Team-of-crypto-analysts-optimizing.jpg","datePublished":"2025-10-26T12:25:21+00:00","dateModified":"2025-11-26T07:12:34+00:00","description":"how to optimize crypto backtests without overfitting\u2014time-based splits, walk-forward validation, friction modeling, and robustness checks.","breadcrumb":{"@id":"https:\/\/forvest.io\/blog\/backtest-optimization-crypto\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/forvest.io\/blog\/backtest-optimization-crypto\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/forvest.io\/blog\/backtest-optimization-crypto\/#primaryimage","url":"https:\/\/forvest.io\/blog\/wp-content\/uploads\/2025\/10\/Team-of-crypto-analysts-optimizing.jpg","contentUrl":"https:\/\/forvest.io\/blog\/wp-content\/uploads\/2025\/10\/Team-of-crypto-analysts-optimizing.jpg","width":800,"height":457,"caption":"From backtest to robustness\u2014visual workflow on real research desks."},{"@type":"BreadcrumbList","@id":"https:\/\/forvest.io\/blog\/backtest-optimization-crypto\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Forvest Blog","item":"https:\/\/forvest.io\/blog\/"},{"@type":"ListItem","position":2,"name":"Backtest Optimization: Avoid Overfitting &#038; Improve Robustness"}]},{"@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\/8ed61714a8452b4636efa97985c127df","name":"Reza Ebrahimi","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/forvest.io\/blog\/#\/schema\/person\/image\/","url":"https:\/\/forvest.io\/blog\/wp-content\/uploads\/nsl_avatars\/a798af9d64dbd253600fc969b932802b.jpg","contentUrl":"https:\/\/forvest.io\/blog\/wp-content\/uploads\/nsl_avatars\/a798af9d64dbd253600fc969b932802b.jpg","caption":"Reza Ebrahimi"},"description":"Reza Ebrahimi leads Forvest\u2019s vision for smarter crypto investing, sharing practical insights that help investors manage risk effectively.","sameAs":["https:\/\/www.reza-ebrahimi.ir\/","https:\/\/www.linkedin.com\/in\/reza-ebrahimi-67748a127\/"],"birthDate":"1996-03-21","gender":"Male","knowsLanguage":["English","Farsi"],"jobTitle":"CEO","worksFor":"Reza Ebrahimi","url":"https:\/\/forvest.io\/blog\/author\/reza_ebrahimi\/"}]}},"_links":{"self":[{"href":"https:\/\/forvest.io\/blog\/wp-json\/wp\/v2\/posts\/4478","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\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/forvest.io\/blog\/wp-json\/wp\/v2\/comments?post=4478"}],"version-history":[{"count":7,"href":"https:\/\/forvest.io\/blog\/wp-json\/wp\/v2\/posts\/4478\/revisions"}],"predecessor-version":[{"id":4516,"href":"https:\/\/forvest.io\/blog\/wp-json\/wp\/v2\/posts\/4478\/revisions\/4516"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/forvest.io\/blog\/wp-json\/wp\/v2\/media\/4479"}],"wp:attachment":[{"href":"https:\/\/forvest.io\/blog\/wp-json\/wp\/v2\/media?parent=4478"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/forvest.io\/blog\/wp-json\/wp\/v2\/categories?post=4478"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/forvest.io\/blog\/wp-json\/wp\/v2\/tags?post=4478"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}