Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
0xrikt avatar

Crypto Backtest

  • 102 installs
  • 18 repo stars
  • Updated January 25, 2026
  • 0xrikt/crypto-skills

crypto-backtest is a Claude Code skill that turns natural-language crypto trading ideas into backtested spot-only strategies with data from CCXT and interactive HTML reports.

About

crypto-backtest is a Claude Code skill that converts natural-language crypto trading ideas into validated spot-only strategies with professional backtesting. It fetches historical data through CCXT, computes technical indicators with pandas-ta, simulates a portfolio with stop-loss and take-profit, and outputs an interactive HTML report plus runnable Python. A trader or developer uses it to validate a strategy idea before risking capital. It supports spot long-only strategies with no leverage or shorting.

  • Turns natural-language crypto trading ideas into backtested, spot-only strategies with runnable Python
  • Fetches real historical data via CCXT across 200+ exchanges and generates interactive Plotly HTML reports
  • Expands vague signals into multi-factor models across momentum, trend, volatility, volume, and price-action indicators

Crypto Backtest by the numbers

  • 102 all-time installs (skills.sh)
  • Ranked #521 of 1,106 Finance & Trading skills by installs in the Skillselion catalog
  • Data as of Jul 28, 2026 (Skillselion catalog sync)
At a glance

crypto-backtest capabilities & compatibility

Free; uses public exchange market data via CCXT, no API key required

Capabilities
backtesting · trading strategy · technical analysis · report generation
Works with
tradingview
Use cases
trading · data analysis · research
Pricing
Free
From the docs

What crypto-backtest says it does

Transform natural language trading ideas into validated strategies with professional backtesting, beautiful reports, and runnable code.
SKILL.md
npx skills add https://github.com/0xrikt/crypto-skills --skill crypto-backtest

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs102
repo stars18
Last updatedJanuary 25, 2026
Repository0xrikt/crypto-skills

What it does

Backtest a crypto trading idea into a validated spot strategy with real historical data and a report.

Who is it for?

traders validating spot crypto strategy ideas against historical data

Skip if: leverage, shorting, or futures/perpetual strategies; the skill is spot long-only

When should I use this skill?

a user describes a trading idea or wants to backtest or validate a crypto strategy (RSI, MACD, DCA, oversold, etc.)

What you get

A backtested, multi-factor spot strategy with an interactive report and runnable Python code.

By the numbers

  • 200+ exchanges via CCXT
  • supports 20+ technical indicators across momentum, trend, volatility, volume, and price action

Files

SKILL.mdMarkdownGitHub ↗

Crypto Strategy Backtest Skill

Transform natural language trading ideas into validated strategies with professional backtesting, beautiful reports, and runnable code.

⚠️ SPOT ONLY: This skill supports spot trading strategies only. No leverage, no shorting, no futures/perpetual contracts. All strategies are long-only (buy low → hold → sell high).

Your Superpower

You turn vague trading intuitions into professional-grade, multi-dimensional strategies. When users say "buy when cheap", you don't just slap on RSI < 30 — you build a comprehensive valuation model using multiple indicators, each with proper reasoning.

Your goal: Make strategy completion so thorough that users think "wow, I wouldn't have thought of all this myself."

---

CRITICAL: Parameter Estimation Principles

Think like a quant: Every parameter must be justified, not guessed.

1. Threshold = f(historical volatility): For spreads, use 1.5-2× standard deviation. For RSI, use 30/70 (BTC) or 25/75 (alts). 2. Stop Loss > normal noise: BTC daily vol is 3-5%, so stop loss should be 5-8%, not 2%. 3. Respect user's exact specs: If user says "every 6 hours", use 6h, not 2h. 4. Spot only: leverage = 1x, always. No perpetuals, no shorting. 5. Position Size is PERCENTAGE: --position-size 10 means 10% of capital per trade, NOT $10! 6. OKX data limit: OKX only provides ~60-90 days of history. For longer backtests, use --exchange kucoin or --exchange binance (if accessible).

---

CRITICAL: Strategy Completion Standards

When translating natural language to technical conditions, NEVER use single indicators. Always combine multiple dimensions:

🎯 "Undervalued/Cheap/Oversold/Dip" → Multi-Factor Valuation Model

DON'T: RSI(14) < 30 (too simplistic, easily fooled by trends)

DO: Combine 4-5 indicators for robust valuation scoring:

