ビットコインで「値段の波」に乗ろう!『ギザギザ突破』作戦!
これは、ビットコインの値段のグラフを使って、「今がチャンス!」というタイミングを見つける作戦のことです。1時間ごとの値段の動きを見て、値段がぐんと上がりそう、または下がりそうな勢いを見つけます。過去のデータで試してみたら、勝つ確率は10回中4回弱くらいでした。でも、うまくいくと大きな利益が狙える、そんな作戦なんです。
導入と前提条件
これは、ビットコインの値段のグラフを使って、「今がチャンス!」というタイミングを見つける作戦のことです。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)
- Python/依存(ccxt, pandas, ta)をインストール
- ccxtでBTC/USDTのOHLCVを取得して前処理
- 『Fractal Breakout』に必要な指標を算出(ta 等)
- 閾値・クロス条件から売買シグナルを生成
- 手数料・スリッページを加味して検証・評価
【結果】パフォーマンス
価格の推移
資産の推移
パフォーマンス指標
指標 | 値 |
---|---|
総トレード数 | 64回 |
勝率 | 35.94% |
平均利益 | 3.88% |
平均損失 | -2.13% |
期待値 | 0.03% |
プロフィットファクター | 0.97 |
最大ドローダウン | 23.51% |
最終リターン | -2.1% |
シャープレシオ | 0.02 |
HODL(Buy&Hold) | 43.16% |
HODL戦略との比較
実装コード(Python)
#!/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勝つ確率は10回に4回弱と少し低めです。でもそれは、小さな勝ちをコツコツねらうより、「一回で大きく勝つ!」ことを目指す作戦だからなんです。負けることもありますが、一回の勝ちでそれまでの負けを取りもどせるくらいの大きな利益をねらいます。
- 2PF(プロフィットファクター)という成績表みたいな数字が、1より少し小さい「0.97」でした。これは、今までの全部の取引を合わせると、もうかったお金より損したお金の方がほんの少しだけ多かった、という意味です。でも、これはあくまで過去のデータでのお話です。
- 3最大ドローダウンというのは、「一番調子が悪かったとき、一時的にどれくらいお金が減っちゃったか」を示す数字です。それが約24%と少し大きめでした。これは、大きな利益をねらうためには、途中でちょっとお金が減る時期があっても我慢する、という考え方の作戦だからなんです。
この結果から学べる3つの教訓
- 1グラフにできる「山」や「谷」(フラクタル)に注目すると、売り買いのタイミングを見つけるヒントになる、ということが学べます。
- 2勝つ確率が低くても、それだけで「ダメな作戦」と決めつけられないことがわかります。1回あたりの利益の大きさも考え合わせることで、作戦の本当の実力が見えてきます。
- 3過去のデータで「この作戦はうまくいったかな?」としっかり調べることの大切さが学べます。そうすることで、この作戦の得意な場面や苦手な場面がわかってきます。
リスク管理の具体的手法
取引量の決め方
まず、「今回の取引で、もし負けても失っていいお金はいくらまで」と決めます。たとえば、持っているお金の100分の1とか。そして、「ここまで値段が動いたら損切りする」という場所までの距離を考えて、どれくらいの量を売り買いするかを計算します。
損失が大きくなったときの対処法
もし、思ったよりもお金がどんどん減ってしまったら、一度お休みしましょう。そして、「どうしてうまくいかなかったんだろう?」と冷静に理由を考えて、作戦のルールを見直すことが大切です。
資金管理の方法
自分が持っているお金を、全部使ってしまうのはとても危険です。どれくらいまでなら勝負に使っていいか、ちゃんと決めておきましょう。焦ったり興奮したりせず、決めたルールをしっかり守ることが一番大事です。
改良案の具体的提案
- 「どこでやめるか(損切り)」や「どこで利益を確定するか」のルールをもう少し工夫すれば、一時的に大きくお金が減ってしまうことを防げるかもしれません。
- 「山」や「谷」を越える「今だ!」という合図が出たときに、他の道具(たとえば移動平均線という別の線)も一緒に見てみましょう。そうすると、もっと確かなタイミングで売り買いができるようになるかもしれません。
- 「山」や「谷」を見つけるときに「最近の5本の棒グラフ」を見ていましたが、これを7本や9本に変えて試してみるのも良い方法です。一番成績が良くなる本数を見つけられるかもしれません。
実用性の向上(運用上の注意)
- この作戦は、ビットコインみたいに値段の上がり下がりが激しいもので使うと、効果が出やすいかもしれません。
- グラフを見るとき、「最近5本」で「山」や「谷」を探しましたが、これを7本や9本に変えて試してみるのも面白いですよ。
- 本番でお金を使う前に、必ず過去のデータで「この作戦、本当にうまくいったのかな?」と練習試合(バックテスト)をしてみましょう。そして、自分に合った作戦か確かめることが大切です。
検証の透明性と信頼性
- データの出所: この作戦の成績は、過去のビットコインの1時間ごとの値段のデータ(いつ始まって、一番高くていくらで、一番安くていくらで、いくらで終わったか)を使って調べました。
- 検証のやり方: 過去の値段のデータを使って、「もしこの作戦で取引していたら、どうなっていただろう?」というシミュレーション(バックテスト)をしました。その結果、何回取引して、何回勝って、どれくらいお金が増えたり減ったりしたか、という成績が計算されました。
- コード: この作戦をコンピューターで計算するためのプログラム(設計図のようなもの)は、みんなが見られるように公開されています。
- 注意事項: 注意してほしいのは、この作戦や過去の成績が、未来でも同じようにうまくいくとは限らない、ということです。投資は、最後は自分で考えて決めるものです。過去にうまくいったからといって、将来も必ずもうかるとは言えないことを忘れないでください。