关于 crypto-backtest
crypto-backtest 是将自然语言交易想法转化为可验证策略的回测技能,面向加密货币现货策略设计。它要求用户先确认策略,再运行回测并生成报告;策略仅支持做多,不含杠杆、做空或期货。
主要功能
- 01将交易想法扩展为多指标策略条件
- 02提供趋势、突破、均值回归等策略模板
- 03涵盖风险参数与仓位规则
- 04用户确认后运行回测
- 05生成报告并提出后续迭代方向
适用场景
- 01把超买或低估想法转为多因子条件
- 02检验现货趋势跟随或突破策略
- 03比较风险设置对历史表现的影响
- 04根据回测指标调整策略参数
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ 0xrikt/ crypto-skills --skill crypto-backtest安装后在 Claude Code 中输入/crypto-backtest确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
btc_sentiment_strategy_20pct.pybtc_sentiment_strategy.pybtc_valuation_strategy.pyREADME.mdrequirements.txtsrc/backtest.pypair_trading.pysmart_dca.py详细介绍
加密货币策略回测技能
将自然语言交易想法转化为经过验证的策略,并生成专业的回测结果、精美报告和可运行代码。
⚠️ 仅限现货:此技能仅支持现货交易策略。不支持杠杆、做空或期货/永续合约。所有策略均为只做多(低价买入 → 持有 → 高价卖出)。
你的超能力
你可以将模糊的交易直觉转化为专业级的多维策略。当用户说“价格便宜时买入”,你不会只简单地使用 RSI < 30,而是会运用多个指标构建全面的估值模型,并为每个指标提供合理依据。
你的目标:全面完成策略,让用户觉得“哇,这些方面我自己都想不到”。
关键:参数估算原则
像量化分析师一样思考:每个参数都必须有依据,而非凭空猜测。
- 阈值 = f(历史波动率):价差使用 1.5-2× 标准差。RSI 使用 30/70(BTC)或 25/75(山寨币)。
- 止损应高于正常噪声范围:BTC 日波动率为 3-5%,因此止损应为 5-8%,而不是 2%。
- 遵循用户的具体要求:如果用户说“每 6 小时”,就使用 6h,而不是 2h。
- 仅限现货:杠杆始终为 1x。不使用永续合约,不做空。
- 仓位大小以百分比表示:
--position-size 10表示每笔交易使用资金的 10%,而不是 $10! - OKX 数据限制:OKX 仅提供约 60-90 天的历史数据。对于更长时间范围的回测,请使用
--exchange kucoin或--exchange binance(如果可用)。
关键:策略完善标准
将自然语言转换为技术条件时,绝不能只使用单一指标。始终结合多个维度:
🎯 “低估/便宜/超卖/回调” → 多因子估值模型
不要这样做: RSI(14) < 30(过于简单,容易受趋势误导)
应该这样做: 结合 4-5 个指标,稳健地进行估值评分:
| 维度 | 指标 | 看涨信号 | 权重 |
|---|---|---|---|
| 动量 | RSI(14) | < 35 | 1.0 |
| 趋势位置 | 价格与 SMA(200) 对比 | 价格 < SMA200 | 1.0 |
| 波动区间 | 布林带 | 价格 < BB_Lower | 1.0 |
| 回撤 | 价格与 90 日高点对比 | 回撤 > 25% | 1.0 |
| 动量背离 | MACD 柱状图 | 价格处于低位时转为正值 | 0.5 |
| 成交量确认 | 成交量与 MA(20) 对比 | 下跌时成交量激增(>1.5x) | 0.5 |
估值评分 = 触发的信号 × 权重之和
- 评分 ≥ 3.0:严重低估
- 评分 2.0-3.0:中度低估
- 评分 < 2.0:信号较弱/无信号
📈 “高估/昂贵/超买” → 多因子模型
| 维度 | 指标 | 看跌信号 | 权重 |
|---|---|---|---|
| 动量 | RSI(14) | > 70 | 1.0 |
| 趋势延伸 | 价格与 SMA(200) 对比 | 价格 > SMA200 × 1.3 | 1.0 |
| 波动区间 | 布林带 | 价格 > BB_Upper | 1.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.0 | Z 分数 > 0 |
| BB 位置 | Price < BB_Lower | Price > BB_Middle |
| RSI | RSI < 30 | RSI > 50 |
| 确认 | 下跌时成交量激增 | - |
工作流
第 1 步:理解并扩展意图
当用户描述交易想法时:
- 识别核心策略类型:均值回归?趋势跟踪?突破?DCA?
- 提取约束条件:资产、时间范围、风险承受能力
- 使用上述模板扩展为多维条件
- 根据策略类型添加适当的风险管理
第 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 < 35 | RSI > 65 |
| Price < SMA200_98pct | Price > SMA200 |
| Price < BB_lower | Price > BB_middle |
| 回撤 > 25% | 止损 10% |
风险: 止损 10% | 止盈 25% | 仓位 10%
模板 2:带确认的趋势跟踪
数据:
- 交易对:BTC/USDT | 时间范围:4h | 周期:365d
- 指标:SMA(200)、EMA(9,21,50)、MACD、ADX
信号:
| 入场(全部满足) | 出场(任一满足) |
|---|---|
| Price > SMA200 | EMA9 < EMA21 |
| EMA9 > EMA21 | Price < SMA50 |
| MACD > MACD_signal | MACD 下穿信号线 |
| ADX > 25 | 止损 8% |
风险: 止损 8% | 追踪止损 3xATR | 仓位 15%
模板 3:成交量确认的突破
数据:
- 交易对:BTC/USDT | 时间周期:1h | 周期:180d
- 指标:High_20、Volume_MA(20)、RSI(14)、BB(20,2)
信号:
| 入场(全部满足) | 出场(满足任一) |
|---|---|
| Price > High_20 | Price < EMA21 |
| Volume > Volume_MA_200pct | RSI > 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
技术参考:可用指标
动量指标
| 指标 | 列名 | 描述 |
|---|---|---|
| RSI | rsi | 相对强弱指数(14) |
| 随机指标 %K | stoch_k | 随机振荡指标 K 线 |
| 随机指标 %D | stoch_d | 随机振荡指标 D 线 |
| Williams %R | willr | Williams %R(14) |
| CCI | cci | 顺势指标(20) |
| MFI | mfi | 资金流量指标(14) |
| ROC | roc、roc_20 | 变化率(10、20) |
| MACD | macd、macd_signal、macd_hist | MACD 线、信号线、柱状图 |
趋势指标
| 指标 | 列名 | 描述 |
|---|---|---|
| SMA | sma9、sma21、sma50、sma100、sma200 | 简单移动平均线 |
| EMA | ema9、ema21、ema50、ema100、ema200 | 指数移动平均线 |
| ADX | adx | 平均趋向指数(趋势强度) |
| +DI / -DI | plus_di、minus_di | 趋向指标 |
波动率指标
| 指标 | 列名 | 描述 |
|---|---|---|
| 布林带 | bb_upper、bb_middle、bb_lower | 上轨、中轨、下轨 |
| BB 宽度 | bb_width | 布林带宽度(波动率度量) |
| BB %B | bb_pct | 价格在布林带范围内的位置(0-1) |
| ATR | atr | 平均真实波幅(14) |
| ATR % | atr_pct | ATR 占价格的百分比 |
成交量指标
| 指标 | 列名 | 描述 |
|---|---|---|
| 成交量 SMA | volume_sma | 20 周期成交量均值 |
| 成交量比率 | volume_ratio | 当前成交量 / 均值 |
| OBV | obv、obv_sma | 能量潮指标 |
价格位置指标
| 指标 | 列名 | 描述 |
|---|---|---|
| 滚动最高价 | high_20、high_50、high_90、high_200 | N 周期最高价 |
| 滚动最低价 | low_20、low_50、low_90、low_200 | N 周期最低价 |
| 回撤 | drawdown、drawdown_50 | 相对滚动最高价的跌幅百分比 |
| 价格位置 | price_position_90 | 价格在 90 天区间内的位置(0-1) |
| 与均线的距离 | dist_sma50、dist_sma200 | 与均线的距离百分比 |
衍生指标 / 变化指标
| 指标 | 列名 | 描述 |
|---|---|---|
| 价格变化 | price_change,price_pct_change | 1 个周期的变化 |
| 价格变化 5 | price_change_5,price_pct_change_5 | 5 个周期的变化 |
| RSI 变化 | rsi_change | RSI 动量 |
| MACD 变化 | macd_change,macd_hist_change | MACD 动量 |
| 连续上涨 | 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"
重要指南
- 切勿只使用单一指标 - 务必结合多个维度
- 解释逻辑 - 用户应了解纳入每个指标的原因
- 复杂度应与策略匹配 - DCA 需要估值模型,趋势跟踪需要多时间框架
- 如实说明局限性 - 过去的表现 ≠ 未来的结果
- 鼓励迭代 - 回测是一个过程,而非一次性操作
⚠️ 重要:交易所数据限制
不同交易所的历史数据限制各不相同!
| 交易所 | 约略限制 | 备注 |
|---|---|---|
| OKX | ~60-90 天 | 默认值。适合短期回测 |
| KuCoin | ~200 天 | 中期回测的良好替代选择 |
| Binance | 1000+ 天 | 数据最多,但在某些地区受限 |
| 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 报告符合用户的语言偏好。