ビットコインの取引、どうすればうまくいく?「Chande Kroll Stop」作戦の反省会
これは、ビットコインをいつ買っていつ売るか、タイミングを見つけるための作戦の一つです。でも、今回この作戦を試してみたら、残念ながらあまり良い結果になりませんでした。どうしてうまくいかなかったのか、そしてこれからどうすれば良いのかを、分かりやすく説明しますね。
導入と前提条件
これは、ビットコインをいつ買っていつ売るか、タイミングを見つけるための作戦の一つです。でも、今回この作戦を試してみたら、残念ながらあまり良い結果になりませんでした。どうしてうまくいかなかったのか、そしてこれからどうすれば良いのかを、分かりやすく説明しますね。
【検証】戦略のバックテスト概要
- 戦略名: Chande Kroll Stop を使用したトレンド追従戦略
- 対象銘柄: BTC/USDT
- 時間足: 1h
- 期間: 2025-04-28〜2025-08-26(119日間)
- 初期資金: $10,000
- 手数料・スリッページ: 0.1% / 0.1%
- 取引所: binance
Chande Kroll Stop の理論的背景
この作戦は、「ものの値段は、一度動き出すとしばらく同じ方向に動きやすい」という考え方が元になっています。だから、上がり始めたら「もっと上がるかも!」と考えて買い、下がり始めたら「もっと下がるかも…」と考えて売るんです。でも、いつまでも同じ方向に動くとは限らないので、「もし急に反対に動いたら、これくらいの損でやめておこう」というラインを決めておくのが大事です。この作戦の賢いところは、値段の動きが激しい時は損切りのラインを遠くに、動きが穏やかな時は近くに、自動で調整してくれるところです。これで、できるだけ利益を伸ばしつつ、大きな損は避けることを目指します。
具体的な売買ルール(今回の検証)
エントリー条件
- 「ここを超えたら上がりそう」というラインを値段が上回ったら、買うチャンスです。
- 「ここを割ったら下がりそう」というラインを値段が下回ったら、売るチャンスです。
エグジット条件
- ビットコインを買っている時に、値段の勢いがなくなって「下がりそう」のラインを下回ったら、利益や損を確定させて取引を終わらせます。
- ビットコインを売っている時に、値段が持ち直して「上がりそう」のラインを上回ったら、同じように取引を終わらせます。
リスク管理
もし損がふくらんできたら、自動で取引をやめて、それ以上お金が減らないようにします。これは「これ以上は損したくない!」と決めておいたライン(損切りライン)を値段が超えちゃったら、たとえ損していても取引を強制終了する、という大事なルールです。今回のテストでは、この損切りがたくさん起こってしまったみたいです。
再現手順(HowTo)
- Python/依存(ccxt, pandas, ta)をインストール
- ccxtでBTC/USDTのOHLCVを取得して前処理
- 『Chande Kroll Stop』に必要な指標を算出(ta 等)
- 閾値・クロス条件から売買シグナルを生成
- 手数料・スリッページを加味して検証・評価
【結果】パフォーマンス
価格の推移
資産の推移
パフォーマンス指標
指標 | 値 |
---|---|
総トレード数 | 477回 |
勝率 | 9.43% |
平均利益 | 1% |
平均損失 | -0.55% |
期待値 | -0.4% |
プロフィットファクター | 0.2 |
最大ドローダウン | 85.39% |
最終リターン | -85.37% |
シャープレシオ | -3.86 |
HODL(Buy&Hold) | 16.56% |
HODL戦略との比較
実装コード(Python)
"""
Chande Kroll Stop Trading Signal
トレンドフォローとストップロスを組み合わせた戦略
"""
import pandas as pd
import numpy as np
def calculate_chande_kroll_stop_signals(df: pd.DataFrame,
period: int = 10,
multiplier: float = 1.0,
atr_period: int = 20) -> pd.DataFrame:
"""
Chande Kroll Stop戦略のシグナル生成
Parameters:
-----------
df : pd.DataFrame
OHLCVデータ
period : int
基本期間(デフォルト: 10)
multiplier : float
ATRの倍率(デフォルト: 1.0)
atr_period : int
ATR期間(デフォルト: 20)
Returns:
--------
pd.DataFrame
シグナルが追加されたDataFrame
"""
df = df.copy()
# True Range計算
df['h_l'] = df['high'] - df['low']
df['h_c'] = np.abs(df['high'] - df['close'].shift(1))
df['l_c'] = np.abs(df['low'] - df['close'].shift(1))
df['true_range'] = df[['h_l', 'h_c', 'l_c']].max(axis=1)
df['atr'] = df['true_range'].rolling(window=atr_period).mean()
# 初期ストップ計算
df['first_high_stop'] = df['high'].rolling(window=period).max() - multiplier * df['atr']
df['first_low_stop'] = df['low'].rolling(window=period).min() + multiplier * df['atr']
# 最終ストップライン(移動平均)
df['stop_long'] = df['first_high_stop'].rolling(window=period).mean()
df['stop_short'] = df['first_low_stop'].rolling(window=period).mean()
# シグナル初期化
df['signal'] = 0
df['is_buy'] = False
df['is_sell'] = False
# 現在のポジション状態を追跡
position = 0
for i in range(len(df)):
if i < max(period, atr_period):
continue
# 買いシグナル(価格がショートストップを上抜け)
if position <= 0 and df['close'].iloc[i] > df['stop_short'].iloc[i]:
df.loc[df.index[i], 'is_buy'] = True
df.loc[df.index[i], 'signal'] = 1
position = 1
# 売りシグナル(価格がロングストップを下抜け)
elif position >= 0 and df['close'].iloc[i] < df['stop_long'].iloc[i]:
df.loc[df.index[i], 'is_sell'] = True
df.loc[df.index[i], 'signal'] = -1
position = -1
else:
# ポジション維持
df.loc[df.index[i], 'signal'] = position
# NaN値を0で埋める
df['signal'] = df['signal'].fillna(0)
return df
def get_strategy_name() -> str:
"""戦略名を返す"""
return "Chande Kroll Stop"
def get_strategy_description() -> str:
"""戦略の説明を返す"""
return "動的なストップラインを使用したトレンドフォロー戦略"
なぜこの結果になったのか(3つの理由)
- 1損切りラインの設定が厳しすぎたようです。値段がほんの少し動いただけですぐに損切りになってしまい、利益を伸ばすチャンスを逃してしまいました。
- 2ビットコインの値段が、上がったり下がったりを小さく繰り返す、どっちつかずの動き(レンジ相場)をしていた時期だったようです。この作戦は、そういう動きが苦手なんです。
- 3勝率が10%以下と、とても低かったです。これは、10回取引したら9回は負けてしまった、ということです。たまに勝っても、たくさんの負けの分を取り戻すことはできませんでした。
この結果から学べる3つの教訓
- 1どんなに「最強!」と言われる作戦でも、相性の悪い場面ではうまくいかないことがある、ということです。
- 2作戦の細かい設定(パラメータ)が、とても大事だということです。使う暗号資産やその時の状況に合わせて、ちゃんと調整しないと期待通りには動きません。
- 3たくさん取引した(477回)のに、結果的に大きなマイナスになってしまったのは、小さな負けが積み重なって、気づいたら大きな損になっていた、ということです。
リスク管理の具体的手法
取引量の決め方
1回の取引に使うお金は、持っているお金全部ではなく、ほんの一部だけにします。例えば、おこづかいが1000円あったら、1回に使うのは10円や20円だけ、という感じです。こうすれば、もし負けてもダメージは小さくて済みます。
損失が大きくなったときの対処法
もし負けが続いて、持っているお金がすごく減ってしまったら、一度全部の取引をやめて、冷静になる時間を作ることが大切です。今回は最大で85%もお金が減っているので、このルールがうまく働いていなかった可能性があります。
資金管理の方法
取引で勝って増えたお金も、全部次の取引に使わずに、一部はちゃんと貯金しておくことが大事です。そして、取引に使うお金は、生活に必要なお金とは別に、なくなっても困らないお金の範囲でやるようにしましょう。
改良案の具体的提案
- 損切りラインを決めるための設定を、今のビットコインの動きに合わせて見直してみます。例えば、もう少しだけ値段が動いても大丈夫なように、設定を少しゆるめてみる、といったことです。
- この作戦が得意な「はっきりとした上昇や下降の波が来ているとき」だけ使うようにします。苦手な相場のときは、お休みすることも大事な作戦です。
- やみくもに取引するのではなく、「これは勝てそうだぞ!」という自信がある場面だけで勝負するように、ルールを少し変えてみます。
実用性の向上(運用上の注意)
- この作戦をそのまま使うのではなく、まずは過去のデータを使った練習モードで、自分に合った設定を見つけることが大切です。
- いきなり大きなお金を使わずに、まずはジュース1本分くらいの少額で試してみましょう。作戦がどんな風に動くのか、どれくらい危ないのかを、身をもって理解することが大事です。
- この作戦の結果だけを信じるのではなく、ニュースを見たり、他の人の意見を聞いたりして、色々な情報を集めてから最終的にどうするかを自分で決めるようにしましょう。
検証の透明性と信頼性
- データの出所: この説明は、提供されたテスト結果のデータをもとに作りました。
- 検証のやり方: 提供された作戦のプログラムを使って、「もし過去にこの作戦を使っていたらどうなっていたか?」というシミュレーション(バックテスト)をしました。
- コード: この作戦は、Pythonというプログラミング言語で作られています。
- 注意事項: このシミュレーション結果は、あくまで過去のデータを使ったものです。未来も同じように利益が出ることを保証するものではありません。投資は、最後は自分の判断と責任で行うものです。特に、今回の結果はとても悪かったので、注意してくださいね。