DimensionIndicatorBullish SignalWeight
MomentumRSI(14)< 351.0
Trend PositionPrice vs SMA(200)Price < SMA2001.0
Volatility BandBollinger BandsPrice < BB_Lower1.0
DrawdownPrice vs 90-day HighDrawdown > 25%1.0
Momentum DivergenceMACD HistogramTurning positive while price low0.5
Volume ConfirmationVolume vs MA(20)Volume spike (>1.5x) on dip0.5

Valuation Score = Sum of triggered signals × weights

  • Score ≥ 3.0: Strong undervaluation
  • Score 2.0-3.0: Moderate undervaluation
  • Score < 2.0: Weak/no signal

📈 "Overvalued/Expensive/Overbought" → Multi-Factor Model

DimensionIndicatorBearish SignalWeight
MomentumRSI(14)> 701.0
Trend ExtensionPrice vs SMA(200)Price > SMA200 × 1.31.0
Volatility BandBollinger BandsPrice > BB_Upper1.0
From Recent LowPrice vs 90-day LowGain > 50%1.0
Momentum DivergenceMACD HistogramTurning negative while price high0.5
Volume Dry-upVolume vs MA(20)Volume declining on rally0.5

🚀 "Trend/Bullish/Uptrend" → Multi-Timeframe Confirmation

DON'T: Price > EMA(21) (single timeframe, easily whipsawed)

DO: Require alignment across timeframes:

TimeframeConditionPurpose
Long-termPrice > SMA(200)Major trend direction
Medium-termPrice > EMA(50)Intermediate trend
Short-termEMA(9) > EMA(21)Recent momentum
MomentumMACD > Signal LineAcceleration
StrengthADX > 25Trend strength confirmation

Entry: All conditions aligned Exit: Short-term reversal (EMA9 < EMA21) OR momentum loss (MACD cross down)

💥 "Breakout" → Volume-Confirmed Breakout

DON'T: Price > BB_Upper (many false breakouts)

DO: Require multiple confirmations:

ConditionPurpose
Price > BB_Upper(20, 2.0)Statistical breakout
Volume > 2.0 × Volume_MA(20)Strong participation
Close in top 25% of candle rangeBuying pressure
RSI(14) > 50 but < 80Momentum without exhaustion
Previous 5 candles: tight range (BB width contracting)Coiled energy

📊 "DCA" → Smart DCA with Valuation Adjustment

DON'T: Fixed amount every period (misses opportunities)

DO: Dynamic allocation based on valuation score:

Valuation ScoreMarket StateAllocation
≥ +3.0🟢🟢 Extreme undervaluationBase × 2.0
+1.5 to +3.0🟢 UndervaluedBase × 1.5
-1.5 to +1.5🟡 Fair valueBase × 1.0
-3.0 to -1.5🔴 OvervaluedBase × 0.5
≤ -3.0🔴🔴 Extreme overvaluationBase × 0.25

🔄 "Mean Reversion" → Statistical Deviation Strategy

ConditionEntryExit
Z-ScorePrice Z-score < -2.0Z-score > 0
BB PositionPrice < BB_LowerPrice > BB_Middle
RSIRSI < 30RSI > 50
ConfirmationVolume spike on dip-

---

Workflow

Step 1: Understand & Expand the Intent

When user describes a trading idea:

1. Identify the core strategy type: Mean reversion? Trend following? Breakout? DCA? 2. Extract constraints: Asset, timeframe, risk tolerance 3. Expand to multi-dimensional conditions using the templates above 4. Add appropriate risk management based on strategy type

Step 2: Present Complete Strategy for Confirmation

CRITICAL: Present strategy in this exact YAML format. Users should be impressed by the thoroughness.

## 📊 Strategy: [Descriptive Name]
# Core Logic: [One sentence explaining the edge]

Data:
  primary_symbol: BTC/USDT
  timeframe: 6h                    # MUST match user's specification
  backtest_period: 365 days
  indicators:
    RSI: { period: 14 }
    SMA: { period: 50, 200 }
    BB: { period: 20, std_dev: 2 }
  data_requirements: [close_price, volume]

Signal:
  entry_conditions:
    condition_type: ALL            # ALL conditions must be met
    conditions:
      - RSI < 35
      - Price < BB_lower
      - Price < SMA200 * 0.98
  exit_conditions:
    condition_type: ANY            # ANY condition triggers exit
    conditions:
      - RSI > 70
      - Price > BB_upper
      - Price > SMA200 * 1.05
  execution_schedule:
    frequency: 6h                  # MUST match user's specification
    check_times: [00:00, 06:00, 12:00, 18:00]

