ふしぎな線「ボリンジャーバンド」で挑戦!いつ買うか、いつ売るかを見つける方法
この作戦は、「MATIC/USDT」という暗号資産(仮想通貨)の値段の動きを見て、いつ買うか、いつ売るかを見つける方法です。ボリンジャーバンドという特別な線を使って、値段が上がりすぎたり、下がりすぎたりしたときに、あえて反対の行動をすることで、利益をねらいます。
導入と前提条件
この作戦は、「MATIC/USDT」という暗号資産(仮想通貨)の値段の動きを見て、いつ買うか、いつ売るかを見つける方法です。ボリンジャーバンドという特別な線を使って、値段が上がりすぎたり、下がりすぎたりしたときに、あえて反対の行動をすることで、利益をねらいます。
【検証】戦略のバックテスト概要
- 戦略名: Bollinger Bands を使用したトレンド追従戦略
- 対象銘柄: MATIC/USDT
- 時間足: 5m
- 期間: 2024-06-13〜2024-09-10(88日間)
- 初期資金: $10,000
- 手数料・スリッページ: 0.1% / 0.1%
- 取引所: binance
Bollinger Bands の理論的背景
この作戦の元になっているのは、「いつかは平均に戻る」という考え方です。たとえば、テストの点数がすごく良かったり、すごく悪かったりしても、何回も受けているとだんだん平均点に近づいていきますよね。値段も同じで、すごく上がったり下がったりしても、いつかは真ん中の「平均的な値段」に戻ってくることが多い、という考え方です。ボリンジャーバンドは、値段が平均からどれくらい離れているかを教えてくれる道具なんです。値段がバンドの外側まで行くと、「ちょっと行きすぎだよ!」という合図になるので、平均に戻る動きをねらって反対の行動をするんです。
具体的な売買ルール(今回の検証)
エントリー条件
- 値段の線が、下のバンドを下から上に突き抜けたときが「買う」タイミングです。
- (もっとくわしいルールだと、バンドの幅が広がっていて、値段の動きがおとなしくなったとき、という条件もあります)
エグジット条件
- 値段の線が、上のバンドを上から下に突き抜けたときが「売る(手じまいする)」タイミングです。
- (買うときと同じように、バンドの幅が広がっていて、値段の動きがおとなしくなったとき、という条件がつくこともあります)
リスク管理
もし予想と反対に値段が動いてしまったとき、大きな損をしないためのルールも大切です。あらかじめ「ここまで下がったら、あきらめて売ろう」というラインを決めておきます。これを「損切り」といいます。また、一度にたくさんのお金を使わずに、少しずつ取引することも、大きな失敗を防ぐために大事なことです。
再現手順(HowTo)
- Python/依存(ccxt, pandas, ta)をインストール
- ccxtでMATIC/USDTのOHLCVを取得して前処理
- 『Bollinger Bands』に必要な指標を算出(ta 等)
- 閾値・クロス条件から売買シグナルを生成
- 手数料・スリッページを加味して検証・評価
【結果】パフォーマンス
価格の推移
資産の推移
パフォーマンス指標
指標 | 値 |
---|---|
総トレード数 | 255回 |
勝率 | 42.35% |
平均利益 | 0.59% |
平均損失 | -1.48% |
期待値 | -0.6% |
プロフィットファクター | 0.27 |
最大ドローダウン | 79.58% |
最終リターン | -79.41% |
シャープレシオ | -0.48 |
HODL(Buy&Hold) | -39.97% |
HODL戦略との比較
実装コード(Python)
"""
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この作戦を255回試したところ、うまくいったのは100回のうち42回くらいで、半分もありませんでした。つまり、予想が外れることのほうが多かった、ということです。
- 21回取引するごとに、平均して少しずつお金が減ってしまう計算でした。それに、もうかった金額と損した金額を比べると、損した金額のほうがずっと大きかったんです。これは、取引を続ければ続けるほど、全体として損が増えていく可能性が高いことを意味しています。
- 3最終的に、もとのお金が80%近くも減ってしまいました。この作戦が、そのときの値段の大きな動きに合っておらず、小さな損が積み重なって大きな損になってしまったからです。
この結果から学べる3つの教訓
- 1ボリンジャーバンドで反対の動きをねらう作戦は、値段があまり大きく動かず、一定の範囲を行ったり来たりしているとき(これをレンジ相場といいます)にはうまくいくことがあります。でも、今回は値段がどんどん上がり続けたり、下がり続けたりする動き(これをトレンド相場といいます)だったので、大きな損につながってしまったようです。
- 2勝つ回数が少なくても、1回勝ったときの利益が、1回負けたときの損よりもすごく大きければ、全体ではプラスになります。でも、今回の作戦では、勝ったときの利益が小さく、負けたときの損が大きかったので、うまくいきませんでした。
- 3取引の回数を増やせば増やすほど、結果はだんだん「平均」に近づいていきます。でも、この作戦はもともと「平均すると損をする」計算だったので、回数を重ねるごとに、その計算通りに損がどんどん大きくなってしまったんです。
リスク管理の具体的手法
取引量の決め方
持っているお金を一度に全部使わないことが大切です。もしものときのために、余裕を残しておきましょう。たとえば、1回の取引で使うお金は、持っているお金全体の100分の1か100分の2くらいにすると、安心です。
損失が大きくなったときの対処法
もし損がどんどんふくらんで、決めておいた金額を超えてしまったら、いったん取引をお休みにすることも大事です。今回のように、お金がすごく大きく減ってしまうのはとても危険なので、そうなる前に損を確定させる「損切り」のルールをしっかり守りましょう。
資金管理の方法
まず、自分が投資に使えるお金が全部でいくらあるかを知ることがスタートです。そのうち、どれくらいまでなら損しても大丈夫かを決めておきましょう。そして、もし利益が出たら、そのお金をどうするか(次の取引に使うか、貯金するかなど)も考えて、長い目で見てお金を管理していくことが大切です。
改良案の具体的提案
- 値段が上がり続けているのか、下がり続けているのか(トレンド)を見分けるための、別の道具を組み合わせる方法があります。たとえば、値段が上がっているときは「買い」だけをねらう、というように、流れに乗る作戦に変えるんです。
- ボリンジャーバンドの線の幅がせまいとき(値段の動きがおだやかなとき)だけ取引する、とか、逆に幅が広いとき(値段の動きがはげしいとき)だけ取引する、というようにルールを追加します。そうすることで、もっと勝てそうなチャンスだけをねらうことができます。
- この作戦では、一時的にとても大きくお金が減ってしまいました(最大で80%近くも!)。これを防ぐために、1回の取引で「ここまでなら損してもいい」と決める金額をもっと小さくしたり、一度に買う量を減らしたりする工夫が必要です。
実用性の向上(運用上の注意)
- この作戦は、値段があまり大きく動かず、一定の範囲を行ったり来たりしているときに試すのがおすすめです。値段がどんどん上がり続けたり下がり続けたりしているときは、今回のように損しやすくなるので気をつけましょう。
- ボリンジャーバンドには、線の計算方法をちょっと変える「設定」があります。この設定を変えると、作戦の結果も変わってきます。自分に合った設定を見つけるために、色々なパターンを試してみるのが良いですよ。
- 取引をしたら、ノートなどに記録をつけておくのがおすすめです。「どうして勝てたのかな?」「なんで負けちゃったんだろう?」とふりかえることで、次に活かすことができます。今回の結果は良くありませんでしたが、この失敗から学ぶことが一番大切です。
検証の透明性と信頼性
- データの出所: この説明は、過去のある期間の「MATIC/USDT」という暗号資産の5分ごとの値段のデータを使って、作戦を試した結果にもとづいています。
- 検証のやり方: 「何回取引したか」や「勝った確率」などの成績は、すべて過去のデータを使ってコンピューターでシミュレーション(お試し計算)したものです。
- コード: この作戦をコンピューターで動かすためのプログラム(設計図のようなもの)も用意されています。これを使えば、自分で試したり、もっと良い作戦に作り変えたりすることもできますよ。
- 注意事項: 注意してほしいのは、この作戦や過去の成績が、未来でも同じようにうまくいくとは限らない、ということです。暗号資産(仮想通貨)の取引は、値段の動きがとても大きく、お金が減ってしまう危険もあります。取引をするときは、必ず自分でよく考えて、自分の責任で行ってくださいね。