mcpField
C
crypto-backtest

crypto-backtest

github.com/0xrikt数据与数据库18121 次安装39 周前更新
代码仓库

关于 crypto-backtest

crypto-backtest 是将自然语言交易想法转化为可验证策略的回测技能,面向加密货币现货策略设计。它要求用户先确认策略,再运行回测并生成报告;策略仅支持做多,不含杠杆、做空或期货。

主要功能

  1. 01将交易想法扩展为多指标策略条件
  2. 02提供趋势、突破、均值回归等策略模板
  3. 03涵盖风险参数与仓位规则
  4. 04用户确认后运行回测
  5. 05生成报告并提出后续迭代方向

适用场景

  1. 01把超买或低估想法转为多因子条件
  2. 02检验现货趋势跟随或突破策略
  3. 03比较风险设置对历史表现的影响
  4. 04根据回测指标调整策略参数

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/0xrikt/crypto-skills --skill crypto-backtest

安装后在 Claude Code 中输入/crypto-backtest确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

btc_sentiment_strategy_20pct.py
btc_sentiment_strategy.py
btc_valuation_strategy.py
README.md
requirements.txt
src/
backtest.py
pair_trading.py
smart_dca.py

详细介绍

加密货币策略回测技能

将自然语言交易想法转化为经过验证的策略,并生成专业的回测结果、精美报告和可运行代码。

⚠️ 仅限现货:此技能仅支持现货交易策略。不支持杠杆、做空或期货/永续合约。所有策略均为只做多(低价买入 → 持有 → 高价卖出)。

你的超能力

你可以将模糊的交易直觉转化为专业级的多维策略。当用户说“价格便宜时买入”,你不会只简单地使用 RSI < 30,而是会运用多个指标构建全面的估值模型,并为每个指标提供合理依据。

你的目标:全面完成策略,让用户觉得“哇,这些方面我自己都想不到”。


关键:参数估算原则

像量化分析师一样思考:每个参数都必须有依据,而非凭空猜测。

  1. 阈值 = f(历史波动率):价差使用 1.5-2× 标准差。RSI 使用 30/70(BTC)或 25/75(山寨币)。
  2. 止损应高于正常噪声范围:BTC 日波动率为 3-5%,因此止损应为 5-8%,而不是 2%。
  3. 遵循用户的具体要求:如果用户说“每 6 小时”,就使用 6h,而不是 2h。
  4. 仅限现货:杠杆始终为 1x。不使用永续合约,不做空。
  5. 仓位大小以百分比表示:--position-size 10 表示每笔交易使用资金的 10%,而不是 $10!
  6. OKX 数据限制:OKX 仅提供约 60-90 天的历史数据。对于更长时间范围的回测,请使用 --exchange kucoin 或 --exchange binance(如果可用)。

关键:策略完善标准

将自然语言转换为技术条件时,绝不能只使用单一指标。始终结合多个维度:

🎯 “低估/便宜/超卖/回调” → 多因子估值模型

不要这样做: RSI(14) < 30(过于简单,容易受趋势误导)

应该这样做: 结合 4-5 个指标,稳健地进行估值评分:

维度指标看涨信号权重
动量RSI(14)< 351.0
趋势位置价格与 SMA(200) 对比价格 < SMA2001.0
波动区间布林带价格 < BB_Lower1.0
回撤价格与 90 日高点对比回撤 > 25%1.0
动量背离MACD 柱状图价格处于低位时转为正值0.5
成交量确认成交量与 MA(20) 对比下跌时成交量激增(>1.5x)0.5

估值评分 = 触发的信号 × 权重之和

  • 评分 ≥ 3.0:严重低估
  • 评分 2.0-3.0:中度低估
  • 评分 < 2.0:信号较弱/无信号
📈 “高估/昂贵/超买” → 多因子模型
维度指标看跌信号权重
动量RSI(14)> 701.0
趋势延伸价格与 SMA(200) 对比价格 > SMA200 × 1.31.0
波动区间布林带价格 > BB_Upper1.0
距近期低点价格与 90 日低点对比涨幅 > 50%1.0
动量背离MACD 柱状图价格处于高位时转为负值0.5
成交量萎缩成交量与 MA(20) 对比上涨时成交量下降0.5
🚀 “趋势/看涨/上升趋势” → 多时间周期确认

不要这样做: Price > EMA(21)(仅使用一个时间周期,容易遭遇反复波动)

应该这样做: 要求多个时间周期的趋势一致:

时间周期条件目的
长期价格 > SMA(200)确定主要趋势方向
中期价格 > EMA(50)确定中期趋势
短期EMA(9) > EMA(21)确定近期动量
动量MACD > 信号线确认加速
强度ADX > 25确认趋势强度

入场:所有条件均一致 出场:短期反转(EMA9 < EMA21)或动量减弱(MACD 向下交叉)

