シェア:

ふしぎな線「ボリンジャーバンド」で挑戦!いつ買うか、いつ売るかを見つける方法

この作戦は、「MATIC/USDT」という暗号資産(仮想通貨)の値段の動きを見て、いつ買うか、いつ売るかを見つける方法です。ボリンジャーバンドという特別な線を使って、値段が上がりすぎたり、下がりすぎたりしたときに、あえて反対の行動をすることで、利益をねらいます。

取引数
255
勝率
42.35%
最終リターン
-79.41%
最大DD
79.58%

導入と前提条件

この作戦は、「MATIC/USDT」という暗号資産(仮想通貨)の値段の動きを見て、いつ買うか、いつ売るかを見つける方法です。ボリンジャーバンドという特別な線を使って、値段が上がりすぎたり、下がりすぎたりしたときに、あえて反対の行動をすることで、利益をねらいます。

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

  • 戦略名: Bollinger Bands を使用したトレンド追従戦略
  • 対象銘柄: MATIC/USDT
  • 時間足: 5m
  • 期間: 2024-06-13〜2024-09-10(88日間)
  • 初期資金: $10,000
  • 手数料・スリッページ: 0.1% / 0.1%
  • 取引所: binance

Bollinger Bands の理論的背景

この作戦の元になっているのは、「いつかは平均に戻る」という考え方です。たとえば、テストの点数がすごく良かったり、すごく悪かったりしても、何回も受けているとだんだん平均点に近づいていきますよね。値段も同じで、すごく上がったり下がったりしても、いつかは真ん中の「平均的な値段」に戻ってくることが多い、という考え方です。ボリンジャーバンドは、値段が平均からどれくらい離れているかを教えてくれる道具なんです。値段がバンドの外側まで行くと、「ちょっと行きすぎだよ!」という合図になるので、平均に戻る動きをねらって反対の行動をするんです。

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

エントリー条件

  • 値段の線が、下のバンドを下から上に突き抜けたときが「買う」タイミングです。
  • (もっとくわしいルールだと、バンドの幅が広がっていて、値段の動きがおとなしくなったとき、という条件もあります)

エグジット条件

  • 値段の線が、上のバンドを上から下に突き抜けたときが「売る(手じまいする)」タイミングです。
  • (買うときと同じように、バンドの幅が広がっていて、値段の動きがおとなしくなったとき、という条件がつくこともあります)

リスク管理

もし予想と反対に値段が動いてしまったとき、大きな損をしないためのルールも大切です。あらかじめ「ここまで下がったら、あきらめて売ろう」というラインを決めておきます。これを「損切り」といいます。また、一度にたくさんのお金を使わずに、少しずつ取引することも、大きな失敗を防ぐために大事なことです。

再現手順(HowTo)

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

【結果】パフォーマンス

価格の推移

価格推移

資産の推移

資産推移

パフォーマンス指標

指標
総トレード数255回
勝率42.35%
平均利益0.59%
平均損失-1.48%
期待値-0.6%
プロフィットファクター0.27
最大ドローダウン79.58%
最終リターン-79.41%
シャープレシオ-0.48
HODL(Buy&Hold)-39.97%

HODL戦略との比較

HODL戦略との比較

実装コード(Python)

strategy.py
"""
Bollinger Bands Trading Signal Generator
ボリンジャーバンドを使用した逆張り戦略
"""
import pandas as pd
import numpy as np


