シェア:

ビットコインで「値段の波」に乗ろう!『ギザギザ突破』作戦!

これは、ビットコインの値段のグラフを使って、「今がチャンス!」というタイミングを見つける作戦のことです。1時間ごとの値段の動きを見て、値段がぐんと上がりそう、または下がりそうな勢いを見つけます。過去のデータで試してみたら、勝つ確率は10回中4回弱くらいでした。でも、うまくいくと大きな利益が狙える、そんな作戦なんです。

取引数
64
勝率
35.94%
最終リターン
-2.10%
最大DD
23.51%

導入と前提条件

これは、ビットコインの値段のグラフを使って、「今がチャンス!」というタイミングを見つける作戦のことです。1時間ごとの値段の動きを見て、値段がぐんと上がりそう、または下がりそうな勢いを見つけます。過去のデータで試してみたら、勝つ確率は10回中4回弱くらいでした。でも、うまくいくと大きな利益が狙える、そんな作戦なんです。

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

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

Fractal Breakout の理論的背景

この作戦の裏には、「値段の動きは、歴史は繰り返すみたいに、前の動きと似たような形になることが多い」という考え方があります。グラフにできる「山」や「谷」は、たくさんの人が「ここが大事なポイントだ」と注目している場所なんです。だから、値段がそのポイントを突き抜けると、一気に値段が動くことがあります。そのグンと動く瞬間をねらって、利益を出そう!というのがこの作戦の目的です。難しい計算は必要なくて、グラフの形を見るだけでOKです。

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

エントリー条件

  • 値段が、前の「山」のてっぺんを越えたら「買う」合図です。
  • 値段が、前の「谷」の底を抜けたら「売る」合図です。

エグジット条件

  • 利益が出ているときは、逆の合図(たとえば「買う」で始めたら「谷」ができる)が出たら、そこで取引を終わりにします。
  • もし予想が外れて損が出ちゃったときは、最初に決めておいた「ここまで損したらやめる」というライン(損切り)で、取引を終わりにします。

リスク管理

一回の取引で大失敗しないように、使うお金は持っているお金全体のほんの一部(たとえば100分の1)だけにするのがルールです。それに、予想が外れても被害が大きくならないように、「ここまで値段が動いたらあきらめる」という損切りラインを絶対に決めておきます。

再現手順(HowTo)

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

【結果】パフォーマンス

価格の推移

価格推移

資産の推移

資産推移

パフォーマンス指標

指標
総トレード数64回
勝率35.94%
平均利益3.88%
平均損失-2.13%
期待値0.03%
プロフィットファクター0.97
最大ドローダウン23.51%
最終リターン-2.1%
シャープレシオ0.02
HODL(Buy&Hold)43.16%

HODL戦略との比較

HODL戦略との比較

実装コード(Python)

strategy.py
#!/usr/bin/env python3
"""
フラクタルブレイクアウト戦略
Bill Williamsのフラクタルパターンを検出
"""
import pandas as pd
import numpy as np


