シェア:

ビットコインの取引、どうすればうまくいく?「Chande Kroll Stop」作戦の反省会

これは、ビットコインをいつ買っていつ売るか、タイミングを見つけるための作戦の一つです。でも、今回この作戦を試してみたら、残念ながらあまり良い結果になりませんでした。どうしてうまくいかなかったのか、そしてこれからどうすれば良いのかを、分かりやすく説明しますね。

取引数
477
勝率
9.43%
最終リターン
-85.37%
最大DD
85.39%

導入と前提条件

これは、ビットコインをいつ買っていつ売るか、タイミングを見つけるための作戦の一つです。でも、今回この作戦を試してみたら、残念ながらあまり良い結果になりませんでした。どうしてうまくいかなかったのか、そしてこれからどうすれば良いのかを、分かりやすく説明しますね。

【検証】戦略のバックテスト概要

  • 戦略名: Chande Kroll Stop を使用したトレンド追従戦略
  • 対象銘柄: BTC/USDT
  • 時間足: 1h
  • 期間: 2025-04-28〜2025-08-26(119日間)
  • 初期資金: $10,000
  • 手数料・スリッページ: 0.1% / 0.1%
  • 取引所: binance

Chande Kroll Stop の理論的背景

この作戦は、「ものの値段は、一度動き出すとしばらく同じ方向に動きやすい」という考え方が元になっています。だから、上がり始めたら「もっと上がるかも!」と考えて買い、下がり始めたら「もっと下がるかも…」と考えて売るんです。でも、いつまでも同じ方向に動くとは限らないので、「もし急に反対に動いたら、これくらいの損でやめておこう」というラインを決めておくのが大事です。この作戦の賢いところは、値段の動きが激しい時は損切りのラインを遠くに、動きが穏やかな時は近くに、自動で調整してくれるところです。これで、できるだけ利益を伸ばしつつ、大きな損は避けることを目指します。

具体的な売買ルール(今回の検証)

エントリー条件

  • 「ここを超えたら上がりそう」というラインを値段が上回ったら、買うチャンスです。
  • 「ここを割ったら下がりそう」というラインを値段が下回ったら、売るチャンスです。

エグジット条件

  • ビットコインを買っている時に、値段の勢いがなくなって「下がりそう」のラインを下回ったら、利益や損を確定させて取引を終わらせます。
  • ビットコインを売っている時に、値段が持ち直して「上がりそう」のラインを上回ったら、同じように取引を終わらせます。

リスク管理

もし損がふくらんできたら、自動で取引をやめて、それ以上お金が減らないようにします。これは「これ以上は損したくない!」と決めておいたライン(損切りライン)を値段が超えちゃったら、たとえ損していても取引を強制終了する、という大事なルールです。今回のテストでは、この損切りがたくさん起こってしまったみたいです。

再現手順(HowTo)

  1. Python/依存(ccxt, pandas, ta)をインストール
  2. ccxtでBTC/USDTのOHLCVを取得して前処理
  3. 『Chande Kroll Stop』に必要な指標を算出(ta 等)
  4. 閾値・クロス条件から売買シグナルを生成
  5. 手数料・スリッページを加味して検証・評価

【結果】パフォーマンス

価格の推移

価格推移

資産の推移

資産推移

パフォーマンス指標

指標
総トレード数477回
勝率9.43%
平均利益1%
平均損失-0.55%
期待値-0.4%
プロフィットファクター0.2
最大ドローダウン85.39%
最終リターン-85.37%
シャープレシオ-3.86
HODL(Buy&Hold)16.56%

HODL戦略との比較

HODL戦略との比較

実装コード(Python)