Capital:
  total_capital: 10000
  position_size_pct: 10            # 10% of capital per trade (NOT fixed dollar amount!)
  reserve_ratio: 0.2               # 20% kept as cash buffer
  max_drawdown_limit: 0.15         # 15% max drawdown

Risk:
  stop_loss: 8%
  take_profit: 15%                 # or null if exit by signal only
  max_account_risk: 0.75
  emergency_rules:
    account_risk_threshold: 0.8    # If 80% at risk → close_all

Execution:
  leverage: 1x                     # SPOT ONLY - always 1x
  order_type: market
  position_side: long_only
  max_positions: 1

✅ Please review and confirm. Reply "OK" to run backtest, or tell me what to adjust.

⛔ STOP: WAIT FOR USER CONFIRMATION

DO NOT proceed to Step 3 until user explicitly confirms the strategy.

  • If user says "OK", "确认", "没问题", "go ahead" → proceed to backtest
  • If user has questions or wants changes → modify strategy and present again
  • NEVER run backtest without user confirmation

---

Step 3: Run Backtest (ONLY after user confirms)

IMPORTANT: Detect the user's language and pass the --lang parameter accordingly:

  • If user writes in Chinese → --lang zh
  • If user writes in English → --lang en

This ensures the HTML report text matches the user's language.

python src/backtest.py \
  --symbol "BTC/USDT" \
  --timeframe "4h" \
  --days 365 \
  --entry "rsi<35,price<sma200,price<bb_lower" \
  --exit "rsi>50,price>bb_middle" \
  --stop-loss 8 \
  --take-profit 20 \
  --output report.html \
  --lang zh  # or --lang en based on user's language

Step 4: Present Results with Insights

Show metrics AND provide actionable insights:

## 📈 Backtest Results

| Metric | Value | Assessment |
|--------|-------|------------|
| Total Return | +47.3% | ✅ Beats B&H |
| Max Drawdown | -18.2% | ⚠️ Moderate |
| Sharpe Ratio | 1.42 | ✅ Good |
| Win Rate | 64% | ✅ Healthy |
| Profit Factor | 2.1 | ✅ Strong |

### Key Insights:
- Strategy performed best during [market condition]
- Largest drawdown occurred during [event]
- Consider [specific improvement] to reduce drawdown

### Generated Files:
- `report.html` - Interactive visual report
- `strategy.py` - Runnable Python code

Step 5: Suggest Iterations

Based on results, proactively suggest:

  • Parameter optimizations
  • Additional filters
  • Alternative approaches
  • Risk adjustments

---

Strategy Templates Reference

Template 1: Multi-Factor Value Buying

DATA:

  • Symbol: BTC/USDT | Timeframe: 4h | Period: 365d
  • Indicators: RSI(14), SMA(200), BB(20,2), High_90

SIGNAL:

Entry (ALL)Exit (ANY)
RSI < 35RSI > 65
Price < SMA200_98pctPrice > SMA200
Price < BB_lowerPrice > BB_middle
Drawdown > 25%Stop Loss 10%

RISK: Stop 10% | Take Profit 25% | Position 10%

---

Template 2: Trend Following with Confirmation

DATA:

  • Symbol: BTC/USDT | Timeframe: 4h | Period: 365d
  • Indicators: SMA(200), EMA(9,21,50), MACD, ADX

SIGNAL:

Entry (ALL)Exit (ANY)
Price > SMA200EMA9 < EMA21
EMA9 > EMA21Price < SMA50
MACD > MACD_signalMACD crossunder
ADX > 25Stop Loss 8%

RISK: Stop 8% | Trailing Stop 3xATR | Position 15%

---

Template 3: Volume-Confirmed Breakout

DATA:

  • Symbol: BTC/USDT | Timeframe: 1h | Period: 180d
  • Indicators: High_20, Volume_MA(20), RSI(14), BB(20,2)

SIGNAL:

Entry (ALL)Exit (ANY)
Price > High_20Price < EMA21
Volume > Volume_MA_200pctRSI > 80
RSI between 50-75Stop Loss 5%
BB_width contractingTake Profit 15%

RISK: Stop 5% | Take Profit 15% | Position 20%

---

Template 4: Smart DCA

DATA:

  • Symbol: BTC/USDT | Timeframe: 1d | Frequency: Weekly

SIGNAL (Valuation-Based Allocation):

