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%なので、ストップロスは 2%ではなく 5~8%にします。
- ユーザーの指定を厳守:「6時間ごと」と指定された場合は、2時間ではなく 6時間を使用します。
- 現物取引のみ:レバレッジ = 常に 1x です。無期限契約や空売りは使用しません。
- ポジションサイズはパーセンテージ:
--position-size 10は、取引ごとに資金の 10%を意味し、10 ドルではありません。 - OKX のデータ制限:OKX が提供する過去データは約 60~90 日分のみです。より長期間のバックテストには、
--exchange kucoinまたは--exchange binance(アクセスできる場合)を使用します。
重要:戦略を完成させるための基準
自然言語を技術的な条件に変換する際、単一の指標を使用してはいけません。常に複数の側面を組み合わせてください。
🎯 「割安/安い/売られすぎ/押し目」→ 多因子評価モデル
使用しないでください: RSI(14) < 30(単純すぎて、トレンドに惑わされやすい)
使用してください: 4~5 個の指標を組み合わせ、堅牢な評価スコアを算出します。
| 観点 | 指標 | 強気シグナル | 重み |
|---|---|---|---|
| モメンタム | RSI(14) | < 35 | 1.0 |
| トレンド内の位置 | 価格 vs SMA(200) | 価格 < SMA200 | 1.0 |
| ボラティリティバンド | ボリンジャーバンド | 価格 < BB_Lower | 1.0 |
| ドローダウン | 価格 vs 90日高値 | ドローダウン > 25% | 1.0 |
| モメンタムのダイバージェンス | MACD ヒストグラム | 価格が低いときにプラスへ転じる | 0.5 |
| 出来高による確認 | 出来高 vs MA(20) | 押し目で出来高が急増(>1.5x) | 0.5 |
評価スコア = 発生したシグナルの合計 × 重み
- スコア ≥ 3.0:割安度が高い
- スコア 2.0~3.0:割安度が中程度
- スコア < 2.0:シグナルが弱い、またはなし
📈 「割高/高い/買われすぎ」→ 多因子モデル
| 観点 | 指標 | 弱気シグナル | 重み |
|---|---|---|---|
| モメンタム | RSI(14) | > 70 | 1.0 |
| トレンドの伸び | 価格 vs SMA(200) | 価格 > SMA200 × 1.3 | 1.0 |
| ボラティリティバンド | ボリンジャーバンド | 価格 > BB_Upper | 1.0 |
| 直近安値からの上昇 | 価格 vs 90日安値 | 上昇率 > 50% | 1.0 |
| モメンタムのダイバージェンス | MACD ヒストグラム | 価格が高いときにマイナスへ転じる | 0.5 |
| 出来高の減少 | 出来高 vs 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) | 強い市場参加 |
| ローソク足の値幅の上位25%で終値を付ける | 買い圧力 |
| RSI(14) > 50 かつ < 80 | 過熱していないモメンタム |
| 直近5本のローソク足:値幅が狭い(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」と返信するか、調整したい点をお知らせください。
⛔ STOP:ユーザーの確認を待つ
ユーザーが戦略を明示的に確認するまで、ステップ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:スマート DCA
データ:
- シンボル: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% | 最大 DD 15%
テンプレート 5:ペアトレード/相対的な強さ
コンセプト: 相関する2つの資産(例: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期間(80h ≈ 3.3日)のスプレッド:3~5%のしきい値を使用します
- 50期間(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 Width | bb_width | バンド幅(ボラティリティの指標) |
| BB %B | bb_pct | BB 範囲内での価格の位置(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
ペアトレード/相対強度の使用方法
2つの資産(例: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 レポートがユーザーの言語設定に合致します。