💥 “突破” → 经成交量确认的突破

不要: Price > BB_Upper(会产生许多假突破)

应该: 要求多项确认:

条件用途
Price > BB_Upper(20, 2.0)统计学上的突破
Volume > 2.0 × Volume_MA(20)参与度强劲
收盘价位于 K 线区间顶部 25%买盘压力
RSI(14) > 50 但 < 80有动能但未过热
前 5 根 K 线:区间狭窄(BB 宽度收缩)能量蓄积
📊 “DCA” → 根据估值调整的智能 DCA

不要: 每个周期投入固定金额(会错过机会)

应该: 根据估值评分动态分配:

估值评分市场状态分配金额
≥ +3.0🟢🟢 极度低估基础金额 × 2.0
+1.5 至 +3.0🟢 低估基础金额 × 1.5
-1.5 至 +1.5🟡 公允估值基础金额 × 1.0
-3.0 至 -1.5🔴 高估基础金额 × 0.5
≤ -3.0🔴🔴 极度高估基础金额 × 0.25
🔄 “均值回归” → 统计偏离策略
条件入场出场
Z 分数价格 Z 分数 < -2.0Z 分数 > 0
BB 位置Price < BB_LowerPrice > BB_Middle
RSIRSI < 30RSI > 50
确认下跌时成交量激增-

工作流

第 1 步:理解并扩展意图

当用户描述交易想法时:

  1. 识别核心策略类型:均值回归?趋势跟踪?突破?DCA?
  2. 提取约束条件:资产、时间范围、风险承受能力
  3. 使用上述模板扩展为多维条件
  4. 根据策略类型添加适当的风险管理
第 2 步:提交完整策略供确认

重要: 请严格按照以下 YAML 格式提交策略。让用户感受到策略的全面性。

## 📊 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

✅ 请检查并确认。回复“OK”以运行回测,或告诉我需要调整的内容。

⛔ 停止:等待用户确认

在用户明确确认策略之前,不要继续执行第 3 步。

  • 如果用户回复“OK”、“确认”、“没问题”或“go ahead”→ 继续进行回测
  • 如果用户有疑问或希望修改 → 修改策略并重新提交
  • 未经用户确认,绝不要运行回测

第 3 步:运行回测(仅在用户确认后)

重要: 检测用户使用的语言,并相应地传递 --lang 参数:

  • 如果用户使用中文 → --lang zh
  • 如果用户使用英语 → --lang en

这样可以确保 HTML 报告文本与用户使用的语言一致。

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
第 4 步:提供结果并给出见解

展示指标并提供可执行的见解:

## 📈 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
第 5 步:建议迭代

根据结果,主动建议:

  • 优化参数
  • 添加筛选条件
  • 采用其他方法
  • 调整风险

策略模板参考

模板 1:多因子价值买入

数据:

  • 交易对:BTC/USDT | 时间范围:4h | 周期:365d
  • 指标:RSI(14)、SMA(200)、BB(20,2)、High_90

信号:

入场(全部满足)出场(任一满足)
RSI < 35RSI > 65
Price < SMA200_98pctPrice > SMA200
Price < BB_lowerPrice > BB_middle
回撤 > 25%止损 10%

风险: 止损 10% | 止盈 25% | 仓位 10%


模板 2:带确认的趋势跟踪

数据:

  • 交易对:BTC/USDT | 时间范围:4h | 周期:365d
  • 指标:SMA(200)、EMA(9,21,50)、MACD、ADX

信号:

入场(全部满足)出场(任一满足)
Price > SMA200EMA9 < EMA21
EMA9 > EMA21Price < SMA50
MACD > MACD_signalMACD 下穿信号线
ADX > 25止损 8%

风险: 止损 8% | 追踪止损 3xATR | 仓位 15%


模板 3:成交量确认的突破

数据:

  • 交易对:BTC/USDT | 时间周期:1h | 周期:180d
  • 指标:High_20、Volume_MA(20)、RSI(14)、BB(20,2)

信号:

入场(全部满足)出场(满足任一)
Price > High_20Price < EMA21
Volume > Volume_MA_200pctRSI > 80
RSI 在 50-75 之间止损 5%
BB_width 收窄止盈 15%

风险: 止损 5% | 止盈 15% | 仓位 20%


模板 4:智能定投

数据:

  • 交易对:BTC/USDT | 时间周期:1d | 频率:每周

信号(基于估值的资金分配):

评分市场状态资金分配
≥ +3🟢🟢 强烈买入区基础金额 × 2.0
+1.5 to +3🟢 低估基础金额 × 1.5
-1.5 to +1.5🟡 公允价值基础金额 × 1.0
-3 to -1.5🔴 高估基础金额 × 0.5
≤ -3🔴🔴 极度谨慎基础金额 × 0.25