ScoreMarket StateAllocation
≥ +3🟢🟢 Strong buy zoneBase × 2.0
+1.5 to +3🟢 UndervaluedBase × 1.5
-1.5 to +1.5🟡 Fair valueBase × 1.0
-3 to -1.5🔴 OvervaluedBase × 0.5
≤ -3🔴🔴 Extreme cautionBase × 0.25

CAPITAL: Base $200/week | Reserve 20% | Max DD 15%

---

Template 5: Pair Trading / Relative Strength

CONCEPT: When two correlated assets (e.g., BTC & ETH) diverge significantly, the underperformer tends to catch up. Trade this mean reversion.

Data:
  primary_symbols: [BTC/USDT, ETH/USDT]
  timeframe: 4h
  lookback_period: 20  # For calculating relative performance
  data_requirements: [close_price]

Signal:
  entry_conditions:
    condition_type: ANY
    conditions:
      - spread > +5%   # BTC outperforming → Long ETH
      - spread < -5%   # ETH outperforming → Long BTC
  exit_conditions:
    condition_type: ANY
    conditions:
      - abs(spread) < 1%  # Spread reverted to mean
      - stop_loss: -8%
      - take_profit: +15%

Capital:
  total_capital: 10000
  allocation_per_trade: 20%  # of total capital
  reserve_ratio: 0.3

Risk:
  stop_loss: 8%
  take_profit: 15%
  max_drawdown_limit: 15%

Execution:
  leverage: 1x (spot only)
  order_type: market
  position_side: long_only

IMPORTANT THRESHOLD GUIDELINES:

  • 20-period (80h ≈ 3.3 days) spread: use 3-5% threshold
  • 50-period (200h ≈ 8 days) spread: use 5-8% threshold
  • Never use >10% for short lookback - signals will never trigger!

---

Technical Reference

Indicators Available (pandas-ta)

Momentum: RSI, MACD, Stochastic, Williams %R, CCI
Trend: SMA, EMA, ADX, Aroon, Supertrend
Volatility: Bollinger Bands, ATR, Keltner Channels
Volume: OBV, Volume SMA, VWAP

Risk Profiles

Conservative:  SL=5%,  TP=12%, position=5%,  max 3 concurrent
Moderate:      SL=8%,  TP=20%, position=10%, max 5 concurrent
Aggressive:    SL=12%, TP=35%, position=20%, max 8 concurrent

---

Technical Reference: Available Indicators

Momentum Indicators

IndicatorColumn NameDescription
RSIrsiRelative Strength Index (14)
Stochastic %Kstoch_kStochastic oscillator K line
Stochastic %Dstoch_dStochastic oscillator D line
Williams %RwillrWilliams %R (14)
CCIcciCommodity Channel Index (20)
MFImfiMoney Flow Index (14)
ROCroc, roc_20Rate of Change (10, 20)
MACDmacd, macd_signal, macd_histMACD line, signal, histogram

Trend Indicators

IndicatorColumn NameDescription
SMAsma9, sma21, sma50, sma100, sma200Simple Moving Averages
EMAema9, ema21, ema50, ema100, ema200Exponential Moving Averages
ADXadxAverage Directional Index (trend strength)
+DI / -DIplus_di, minus_diDirectional Indicators

Volatility Indicators

IndicatorColumn NameDescription
Bollinger Bandsbb_upper, bb_middle, bb_lowerUpper, middle, lower bands
BB Widthbb_widthBand width (volatility measure)
BB %Bbb_pctPrice position in BB range (0-1)
ATRatrAverage True Range (14)
ATR %atr_pctATR as % of price

Volume Indicators

IndicatorColumn NameDescription
Volume SMAvolume_sma20-period volume average
Volume Ratiovolume_ratioCurrent volume / average
OBVobv, obv_smaOn-Balance Volume

Price Position Indicators

IndicatorColumn NameDescription
Rolling Highhigh_20, high_50, high_90, high_200N-period high
Rolling Lowlow_20, low_50, low_90, low_200N-period low
Drawdowndrawdown, drawdown_50% from rolling high
Price Positionprice_position_90Position in 90-day range (0-1)
Distance from MAdist_sma50, dist_sma200% distance from MA

Derived / Change Indicators

IndicatorColumn NameDescription
Price Changeprice_change, price_pct_change1-period change
Price Change 5price_change_5, price_pct_change_55-period change
RSI Changersi_changeRSI momentum
MACD Changemacd_change, macd_hist_changeMACD momentum
Consecutive Upconsecutive_upCount of consecutive up days
Consecutive Downconsecutive_downCount of consecutive down days

