ビットコインの動きを予測!「いつもの範囲」で考える投資の作戦
この作戦は、ビットコインの1時間ごとの値動きグラフを使って、「標準偏差チャネル」という道具を使います。これは、値段が「いつもの範囲」からどれくらいはみ出しているかを見るためのものです。約4ヶ月間、この作戦を試してみたらどうなるかを調べてみました。結果は、残念ながら少し損をしてしまいましたが、この失敗から学べることはたくさんあります。
導入と前提条件
この作戦は、ビットコインの1時間ごとの値動きグラフを使って、「標準偏差チャネル」という道具を使います。これは、値段が「いつもの範囲」からどれくらいはみ出しているかを見るためのものです。約4ヶ月間、この作戦を試してみたらどうなるかを調べてみました。結果は、残念ながら少し損をしてしまいましたが、この失敗から学べることはたくさんあります。
【検証】戦略のバックテスト概要
- 戦略名: Standard Deviation Channel を使用したトレンド追従戦略
- 対象銘柄: BTC/USDT
- 時間足: 1h
- 期間: 2025-05-08〜2025-09-05(119日間)
- 初期資金: $10,000
- 手数料・スリッページ: 0.1% / 0.1%
- 取引所: binance
Standard Deviation Channel の理論的背景
この作戦の根っこにある考え方は、「平均的なものから大きく外れたものは、また平均に戻りやすい」という性質です。ビットコインの値段も、急に上がったり下がったりしても、いつかは落ち着いた値段に戻ろうとすることがよくあります。この作戦では、過去20時間分の値段の動きを見て、だいたい真ん中の値段(平均)を計算します。そして、その真ん中から値段がどれくらいバラついているかも計算します。その「バラつき具合」を2倍した幅を、真ん中の線の上下に引くと、トンネルのような帯(チャネル)ができます。これが「いつもの値動きの範囲」の目安になります。値段がこの帯の外にはみ出したら、「お、ちょっと動きすぎかな?そろそろ中に戻ってくるかも」と考えて、反対に動くタイミングを狙うのです。
具体的な売買ルール(今回の検証)
エントリー条件
- 値段のグラフが、さっきまで「いつもの範囲」の下の線より下にあったのに、今、その線を越えて中に戻ってきたときです。これが『買い』のサインになります。
- そして、まだビットコインを持っていないときに、このサインが出たら買ってみます。
エグジット条件
- 値段のグラフが、さっきまで「いつもの範囲」の上の線より上にあったのに、今、その線を越えて中に戻ってきたときです。これが『売り』のサインになります。
- そして、すでにビットコインを持っているときに、このサインが出たら売ってみます。
リスク管理
もし失敗しても大きな損をしないように、一度にたくさんのお金を使わないようにします。もし予想が外れて損が出ても、「持っているお金の何パーセントまでなら損しても大丈夫」と、前もって決めておくことがとても大切です。
再現手順(HowTo)
- Python/依存(ccxt, pandas, ta)をインストール
- ccxtでBTC/USDTのOHLCVを取得して前処理
- 『Standard Deviation Channel』に必要な指標を算出(ta 等)
- 閾値・クロス条件から売買シグナルを生成
- 手数料・スリッページを加味して検証・評価
【結果】パフォーマンス
価格の推移
資産の推移
パフォーマンス指標
指標 | 値 |
---|---|
総トレード数 | 49回 |
勝率 | 48.98% |
平均利益 | 1.08% |
平均損失 | -1.67% |
期待値 | -0.32% |
プロフィットファクター | 0.62 |
最大ドローダウン | 22.51% |
最終リターン | -15.3% |
シャープレシオ | -0.33 |
HODL(Buy&Hold) | 9.89% |
HODL戦略との比較
実装コード(Python)
"""
Standard Deviation Channel Trading Signal
標準偏差チャネルを使用したトレード
"""
import pandas as pd
import numpy as np
def calculate_standard_deviation_channel_signals(df: pd.DataFrame,
period: int = 20,
std_multiplier: float = 2.0) -> pd.DataFrame:
"""
Standard Deviation Channel戦略のシグナル生成
Parameters:
-----------
df : pd.DataFrame
OHLCVデータ
period : int
計算期間(デフォルト: 20)
std_multiplier : float
標準偏差の乗数(デフォルト: 2.0)
Returns:
--------
pd.DataFrame
シグナルが追加されたDataFrame
"""
df = df.copy()
# 線形回帰値と標準偏差を計算
df['lr_value'] = np.nan
df['std_value'] = np.nan
for i in range(period - 1, len(df)):
data = df['close'].iloc[i-period+1:i+1].values
if len(data) >= 2:
x = np.arange(len(data))
coeffs = np.polyfit(x, data, 1)
regression_line = coeffs[0] * x + coeffs[1]
df.loc[df.index[i], 'lr_value'] = regression_line[-1]
df.loc[df.index[i], 'std_value'] = np.std(data - regression_line)
# チャネル
df['upper_channel'] = df['lr_value'] + std_multiplier * df['std_value']
df['lower_channel'] = df['lr_value'] - std_multiplier * df['std_value']
# シグナル初期化
df['signal'] = 0
df['is_buy'] = False
df['is_sell'] = False
position = 0
for i in range(period, len(df)):
# 買いシグナル
if position <= 0 and df['close'].iloc[i] > df['lower_channel'].iloc[i] and \
df['close'].iloc[i-1] <= df['lower_channel'].iloc[i-1]:
df.loc[df.index[i], 'is_buy'] = True
df.loc[df.index[i], 'signal'] = 1
position = 1
# 売りシグナル
elif position >= 0 and df['close'].iloc[i] < df['upper_channel'].iloc[i] and \
df['close'].iloc[i-1] >= df['upper_channel'].iloc[i-1]:
df.loc[df.index[i], 'is_sell'] = True
df.loc[df.index[i], 'signal'] = -1
position = -1
else:
df.loc[df.index[i], 'signal'] = position
df['signal'] = df['signal'].fillna(0)
return df
なぜこの結果になったのか(3つの理由)
- 1勝ったり負けたりする確率が、だいたい半分半分(勝率約49%)でした。これだと、なかなか大きなプラスにはなりにくいです。
- 21回の取引で、平均して0.32%ずつ損をしてしまう計算でした。つまり、やればやるほど、少しずつお金が減ってしまう可能性があったということです。
- 3一番うまくいかなかった時期には、持っているお金が一時的に22.51%も減ってしまいました。これは結構なピンチなので、損をしないためのルールが足りなかったのかもしれません。
この結果から学べる3つの教訓
- 1「これはイケる!」と思った作戦でも、実際にやってみるとうまくいかないことがあります。だから、「なんでダメだったんだろう?」と理由を考えることが大切です。
- 2勝った回数だけでなく、1回ごとの勝ち負けで動く金額も大事です。トータルで見て、この作戦が良いのか悪いのかを判断する必要があります。
- 3相場の雰囲気(すごく盛り上がっている時か、静かな時か)によって、作戦がうまくいく時といかない時がある、ということが分かりました。
リスク管理の具体的手法
取引量の決め方
1回の挑戦で使うお金は、持っているお金全部のうちの、ほんの一部(例えば1%とか2%)だけにします。こうすれば、もし失敗しても、大ケガをしなくて済みます。
損失が大きくなったときの対処法
もし持っているお金が、決めておいた割合(例えば10%)以上減ってしまったら、一度お休みします。そして、作戦をもう一度見直します。これで、どんどん損がふくらむのを防げます。
資金管理の方法
投資に使うお金は、なくなっても生活に困らない「余裕のあるお金」だけにしましょう。また、勝って儲かったら少しだけ使うお金を増やし、負けて損したら減らす、というように、状況に合わせて調整することも大切です。
改良案の具体的提案
- 「いつもの範囲」の幅を広くしたり狭くしたり調整して、もっと良い結果にならないか試してみます。
- 「買いだ!」「売りだ!」というサインが出たときに、「本当に今で大丈夫かな?」と確認する別のチェック方法を追加してみます。
- いつ買うかだけでなく、「いつ売って終わりにするか」という出口のルールをもっと上手なものにしてみます。
実用性の向上(運用上の注意)
- この作戦は、値動きが激しすぎず、穏やかな時にうまくいくかもしれません。相場の雰囲気を見て、使うかどうか決めると良さそうです。
- 計算に使う期間や「いつもの範囲」の幅などを色々変えてみて、自分にピッタリな設定を見つけることが大切です。
- 実際にお金を使う前に、昔のデータを使って何度も練習してみましょう。そうすると、この作戦の得意なことや苦手なことが分かってきます。
検証の透明性と信頼性
- データの出所: このテストで使ったのは、実際の取引所が記録しているビットコインの過去の値段のデータです。
- 検証のやり方: パソコンのプログラムを使って、過去のデータにこの作戦をあてはめたらどうなるか、シミュレーション(模擬実験)をしました。
- コード: このテストで使った計算の方法は、誰でも見られるように公開されています。
- 注意事項: このテストの結果は、あくまで過去のデータでのお話です。未来でも同じようにうまくいくとは限りません。投資には損をする可能性もあるので、自分自身の判断と責任で行ってくださいね。