def calculate_fractal_signals(df: pd.DataFrame, fractal_period: int = 5) -> pd.DataFrame:
    """
    フラクタルブレイクアウトシグナルを生成
    
    Parameters:
    -----------
    df : pd.DataFrame
        OHLCVデータ
    fractal_period : int
        フラクタル検出期間(デフォルト: 5、奇数推奨)
    
    Returns:
    --------
    pd.DataFrame
        シグナル列が追加されたDataFrame
    """
    df = df.copy()
    
    # 中心インデックス
    center = fractal_period // 2
    
    # 上昇フラクタル(高値の山)
    df['up_fractal'] = False
    for i in range(center, len(df) - center):
        is_fractal = True
        center_high = df.loc[df.index[i], 'high']
        
        # 左側をチェック
        for j in range(i - center, i):
            if df.loc[df.index[j], 'high'] >= center_high:
                is_fractal = False
                break
        
        # 右側をチェック
        if is_fractal:
            for j in range(i + 1, i + center + 1):
                if df.loc[df.index[j], 'high'] >= center_high:
                    is_fractal = False
                    break
        
        df.loc[df.index[i], 'up_fractal'] = is_fractal
    
    # 下降フラクタル(安値の谷)
    df['down_fractal'] = False
    for i in range(center, len(df) - center):
        is_fractal = True
        center_low = df.loc[df.index[i], 'low']
        
        # 左側をチェック
        for j in range(i - center, i):
            if df.loc[df.index[j], 'low'] <= center_low:
                is_fractal = False
                break
        
        # 右側をチェック
        if is_fractal:
            for j in range(i + 1, i + center + 1):
                if df.loc[df.index[j], 'low'] <= center_low:
                    is_fractal = False
                    break
        
        df.loc[df.index[i], 'down_fractal'] = is_fractal
    
    # フラクタルレベル(サポート・レジスタンス)
    df['fractal_resistance'] = np.nan
    df['fractal_support'] = np.nan
    
    # フラクタルポイントのみを更新
    df.loc[df['up_fractal'], 'fractal_resistance'] = df.loc[df['up_fractal'], 'high']
    df.loc[df['down_fractal'], 'fractal_support'] = df.loc[df['down_fractal'], 'low']
    
    # 前方埋め(ffill)で値を継続
    df['fractal_resistance'] = df['fractal_resistance'].ffill()
    df['fractal_support'] = df['fractal_support'].ffill()
    
    # シグナル生成(フラクタルブレイクアウト)
    df['is_buy'] = (
        (df['close'] > df['fractal_resistance'].shift(1)) & 
        (df['close'].shift(1) <= df['fractal_resistance'].shift(2))
    )
    
    df['is_sell'] = (
        (df['close'] < df['fractal_support'].shift(1)) & 
        (df['close'].shift(1) >= df['fractal_support'].shift(2))
    )
    
    # NaN値をFalseに置換
    df['is_buy'] = df['is_buy'].fillna(False)
    df['is_sell'] = df['is_sell'].fillna(False)
    
    print(f"フラクタルブレイクアウト: 期間={fractal_period}")
    print(f"買いシグナル数: {df['is_buy'].sum()}")
    print(f"売りシグナル数: {df['is_sell'].sum()}")
    
    return df

なぜこの結果になったのか(3つの理由)

  1. 1勝つ確率は10回に4回弱と少し低めです。でもそれは、小さな勝ちをコツコツねらうより、「一回で大きく勝つ!」ことを目指す作戦だからなんです。負けることもありますが、一回の勝ちでそれまでの負けを取りもどせるくらいの大きな利益をねらいます。
  2. 2PF(プロフィットファクター)という成績表みたいな数字が、1より少し小さい「0.97」でした。これは、今までの全部の取引を合わせると、もうかったお金より損したお金の方がほんの少しだけ多かった、という意味です。でも、これはあくまで過去のデータでのお話です。
  3. 3最大ドローダウンというのは、「一番調子が悪かったとき、一時的にどれくらいお金が減っちゃったか」を示す数字です。それが約24%と少し大きめでした。これは、大きな利益をねらうためには、途中でちょっとお金が減る時期があっても我慢する、という考え方の作戦だからなんです。

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

  1. 1グラフにできる「山」や「谷」(フラクタル)に注目すると、売り買いのタイミングを見つけるヒントになる、ということが学べます。
  2. 2勝つ確率が低くても、それだけで「ダメな作戦」と決めつけられないことがわかります。1回あたりの利益の大きさも考え合わせることで、作戦の本当の実力が見えてきます。
  3. 3過去のデータで「この作戦はうまくいったかな?」としっかり調べることの大切さが学べます。そうすることで、この作戦の得意な場面や苦手な場面がわかってきます。

リスク管理の具体的手法

取引量の決め方

まず、「今回の取引で、もし負けても失っていいお金はいくらまで」と決めます。たとえば、持っているお金の100分の1とか。そして、「ここまで値段が動いたら損切りする」という場所までの距離を考えて、どれくらいの量を売り買いするかを計算します。

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

もし、思ったよりもお金がどんどん減ってしまったら、一度お休みしましょう。そして、「どうしてうまくいかなかったんだろう?」と冷静に理由を考えて、作戦のルールを見直すことが大切です。