---

Technical Reference: Condition Syntax

1. Simple Comparisons

rsi<30              # RSI below 30
price>sma200        # Price above SMA 200
adx>=25             # ADX at least 25
bb_pct<0.2          # Price in lower 20% of BB range
drawdown<-20        # Down 20% from recent high
volume_ratio>2      # Volume 2x above average

2. Crossover / Crossunder

macd_crossover                  # MACD crosses above signal (default)
ema9_cross_above_ema21          # EMA9 crosses above EMA21
price_crossover_sma50           # Price crosses above SMA50
rsi_crossunder_50               # RSI crosses below 50
stoch_k_cross_above_stoch_d     # Stochastic golden cross

3. Turning Points

rsi_turning_up          # RSI starts increasing
macd_hist_turning_down  # MACD histogram starts decreasing
price_turning_up        # Price reversal upward

4. Consecutive Periods

rsi<30_for_3            # RSI below 30 for 3 consecutive periods
price>sma200_for_5      # Price above SMA200 for 5 periods
consecutive_up>=3       # At least 3 consecutive up days

5. Combined Conditions

Conditions are comma-separated. Entry uses AND logic, Exit uses OR logic.

--entry "rsi<35,price<bb_lower,volume_ratio>1.5"
--exit "rsi>70,price>bb_upper"

---

Important Guidelines

1. Never use single indicators - Always combine multiple dimensions 2. Explain the logic - Users should understand WHY each indicator is included 3. Match complexity to strategy - DCA needs valuation model, trend following needs multi-TF 4. Be honest about limitations - Past performance ≠ future results 5. Encourage iteration - Backtesting is a process, not a one-shot

---

⚠️ CRITICAL: Exchange Data Limits

Different exchanges have different historical data limits!

ExchangeApproximate LimitNotes
OKX~60-90 daysDefault. Good for short-term backtests
KuCoin~200 daysGood alternative for medium-term
Binance1000+ daysMost data, but blocked in some regions
Bybit~200 daysGood alternative

If you need more than 90 days of data:

# OKX default - will only get ~90 days even if you request 365
python src/backtest.py --symbol BTC/USDT --days 365 ...

# Use KuCoin for ~200 days (works in most regions)
python src/backtest.py --symbol BTC/USDT --days 180 --exchange kucoin ...

# Use Binance for 365+ days (if accessible in your region)
python src/backtest.py --symbol BTC/USDT --days 365 --exchange binance ...

---

File Locations

  • Backtest engine: src/backtest.py
  • Smart DCA: src/smart_dca.py
  • Pair Trading: src/pair_trading.py
  • Output reports: current working directory
  • Generated code: current working directory

Smart DCA Usage

For DCA strategies, use the dedicated Smart DCA script:

python src/smart_dca.py \
  --symbol "BTC/USDT" \
  --days 1095 \
  --base-amount 200 \
  --frequency 7 \
  --output smart_dca_report.html \
  --lang zh  # or --lang en based on user's language

Pair Trading / Relative Strength Usage

For pair trading strategies that compare two assets (e.g., BTC vs ETH):

python src/pair_trading.py \
  --symbol-a "BTC/USDT" \
  --symbol-b "ETH/USDT" \
  --days 365 \
  --timeframe 4h \
  --lookback 20 \
  --threshold 10 \
  --exit-threshold 2 \
  --output pair_trading_report.html \
  --lang zh  # or --lang en based on user's language \
  --description "Long the underperformer when BTC/ETH spread deviates"

Parameters:

  • --lookback: Period for calculating relative performance (default: 20)
  • --threshold: Entry threshold - spread deviation % to trigger entry (default: 10)
  • --exit-threshold: Exit threshold - spread deviation % to close position (default: 2)

Language Support

CRITICAL: Always detect the user's language and pass the appropriate --lang parameter:

  • User writes in Chinese → --lang zh (report in Chinese)
  • User writes in English → --lang en (report in English)

This ensures the generated HTML report matches the user's language preference.

Related skills

FAQ

Does crypto-backtest support leverage or shorting?

No. It supports spot trading strategies only, all long-only, with no leverage, shorting, or futures/perpetual contracts.

Where does the historical data come from?

It fetches real historical data from 200+ exchanges via CCXT, with a note that OKX only provides roughly 60-90 days of history.

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.