def calculate_bollinger_signals(df: pd.DataFrame,
                               period: int = 20,
                               num_std: float = 2.0) -> pd.DataFrame:
    """
    ボリンジャーバンド戦略のシグナル生成
    
    Parameters:
    -----------
    df : pd.DataFrame
        OHLCVデータ(最低限 'close' カラムが必要)
    period : int
        移動平均期間(デフォルト: 20)
    num_std : float
        標準偏差の倍数(デフォルト: 2.0)
    
    Returns:
    --------
    pd.DataFrame
        以下のカラムが追加されたDataFrame:
        - bb_middle: 中央バンド(SMA)
        - bb_upper: 上部バンド
        - bb_lower: 下部バンド
        - bb_width: バンド幅
        - bb_percent: BBパーセント(現在価格の位置)
        - is_buy: 買いシグナル (bool)
        - is_sell: 売りシグナル (bool)
    """
    df = df.copy()
    
    # 中央バンド(単純移動平均)
    df['bb_middle'] = df['close'].rolling(window=period, min_periods=period).mean()
    
    # 標準偏差
    rolling_std = df['close'].rolling(window=period, min_periods=period).std()
    
    # 上部・下部バンド
    df['bb_upper'] = df['bb_middle'] + (rolling_std * num_std)
    df['bb_lower'] = df['bb_middle'] - (rolling_std * num_std)
    
    # バンド幅(ボラティリティ指標)
    df['bb_width'] = df['bb_upper'] - df['bb_lower']
    
    # BBパーセント(現在価格の相対位置)
    df['bb_percent'] = (df['close'] - df['bb_lower']) / (df['bb_upper'] - df['bb_lower'])
    
    # 前日の価格とバンドの関係
    df['close_prev'] = df['close'].shift(1)
    df['bb_lower_prev'] = df['bb_lower'].shift(1)
    df['bb_upper_prev'] = df['bb_upper'].shift(1)
    
    # 買いシグナル: 価格が下部バンドを下から上にクロス(反発)
    df['is_buy'] = (
        (df['close'] > df['bb_lower']) & 
        (df['close_prev'] <= df['bb_lower_prev']) &
        df['bb_lower'].notna() &
        (df['bb_width'] > 0)  # バンドが有効な幅を持っている
    )
    
    # 売りシグナル: 価格が上部バンドを上から下にクロス(反落)
    df['is_sell'] = (
        (df['close'] < df['bb_upper']) & 
        (df['close_prev'] >= df['bb_upper_prev']) &
        df['bb_upper'].notna() &
        (df['bb_width'] > 0)  # バンドが有効な幅を持っている
    )
    
    # 不要な中間カラムを削除
    df.drop(['close_prev', 'bb_lower_prev', 'bb_upper_prev'], axis=1, inplace=True)
    
    return df

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

  1. 1この作戦を255回試したところ、うまくいったのは100回のうち42回くらいで、半分もありませんでした。つまり、予想が外れることのほうが多かった、ということです。
  2. 21回取引するごとに、平均して少しずつお金が減ってしまう計算でした。それに、もうかった金額と損した金額を比べると、損した金額のほうがずっと大きかったんです。これは、取引を続ければ続けるほど、全体として損が増えていく可能性が高いことを意味しています。
  3. 3最終的に、もとのお金が80%近くも減ってしまいました。この作戦が、そのときの値段の大きな動きに合っておらず、小さな損が積み重なって大きな損になってしまったからです。

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

  1. 1ボリンジャーバンドで反対の動きをねらう作戦は、値段があまり大きく動かず、一定の範囲を行ったり来たりしているとき(これをレンジ相場といいます)にはうまくいくことがあります。でも、今回は値段がどんどん上がり続けたり、下がり続けたりする動き(これをトレンド相場といいます)だったので、大きな損につながってしまったようです。
  2. 2勝つ回数が少なくても、1回勝ったときの利益が、1回負けたときの損よりもすごく大きければ、全体ではプラスになります。でも、今回の作戦では、勝ったときの利益が小さく、負けたときの損が大きかったので、うまくいきませんでした。
  3. 3取引の回数を増やせば増やすほど、結果はだんだん「平均」に近づいていきます。でも、この作戦はもともと「平均すると損をする」計算だったので、回数を重ねるごとに、その計算通りに損がどんどん大きくなってしまったんです。

リスク管理の具体的手法

取引量の決め方

持っているお金を一度に全部使わないことが大切です。もしものときのために、余裕を残しておきましょう。たとえば、1回の取引で使うお金は、持っているお金全体の100分の1か100分の2くらいにすると、安心です。

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

もし損がどんどんふくらんで、決めておいた金額を超えてしまったら、いったん取引をお休みにすることも大事です。今回のように、お金がすごく大きく減ってしまうのはとても危険なので、そうなる前に損を確定させる「損切り」のルールをしっかり守りましょう。

資金管理の方法

まず、自分が投資に使えるお金が全部でいくらあるかを知ることがスタートです。そのうち、どれくらいまでなら損しても大丈夫かを決めておきましょう。そして、もし利益が出たら、そのお金をどうするか(次の取引に使うか、貯金するかなど)も考えて、長い目で見てお金を管理していくことが大切です。

