ビットコインの値段が大きく動いた時、反対の動きで利益をねらう作戦
この作戦は、ビットコインの値段が「売られすぎ」や「買われすぎ」という特別な状態になった時に、あえて反対の行動(買う・売る)をして、利益を出そうとする考え方です。1時間ごとの値段の動きをチェックして、チャンスを探します。
導入と前提条件
この作戦は、ビットコインの値段が「売られすぎ」や「買われすぎ」という特別な状態になった時に、あえて反対の行動(買う・売る)をして、利益を出そうとする考え方です。1時間ごとの値段の動きをチェックして、チャンスを探します。
【検証】戦略のバックテスト概要
- 戦略名: CCI Reversal を使用したトレンド追従戦略
- 対象銘柄: BTC/USDT
- 時間足: 1h
- 期間: 2024-02-08〜2025-08-25(563日間)
- 初期資金: $10,000
- 手数料・スリッページ: 0.1% / 0.1%
- 取引所: binance
CCI Reversal の理論的背景
ビットコインのようなデジタルなお金は、急に値段が上がったり下がったりすることがよくあります。でも、ずっと上がり続けたり、下がり続けたりすることはあまりありません。値段が大きく動くと、今度は反対の方向に動く力が働きやすくなることがあります。この作戦は、その「もどる力」をねらう考え方です。「CCI」というものさしは、今の値段が「普通」の状態からどれくらいずれているかを示してくれます。このずれがすごく大きくなった時が、「そろそろもどるかも?」と考えるチャンスになります。
具体的な売買ルール(今回の検証)
エントリー条件
- ビットコインが「売られすぎだよ」というサインが出たら、「今が買うチャンスだ!」と考えます。
- ビットコインが「買われすぎだよ」というサインが出たら、「今が売るチャンスだ!」と考えます。
エグジット条件
- 買ったビットコインをいつ売るかというと、値段の動きがある程度の大きさになった時です。
- もう一つは、目標にしていた利益が出た時です(これを「利益確定」といいます)。
- 反対に、もし損が出てしまったら、その損が大きくなりすぎないうちに取引をやめます(これを「損切り」といいます)。
リスク管理
もし取引で損をしてしまっても、その金額が大きくなりすぎないように、あらかじめ「ここまでなら損しても大丈夫」という金額を決めておきます。そして、その金額を超えないように、一回に取引する量を調整します。損がふくらみそうになったら、早めにやめてしまうことも大切です。
再現手順(HowTo)
- Python/依存(ccxt, pandas, ta)をインストール
- ccxtでBTC/USDTのOHLCVを取得して前処理
- 『CCI Reversal』に必要な指標を算出(ta 等)
- 閾値・クロス条件から売買シグナルを生成
- 手数料・スリッページを加味して検証・評価
【結果】パフォーマンス
価格の推移
資産の推移
パフォーマンス指標
指標 | 値 |
---|---|
総トレード数 | 275回 |
勝率 | 57.09% |
平均利益 | 0.97% |
平均損失 | -1.78% |
期待値 | -0.21% |
プロフィットファクター | 0.72 |
最大ドローダウン | 54.68% |
最終リターン | -46.45% |
シャープレシオ | -0.16 |
HODL(Buy&Hold) | 148.63% |
HODL戦略との比較
実装コード(Python)
#!/usr/bin/env python3
"""
CCI(Commodity Channel Index)逆張り戦略
CCIの極値で逆張りエントリー
"""
import pandas as pd
import numpy as np
def calculate_cci_signals(df: pd.DataFrame, cci_period: int = 20,
oversold: float = -100, overbought: float = 100) -> pd.DataFrame:
"""
CCIシグナルを生成
Parameters:
-----------
df : pd.DataFrame
OHLCVデータ
cci_period : int
CCI計算期間(デフォルト: 20)
oversold : float
売られすぎ水準(デフォルト: -100)
overbought : float
買われすぎ水準(デフォルト: 100)
Returns:
--------
pd.DataFrame
シグナル列が追加されたDataFrame
"""
df = df.copy()
# Typical Price
df['tp'] = (df['high'] + df['low'] + df['close']) / 3
# Simple Moving Average of TP
df['tp_sma'] = df['tp'].rolling(window=cci_period).mean()
# Mean Deviation
df['md'] = df['tp'].rolling(window=cci_period).apply(
lambda x: np.abs(x - x.mean()).mean()
)
# CCI計算
df['cci'] = (df['tp'] - df['tp_sma']) / (0.015 * df['md'])
# シグナル生成
df['is_buy'] = (
(df['cci'] < oversold) &
(df['cci'].shift(1) >= oversold)
)
df['is_sell'] = (
(df['cci'] > overbought) &
(df['cci'].shift(1) <= overbought)
)
# NaN値をFalseに置換
df['is_buy'] = df['is_buy'].fillna(False)
df['is_sell'] = df['is_sell'].fillna(False)
print(f"CCI逆張り: 期間={cci_period}, 売られすぎ={oversold}, 買われすぎ={overbought}")
print(f"買いシグナル数: {df['is_buy'].sum()}")
print(f"売りシグナル数: {df['is_sell'].sum()}")
return df
なぜこの結果になったのか(3つの理由)
- 1この作戦の成績があまり良くなかったのは、ビットコインの値段が長い間ずっと下がり続けてしまったからです。こういう時には、みんなと反対の動きをする「逆張り」という作戦はうまくいきにくいみたいです。
- 2取引に勝つ回数(勝率)は半分以上ありましたが、一回の勝ちで得られるお金よりも、一回の負けで失うお金のほうが大きかったんです。だから、全体としては損をしてしまいました。
- 3一番大きく損をした時(最大DD)には、持っていたお金の半分以上が減ってしまいました。これは、値段が予想よりも大きく動いてしまった時に、損を小さくするルールがうまく働かなかったからかもしれません。
この結果から学べる3つの教訓
- 1「売られすぎ」「買われすぎ」のサインが出ても、必ずしも予想通りに値段が反対に動くわけではない、ということを学びました。
- 2世の中全体が「どんどん上がるぞ!」や「どんどん下がるぞ!」という一つの方向に強く動いている時は、反対の動きをねらう作戦はむずかしいことがわかりました。
- 3たとえ作戦がうまくいかなくても、「損はここまで」というルール(損切り)をしっかり守ることが、自分のお金を守るためにすごく大事だとわかりました。
リスク管理の具体的手法
取引量の決め方
1回の取引で使っていいお金の上限を決めておくことです。例えば、「持っているお金の1%までしか損しない」と決めたら、その金額になるように取引する量を計算します。こうすれば、もし負けても大きなダメージを受けずにすみます。
損失が大きくなったときの対処法
もしも損が続いてしまって、持っているお金が大きく減ってしまったら、一度すべての取引をお休みします。そして、冷静になって「どうしてうまくいかなかったんだろう?」と原因を考えて、作戦を立て直します。
資金管理の方法
取引に使うお金は、なくなっても生活に困らない余裕のあるお金だけにすることが大切です。そして、一度に全部のお金を使わずに、いくつかに分けて管理すると、リスクを小さくできます。
改良案の具体的提案
- 「売られすぎ」「買われすぎ」のサインを見つけるためのルールを、もっとピッタリなものに調整して、より良いタイミングをねらえるようにすることです。
- 値段が上がっている流れに乗って買ったり、下がっている流れに乗って売ったりする「トレンドフォロー」という作戦と組み合わせてみるのも良いかもしれません。
- その時々の世の中の動きに合わせて、利益の目標や、損切りするルールを柔軟に変えられるようにすることです。
実用性の向上(運用上の注意)
- この作戦は、ビットコインのように値段がよく動くもので試すのが向いています。
- 実際に自分のお金で取引を始める前に、昔のデータを使って、この作戦が本当にうまくいったかを試してみる(バックテスト)ことがとても大切です。
- 世の中のニュースや、他の人の意見も参考にしつつ、最後はどうするかを自分自身でしっかり考えて決めることが大事です。
検証の透明性と信頼性
- データの出所: この作戦の成績は、過去のビットコインの1時間ごとの値段のデータを使って計算しました。
- 検証のやり方: Pythonというプログラミングの言葉を使って、昔のデータでこの作戦を試したらどうなったかを計算しました。このようなテストを「バックテスト」と言います。
- コード: この成績を計算するために使ったプログラムは、誰でも見られるように公開されています。
- 注意事項: この記事は、投資をすすめるものではありません。投資には、お金が増える可能性もあれば、減ってしまう可能性もあります。どうするかは、ご自身の責任でよく考えて決めてくださいね。