Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Backtest crypto and traditional trading strategies against historical data. Calculates performance metrics (Sharpe, Sortino, max drawdown), generates equity curves, and optimizes strategy parameters. Use when user wants to test a trading strategy, validate signals, or compare approaches. Trigger with phrases like "backtest strategy", "test trading strategy", "historical performance", "simulate trades", "optimize parameters", or "validate signals".
.claude/skills/jeremylongshore-backtesting-trading-strategies/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 37% | 0% |
| case-08 | ✗→✓ | ▲ Improved | -18% | 0% |
| case-09 | ✗→✓ | ▲ Improved | -32% | 0% |
| case-10 | ✗→✓ | ▲ Improved | -11% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 34% | 0% |
Validate trading strategies against historical data before risking real capital. This skill provides a complete backtesting framework with 8 built-in strategies, comprehensive performance metrics, and parameter optimization.
Key Features:
Install required dependencies:
bashset -euo pipefail pip install pandas numpy yfinance matplotlib
Optional for advanced features:
bashset -euo pipefail pip install ta-lib scipy scikit-learn
${CLAUDE_SKILL_DIR}/data/ for reuse):bash python ${CLAUDE_SKILL_DIR}/scripts/fetch_data.py --symbol BTC-USD --period 2y --interval 1d
bash python ${CLAUDE_SKILL_DIR}/scripts/backtest.py --strategy sma_crossover --symbol BTC-USD --period 1y python ${CLAUDE_SKILL_DIR}/scripts/backtest.py \ --strategy rsi_reversal \ --symbol ETH-USD \ --period 1y \ --capital 10000 \ # 10000: 10 seconds in ms --params '{"period": 14, "overbought": 70, "oversold": 30}'
${CLAUDE_SKILL_DIR}/reports/ -- includes *_summary.txt (performance metrics), *_trades.csv (trade log), *_equity.csv (equity curve data), and *_chart.png (visual equity curve).bash python ${CLAUDE_SKILL_DIR}/scripts/optimize.py \ --strategy sma_crossover \ --symbol BTC-USD \ --period 1y \ --param-grid '{"fast_period": [10, 20, 30], "slow_period": [50, 100, 200]}' # HTTP 200 OK
| Metric | Description | |--------|-------------| | Total Return | Overall percentage gain/loss | | CAGR | Compound annual growth rate | | Sharpe Ratio | Risk-adjusted return (target: >1.5) | | Sortino Ratio | Downside risk-adjusted return | | Calmar Ratio | Return divided by max drawdown |
| Metric | Description | |--------|-------------| | Max Drawdown | Largest peak-to-trough decline | | VaR (95%) | Value at Risk at 95% confidence | | CVaR (95%) | Expected loss beyond VaR | | Volatility | Annualized standard deviation |
| Metric | Description | |--------|-------------| | Total Trades | Number of round-trip trades | | Win Rate | Percentage of profitable trades | | Profit Factor | Gross profit divided by gross loss | | Expectancy | Expected value per trade |
================================================================================
BACKTEST RESULTS: SMA CROSSOVER
BTC-USD | [start_date] to [end_date]
================================================================================
PERFORMANCE | RISK
Total Return: +47.32% | Max Drawdown: -18.45%
CAGR: +47.32% | VaR (95%): -2.34%
Sharpe Ratio: 1.87 | Volatility: 42.1%
Sortino Ratio: 2.41 | Ulcer Index: 8.2
--------------------------------------------------------------------------------
TRADE STATISTICS
Total Trades: 24 | Profit Factor: 2.34
Win Rate: 58.3% | Expectancy: $197.17
Avg Win: $892.45 | Max Consec. Losses: 3
================================================================================| Strategy | Description | Key Parameters | |----------|-------------|----------------| | sma_crossover | Simple moving average crossover | fast_period, slow_period | | ema_crossover | Exponential MA crossover | fast_period, slow_period | | rsi_reversal | RSI overbought/oversold | period, overbought, oversold | | macd | MACD signal line crossover | fast, slow, signal | | bollinger_bands | Mean reversion on bands | period, std_dev | | breakout | Price breakout from range | lookback, threshold | | mean_reversion | Return to moving average | period, z_threshold | | momentum | Rate of change momentum | period, threshold |
Create ${CLAUDE_SKILL_DIR}/config/settings.yaml:
yamldata: provider: yfinance cache_dir: ./data backtest: default_capital: 10000 # 10000: 10 seconds in ms commission: 0.001 # 0.1% per trade slippage: 0.0005 # 0.05% slippage risk: max_position_size: 0.95 stop_loss: null # Optional fixed stop loss take_profit: null # Optional fixed take profit
See ${CLAUDE_SKILL_DIR}/references/errors.md for common issues and solutions.
See ${CLAUDE_SKILL_DIR}/references/examples.md for detailed usage examples including:
| File | Purpose | |------|---------| | scripts/backtest.py | Main backtesting engine | | scripts/fetch_data.py | Historical data fetcher | | scripts/strategies.py | Strategy definitions | | scripts/metrics.py | Performance calculations | | scripts/optimize.py | Parameter optimization |
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 20,033 | 5,328 | -73% | 1 | 1 | 0% | 3,869 | 1,888 | -51% | 0 | 0 | — |
case-02 | fail→fail | 17,146 | 4,664 | -73% | 1 | 1 | 0% | 3,491 | 1,845 | -47% | 0 | 0 | — |
case-03 | fail→fail | 25,924 | 7,064 | -73% | 1 | 1 | 0% | 5,436 | 1,982 | -64% | 0 | 0 | — |
case-04 | fail→pass | 7,950 | 2,690 | -66% | 1 | 1 | 0% | 1,530 | 2,096 | +37% | 0 | 0 | — |
case-05 | pass→pass | 11,031 | 5,050 | -54% | 1 | 1 | 0% | 2,099 | 2,565 | +22% | 0 | 0 | — |
case-06 | pass→pass | 8,247 | 2,375 | -71% | 1 | 1 | 0% | 1,569 | 2,006 | +28% | 0 | 0 | — |
case-07 | pass→pass | 11,548 | 3,994 | -65% | 1 | 1 | 0% | 2,138 | 2,268 | +6% | 0 | 0 | — |
case-08 | fail→pass | 13,381 | 1,929 | -86% | 1 | 1 | 0% | 2,251 | 1,839 | -18% | 0 | 0 | — |
case-09 | fail→pass | 16,071 | 2,270 | -86% | 1 | 1 | 0% | 2,987 | 2,040 | -32% | 0 | 0 | — |
case-10 | fail→pass | 12,379 | 2,323 | -81% | 1 | 1 | 0% | 2,196 | 1,957 | -11% | 0 | 0 | — |
case-11 | fail→pass | 8,246 | 2,735 | -67% | 1 | 1 | 0% | 1,456 | 1,951 | +34% | 0 | 0 | — |
case-12 | fail→pass | 11,420 | 4,343 | -62% | 1 | 1 | 0% | 1,877 | 2,381 | +27% | 0 | 0 | — |
case-13 | pass→pass | 7,847 | 2,285 | -71% | 1 | 1 | 0% | 1,442 | 1,955 | +36% | 0 | 0 | — |
case-14 | pass→pass | 12,099 | 6,160 | -49% | 1 | 1 | 0% | 2,073 | 2,746 | +32% | 0 | 0 | — |
case-15 | fail→pass | 4,214 | 1,649 | -61% | 1 | 1 | 0% | 622 | 1,821 | +193% | 0 | 0 | — |
case-16 | fail→pass | 5,461 | 1,925 | -65% | 1 | 1 | 0% | 939 | 1,908 | +103% | 0 | 0 | — |
case-17 | fail→pass | 4,020 | 2,385 | -41% | 1 | 1 | 0% | 599 | 1,926 | +222% | 0 | 0 | — |
case-18 | pass→pass | 9,368 | 4,278 | -54% | 1 | 1 | 0% | 1,599 | 2,282 | +43% | 0 | 0 | — |
case-19 | fail→pass | 8,393 | 3,312 | -61% | 1 | 1 | 0% | 1,398 | 1,887 | +35% | 0 | 0 | — |
case-20 | fail→pass | 8,983 | 8,380 | -7% | 1 | 1 | 0% | 1,615 | 2,905 | +80% | 0 | 0 | — |
case-21 | fail→fail | 18,004 | 16,123 | -10% | 1 | 1 | 0% | 3,621 | 4,628 | +28% | 0 | 0 | — |
case-22 | fail→fail | 20,745 | 27,111 | +31% | 1 | 1 | 0% | 4,427 | 7,785 | +76% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 19 counted toward the lift figure. The other 3 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +50 percentage points is the difference between those two pass rates over the 19 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.