改良案の具体的提案

  • 値段が上がり続けているのか、下がり続けているのか(トレンド)を見分けるための、別の道具を組み合わせる方法があります。たとえば、値段が上がっているときは「買い」だけをねらう、というように、流れに乗る作戦に変えるんです。
  • ボリンジャーバンドの線の幅がせまいとき(値段の動きがおだやかなとき)だけ取引する、とか、逆に幅が広いとき(値段の動きがはげしいとき)だけ取引する、というようにルールを追加します。そうすることで、もっと勝てそうなチャンスだけをねらうことができます。
  • この作戦では、一時的にとても大きくお金が減ってしまいました(最大で80%近くも!)。これを防ぐために、1回の取引で「ここまでなら損してもいい」と決める金額をもっと小さくしたり、一度に買う量を減らしたりする工夫が必要です。

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

  • この作戦は、値段があまり大きく動かず、一定の範囲を行ったり来たりしているときに試すのがおすすめです。値段がどんどん上がり続けたり下がり続けたりしているときは、今回のように損しやすくなるので気をつけましょう。
  • ボリンジャーバンドには、線の計算方法をちょっと変える「設定」があります。この設定を変えると、作戦の結果も変わってきます。自分に合った設定を見つけるために、色々なパターンを試してみるのが良いですよ。
  • 取引をしたら、ノートなどに記録をつけておくのがおすすめです。「どうして勝てたのかな?」「なんで負けちゃったんだろう?」とふりかえることで、次に活かすことができます。今回の結果は良くありませんでしたが、この失敗から学ぶことが一番大切です。

検証の透明性と信頼性

  • データの出所: この説明は、過去のある期間の「MATIC/USDT」という暗号資産の5分ごとの値段のデータを使って、作戦を試した結果にもとづいています。
  • 検証のやり方: 「何回取引したか」や「勝った確率」などの成績は、すべて過去のデータを使ってコンピューターでシミュレーション(お試し計算)したものです。
  • コード: この作戦をコンピューターで動かすためのプログラム(設計図のようなもの)も用意されています。これを使えば、自分で試したり、もっと良い作戦に作り変えたりすることもできますよ。
  • 注意事項: 注意してほしいのは、この作戦や過去の成績が、未来でも同じようにうまくいくとは限らない、ということです。暗号資産(仮想通貨)の取引は、値段の動きがとても大きく、お金が減ってしまう危険もあります。取引をするときは、必ず自分でよく考えて、自分の責任で行ってくださいね。

よくある質問

Q.ボリンジャーバンドって何?

A.値段の動きの真ん中に引かれた線と、その上下にある2本の線のことです。3本の線が川のようになっていて、値段が今、勢いがあるのか、おだやかなのか、平均からどれくらい離れているのかを、目で見てわかりやすくしてくれます。

Q.なんで「逆張り」するの?

A.値段がすごく上がったり下がったりすると、いつかは真ん中の平均的な値段に戻ってくることが多い、という考え方があるからです。その「元に戻ろうとする力」をねらって、あえてみんなと反対の行動をするのが「逆張り」です。

Q.勝率が低くても大丈夫なの?

A.勝つ回数が少なくても、大丈夫なときはあります。たとえば、10回中3回しか勝てなくても、勝ったときの利益がすごく大きくて、負けたときの損が小さければ、全部合わせるとプラスになります。でも、今回の作戦では、残念ながらそうなりませんでした。

Q.期待値がマイナスってどういうこと?

A.1回の取引では勝つか負けるかわかりません。でも、何回も何回も取引を繰り返していくと、平均して少しずつ損をしてしまう、というのが「期待値がマイナス」ということです。この作戦は、続ければ続けるほど不利になってしまう計算だ、ということです。

Q.最大DDって何?一番ひどいときの損失のこと?

A.その通りです!おこづかいが一番多かったときから、一番少なくなってしまったときまでに、どれくらい減ったか、という割合のことです。この作戦では、一時的にお金が80%近くも減ってしまうことがありました。これは、とても危険な状態だと言えます。

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

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

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

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

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

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

Q.HODLとの比較結果は?

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

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

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

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

A.期間中はレンジ・下落優勢と推測されます。

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

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

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

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

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

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

Q.改良の方向性は?

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

著者情報