A trading model is a systematic process that takes data as input and produces a trading decision as output. It does not need to be complex. A model that says "buy Bitcoin when the 50-day moving average crosses above the 200-day moving average and sell when it crosses below" is a complete trading model. It has clear rules, produces unambiguous signals, and can be tested historically.
Public data sources for crypto are abundant. Exchange APIs provide historical price and volume data. CoinGecko and CoinMarketCap provide aggregated data across exchanges. On-chain data from sources like Glassnode provides blockchain-specific metrics. Economic data from FRED (Federal Reserve Economic Data) provides macro inputs. All of this data is freely available and sufficient to build useful models.
Start with a single hypothesis. Rather than trying to build a model that captures everything, pick one relationship you believe exists. For example: Bitcoin tends to perform well in the months following periods where the ratio of short-term holders to long-term holders reaches extreme lows. This is a specific, testable hypothesis based on on-chain data. You can verify it with historical data before risking money on it.
Data preparation is where most of the work happens. Raw data needs to be cleaned (removing obvious errors and gaps), aligned (synchronizing timestamps from different sources), and transformed into features your model can use. A feature might be a moving average, a percentage change over a specific period, a ratio between two metrics, or a binary indicator for whether a condition is met. Spend more time on data quality than on model complexity.
Simple models outperform complex ones more often than you would expect. A linear combination of three well-chosen features frequently outperforms a neural network trained on dozens of features. The reason is overfitting: complex models have more capacity to memorize noise in historical data. Simple models are forced to capture only the strongest patterns, which are more likely to persist in the future.
Walk-forward testing is essential. Divide your data into sequential chunks. Train (or calibrate) your model on the first chunk. Test it on the next chunk. Then add that chunk to your training data and test on the following one. Repeat through your entire dataset. This simulates how the model would have performed if you had been using it in real time, recalibrating as new data became available. Results from walk-forward testing are much more realistic than a single backtest.
Transaction costs, slippage, and market impact must be included in your testing. A model that generates a 2% annual return before costs is a losing strategy after you account for exchange fees, the spread between bid and ask, and the market impact of your orders. For crypto markets, assuming 0.1-0.2% round-trip costs for major pairs is reasonable. For less liquid assets, assume more.
Risk management should be part of the model, not an afterthought. Define position sizing rules, maximum drawdown limits, and stop-loss levels within the model itself. A model that generates great returns but has 50% drawdowns is not useful for most traders because they would abandon it during the drawdown long before the returns materialized.
The final step is running your model on live data without real money (paper trading) for a sufficient period to validate that it behaves as expected. Watch for discrepancies between paper results and what your backtest predicted. If the model performs significantly differently in real time, investigate why before committing capital. Common causes include data leakage in the backtest, unrealistic fill assumptions, or regime changes that the historical data did not capture.