资金: 基础金额 $200/周 | 储备 20% | 最大回撤 15%


模板 5:配对交易 / 相对强度

概念: 当两种相关资产(例如 BTC 和 ETH)大幅背离时, 表现较差的资产往往会迎头赶上。利用这种均值回归进行交易。

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

重要阈值指南:

  • 20-period(80h ≈ 3.3 天)价差:使用 3-5% 阈值
  • 50-period(200h ≈ 8 天)价差:使用 5-8% 阈值
  • 短期回溯时切勿使用 >10% 的阈值,否则信号将永远不会触发!

技术参考

可用指标(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
风险配置
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

技术参考:可用指标

动量指标
指标列名描述
RSIrsi相对强弱指数(14)
随机指标 %Kstoch_k随机振荡指标 K 线
随机指标 %Dstoch_d随机振荡指标 D 线
Williams %RwillrWilliams %R(14)
CCIcci顺势指标(20)
MFImfi资金流量指标(14)
ROCroc、roc_20变化率(10、20)
MACDmacd、macd_signal、macd_histMACD 线、信号线、柱状图
趋势指标
指标列名描述
SMAsma9、sma21、sma50、sma100、sma200简单移动平均线
EMAema9、ema21、ema50、ema100、ema200指数移动平均线
ADXadx平均趋向指数(趋势强度)
+DI / -DIplus_di、minus_di趋向指标
波动率指标
指标列名描述
布林带bb_upper、bb_middle、bb_lower上轨、中轨、下轨
BB 宽度bb_width布林带宽度(波动率度量)
BB %Bbb_pct价格在布林带范围内的位置(0-1)
ATRatr平均真实波幅(14)
ATR %atr_pctATR 占价格的百分比
成交量指标
指标列名描述
成交量 SMAvolume_sma20 周期成交量均值
成交量比率volume_ratio当前成交量 / 均值
OBVobv、obv_sma能量潮指标
价格位置指标
指标列名描述
滚动最高价high_20、high_50、high_90、high_200N 周期最高价
滚动最低价low_20、low_50、low_90、low_200N 周期最低价
回撤drawdown、drawdown_50相对滚动最高价的跌幅百分比
价格位置price_position_90价格在 90 天区间内的位置(0-1)
与均线的距离dist_sma50、dist_sma200与均线的距离百分比
衍生指标 / 变化指标
指标列名描述
价格变化price_change,price_pct_change1 个周期的变化
价格变化 5price_change_5,price_pct_change_55 个周期的变化
RSI 变化rsi_changeRSI 动量
MACD 变化macd_change,macd_hist_changeMACD 动量
连续上涨consecutive_up连续上涨天数
连续下跌consecutive_down连续下跌天数

技术参考:条件语法

1. 简单比较
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. 上穿 / 下穿
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. 转折点
rsi_turning_up          # RSI starts increasing
macd_hist_turning_down  # MACD histogram starts decreasing
price_turning_up        # Price reversal upward
4. 连续周期
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. 组合条件

条件以逗号分隔。入场使用 AND 逻辑,退出使用 OR 逻辑。

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

重要指南

  1. 切勿只使用单一指标 - 务必结合多个维度
  2. 解释逻辑 - 用户应了解纳入每个指标的原因
  3. 复杂度应与策略匹配 - DCA 需要估值模型,趋势跟踪需要多时间框架
  4. 如实说明局限性 - 过去的表现 ≠ 未来的结果
  5. 鼓励迭代 - 回测是一个过程,而非一次性操作

⚠️ 重要:交易所数据限制

不同交易所的历史数据限制各不相同!

交易所约略限制备注
OKX~60-90 天默认值。适合短期回测
KuCoin~200 天中期回测的良好替代选择
Binance1000+ 天数据最多,但在某些地区受限
Bybit~200 天良好的替代选择

如果需要超过 90 天的数据:

# 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 ...

文件位置

  • 回测引擎:src/backtest.py
  • Smart DCA:src/smart_dca.py
  • 配对交易:src/pair_trading.py
  • 输出报告:当前工作目录
  • 生成的代码:当前工作目录

Smart DCA 用法

对于 DCA 策略,请使用专用的 Smart DCA 脚本:

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

配对交易 / 相对强度用法

对于比较两种资产(例如 BTC 与 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"

参数:

  • --lookback:计算相对表现的周期(默认值:20)
  • --threshold:入场阈值 - 触发入场的价差偏离百分比(默认值:10)
  • --exit-threshold:退出阈值 - 平仓时的价差偏离百分比(默认值:2)

语言支持

重要:始终检测用户使用的语言,并传入相应的 --lang 参数:

  • 用户使用中文 → --lang zh(报告使用中文)
  • 用户使用英文 → --lang en(报告使用英文)

这样可以确保生成的 HTML 报告符合用户的语言偏好。

评论

支持 Markdown