strategy.py
"""
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. 1損切りラインの設定が厳しすぎたようです。値段がほんの少し動いただけですぐに損切りになってしまい、利益を伸ばすチャンスを逃してしまいました。
  2. 2ビットコインの値段が、上がったり下がったりを小さく繰り返す、どっちつかずの動き(レンジ相場)をしていた時期だったようです。この作戦は、そういう動きが苦手なんです。
  3. 3勝率が10%以下と、とても低かったです。これは、10回取引したら9回は負けてしまった、ということです。たまに勝っても、たくさんの負けの分を取り戻すことはできませんでした。

この結果から学べる3つの教訓

  1. 1どんなに「最強!」と言われる作戦でも、相性の悪い場面ではうまくいかないことがある、ということです。
  2. 2作戦の細かい設定(パラメータ)が、とても大事だということです。使う暗号資産やその時の状況に合わせて、ちゃんと調整しないと期待通りには動きません。
  3. 3たくさん取引した(477回)のに、結果的に大きなマイナスになってしまったのは、小さな負けが積み重なって、気づいたら大きな損になっていた、ということです。

リスク管理の具体的手法

取引量の決め方

1回の取引に使うお金は、持っているお金全部ではなく、ほんの一部だけにします。例えば、おこづかいが1000円あったら、1回に使うのは10円や20円だけ、という感じです。こうすれば、もし負けてもダメージは小さくて済みます。

損失が大きくなったときの対処法

もし負けが続いて、持っているお金がすごく減ってしまったら、一度全部の取引をやめて、冷静になる時間を作ることが大切です。今回は最大で85%もお金が減っているので、このルールがうまく働いていなかった可能性があります。

資金管理の方法

取引で勝って増えたお金も、全部次の取引に使わずに、一部はちゃんと貯金しておくことが大事です。そして、取引に使うお金は、生活に必要なお金とは別に、なくなっても困らないお金の範囲でやるようにしましょう。

改良案の具体的提案

  • 損切りラインを決めるための設定を、今のビットコインの動きに合わせて見直してみます。例えば、もう少しだけ値段が動いても大丈夫なように、設定を少しゆるめてみる、といったことです。
  • この作戦が得意な「はっきりとした上昇や下降の波が来ているとき」だけ使うようにします。苦手な相場のときは、お休みすることも大事な作戦です。
  • やみくもに取引するのではなく、「これは勝てそうだぞ!」という自信がある場面だけで勝負するように、ルールを少し変えてみます。

実用性の向上(運用上の注意)

  • この作戦をそのまま使うのではなく、まずは過去のデータを使った練習モードで、自分に合った設定を見つけることが大切です。
  • いきなり大きなお金を使わずに、まずはジュース1本分くらいの少額で試してみましょう。作戦がどんな風に動くのか、どれくらい危ないのかを、身をもって理解することが大事です。
  • この作戦の結果だけを信じるのではなく、ニュースを見たり、他の人の意見を聞いたりして、色々な情報を集めてから最終的にどうするかを自分で決めるようにしましょう。

検証の透明性と信頼性

  • データの出所: この説明は、提供されたテスト結果のデータをもとに作りました。
  • 検証のやり方: 提供された作戦のプログラムを使って、「もし過去にこの作戦を使っていたらどうなっていたか?」というシミュレーション(バックテスト)をしました。
  • コード: この作戦は、Pythonというプログラミング言語で作られています。
  • 注意事項: このシミュレーション結果は、あくまで過去のデータを使ったものです。未来も同じように利益が出ることを保証するものではありません。投資は、最後は自分の判断と責任で行うものです。特に、今回の結果はとても悪かったので、注意してくださいね。

よくある質問

Q.「Chande Kroll Stop」って、どんな時に使うといいの?

A.値段が「ぐんぐん上がる!」とか「どんどん下がる!」みたいに、一方通行に大きく動いている時に、その波に乗るのに役立つ作戦です。逆に、行ったり来たりしている時は、あまり得意ではありません。

Q.「勝率9.43%」って、どういうこと?

A.これは、100回取引したら、勝てたのが9回ちょっとしかなかった、という意味です。ほとんどの取引で負けてしまった、ということですね。これでは、たまに勝っても全体のマイナスを取り返すのは難しいです。

Q.「最大DD:85.39%」って、どういう意味?

A.これは「最大ドローダウン」といって、一番お金が減ってしまった時の下落率のことです。もし1000円持っていたとしたら、一時的に150円くらいまで減ってしまった、というような、とても大きなピンチがあったことを示しています。

Q.「PF:0.2」って、どういう意味?

A.PFは「プロフィットファクター」の略で、儲けの効率を表す数字です。「損した金額」に対して「儲かった金額」がどれくらいかを示します。0.2というのは、例えば500円損して、やっと100円儲かった、というような状況です。この数字が1より大きくないと、トータルで損していることになります。

Q.この作戦で勝つには、どうしたらいいの?

A.まず、作戦の細かいルール(設定値)を、今のビットコインの動きに合わせて調整することが第一歩です。また、この作戦が得意な相場を見極めて、そういう時だけ取引するようにしたり、損切りのルールを見直したりすることも大切になります。

Q.検証に使用した期間と時間足は?

A.1h足で検証しました。期間は記事内の概要をご確認ください。

Q.最終リターンと最大ドローダウンは?

A.最終リターンは-85.37%、最大DDは85.39%です。

Q.勝率やPFはどの程度?

A.勝率は9.43%、プロフィットファクターは0.20です。

Q.HODLとの比較結果は?

A.HODLは16.56%でした。記事内の比較表をご覧ください。

Q.手数料やスリッページは考慮済み?

A.はい。バックテスト設定の手数料・スリッページを損益に反映しています。

Q.市場環境はトレンド/レンジどちらに近かった?

A.期間中はトレンド優勢と推測されます。

Q.この戦略は初心者でも扱える?

A.基礎的な指標と検証環境の知識があれば扱えます。まずは少額・デモから。

Q.推奨のリスク管理は?

A.最大DDを踏まえた損切り・ポジションサイジングと、システム停止基準の設定を推奨します。

Q.将来の結果は期待できる?

A.過去の結果は将来を保証しません。市場環境やパラメータ適合性に大きく依存します。

Q.改良の方向性は?

A.トレンド・ボラティリティのフィルター併用、パラメータの再最適化、取引頻度の制御を検討してください。

著者情報