資金管理の方法

自分が持っているお金を、全部使ってしまうのはとても危険です。どれくらいまでなら勝負に使っていいか、ちゃんと決めておきましょう。焦ったり興奮したりせず、決めたルールをしっかり守ることが一番大事です。

改良案の具体的提案

  • 「どこでやめるか(損切り)」や「どこで利益を確定するか」のルールをもう少し工夫すれば、一時的に大きくお金が減ってしまうことを防げるかもしれません。
  • 「山」や「谷」を越える「今だ!」という合図が出たときに、他の道具(たとえば移動平均線という別の線)も一緒に見てみましょう。そうすると、もっと確かなタイミングで売り買いができるようになるかもしれません。
  • 「山」や「谷」を見つけるときに「最近の5本の棒グラフ」を見ていましたが、これを7本や9本に変えて試してみるのも良い方法です。一番成績が良くなる本数を見つけられるかもしれません。

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

  • この作戦は、ビットコインみたいに値段の上がり下がりが激しいもので使うと、効果が出やすいかもしれません。
  • グラフを見るとき、「最近5本」で「山」や「谷」を探しましたが、これを7本や9本に変えて試してみるのも面白いですよ。
  • 本番でお金を使う前に、必ず過去のデータで「この作戦、本当にうまくいったのかな?」と練習試合(バックテスト)をしてみましょう。そして、自分に合った作戦か確かめることが大切です。

検証の透明性と信頼性

  • データの出所: この作戦の成績は、過去のビットコインの1時間ごとの値段のデータ(いつ始まって、一番高くていくらで、一番安くていくらで、いくらで終わったか)を使って調べました。
  • 検証のやり方: 過去の値段のデータを使って、「もしこの作戦で取引していたら、どうなっていただろう?」というシミュレーション(バックテスト)をしました。その結果、何回取引して、何回勝って、どれくらいお金が増えたり減ったりしたか、という成績が計算されました。
  • コード: この作戦をコンピューターで計算するためのプログラム(設計図のようなもの)は、みんなが見られるように公開されています。
  • 注意事項: 注意してほしいのは、この作戦や過去の成績が、未来でも同じようにうまくいくとは限らない、ということです。投資は、最後は自分で考えて決めるものです。過去にうまくいったからといって、将来も必ずもうかるとは言えないことを忘れないでください。

よくある質問

Q.「フラクタル」って何?

A.グラフのギザギザのことだよ。周りの棒グラフより、1本だけぴょこんと高くなっているところが「山」、逆にぐっと低くなっているところが「谷」。この「山」や「谷」のことをフラクタルって呼ぶんだ。

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

A.「プロフィットファクター」という成績のことだよ。1がちょうどトントン(利益と損が同じ)。1より大きいと利益が出てるってこと。0.97は、残念ながら全部の取引を合わせると、ほんの少しだけ損が多かったって意味なんだ。

Q.「最大DD:23.51%」って大丈夫?

A.「最大ドローダウン」のことだね。これは、一番調子が悪かったときに、一時的にお金が最大で約24%減っちゃった、ってこと。この作戦は、大きな勝ちをねらうために、途中で少しお金が減る時期があっても我慢するスタイルなんだ。

Q.勝つ確率が低いけど、本当にうまくいくの?

A.いい質問だね。勝つ回数は少なくても、1回勝ったときの利益が、何回か負けたときの損よりずっと大きければ、トータルではプラスになることもあるんだ。この作戦は「小さく何度も負けても、一回のホームランで逆転勝ちする」みたいなイメージだよ。

Q.この作戦、どんなときに使うのが良い?

A.ビットコインみたいに、値段が激しく動くもので、しかも「今は上がり調子だ!」とか「下がり調子だ!」みたいに、はっきりした流れがあるときに使うと、うまくいく可能性が高いかもしれないね。

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

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

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

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

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

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

Q.HODLとの比較結果は?

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

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

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

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

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

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

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

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

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

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

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

Q.改良の方向性は?

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

著者情報