ビットコインの値動きをキャッチ!「プライスチャネル」で投資に挑戦してみよう
ビットコインの値段の動きには、ある「通り道」のようなものがあるんです。この「プライスてャネル」という通り道を使った投資の方法について、実際に約4ヶ月間試してみたらどうなったのか、一緒に見ていきましょう。
導入と前提条件
ビットコインの値段の動きには、ある「通り道」のようなものがあるんです。この「プライスてャネル」という通り道を使った投資の方法について、実際に約4ヶ月間試してみたらどうなったのか、一緒に見ていきましょう。
【検証】戦略のバックテスト概要
- 戦略名: Price Channel を使用したトレンド追従戦略
- 対象銘柄: BTC/USDT
- 時間足: 1h
- 期間: 2025-04-28〜2025-08-26(119日間)
- 初期資金: $10,000
- 手数料・スリッページ: 0.1% / 0.1%
- 取引所: binance
Price Channel の理論的背景
この方法の考え方は、「値段って、だいたいいつも決まった範囲で上がったり下がったりするよね」という考えが元になっています。もし、その範囲を上に突き抜けたら、「これはもっと上がるかも!」と考えて買ってみます。逆に、下に突き抜けたら、「もっと下がるかも!」と考えて売ってみるんです。でも、思った通りにいかないこともあるので、いつ取引をやめるか(出口)のルールを決めておくのが、とっても大事になります。
具体的な売買ルール(今回の検証)
エントリー条件
- 過去20時間のあいだで、いちばん高かった値段よりも、今の値段が高くなったら「買い」の合図です。
- 過去20時間のあいだで、いちばん安かった値段よりも、今の値段が安くなったら「売り」の合図です。
エグジット条件
- 「買い」で始めたときは、過去10時間のあいだのいちばん安い値段よりも、今の値段が安くなったら、そこで取引を終わりにします。これは、利益が出ているときも、損しているときも同じルールです。
- 「売り」で始めたときは、過去10時間のあいだのいちばん高い値段よりも、今の値段が高くなったら、そこで取引を終わりにします。これも、利益が出ていても損していても同じです。
リスク管理
もし予想がはずれてお金が減りそうになったら、大きな損になる前に取引をやめることが大切です。一度に全部のお金を使わずに、少しずつ取引することで、もしもの時のダメージを小さくできます。
再現手順(HowTo)
- Python/依存(ccxt, pandas, ta)をインストール
- ccxtでBTC/USDTのOHLCVを取得して前処理
- 『Price Channel』に必要な指標を算出(ta 等)
- 閾値・クロス条件から売買シグナルを生成
- 手数料・スリッページを加味して検証・評価
【結果】パフォーマンス
価格の推移
資産の推移
パフォーマンス指標
指標 | 値 |
---|---|
総トレード数 | 34回 |
勝率 | 29.41% |
平均利益 | 2.38% |
平均損失 | -1.43% |
期待値 | -0.31% |
プロフィットファクター | 0.68 |
最大ドローダウン | 18.09% |
最終リターン | -10.74% |
シャープレシオ | -0.22 |
HODL(Buy&Hold) | 16.56% |
HODL戦略との比較
実装コード(Python)
"""
Price Channel Trading Signal
価格チャネルブレイクアウト戦略
"""
import pandas as pd
import numpy as np
def calculate_price_channel_signals(df: pd.DataFrame,
upper_period: int = 20,
lower_period: int = 20,
exit_period: int = 10) -> pd.DataFrame:
"""
Price Channel戦略のシグナル生成
Parameters:
-----------
df : pd.DataFrame
OHLCVデータ
upper_period : int
上部チャネル期間(デフォルト: 20)
lower_period : int
下部チャネル期間(デフォルト: 20)
exit_period : int
エグジット用チャネル期間(デフォルト: 10)
Returns:
--------
pd.DataFrame
シグナルが追加されたDataFrame
"""
df = df.copy()
# エントリー用チャネル
df['upper_channel'] = df['high'].shift(1).rolling(window=upper_period).max()
df['lower_channel'] = df['low'].shift(1).rolling(window=lower_period).min()
df['middle_channel'] = (df['upper_channel'] + df['lower_channel']) / 2
# エグジット用チャネル(より短期)
df['upper_exit'] = df['high'].shift(1).rolling(window=exit_period).max()
df['lower_exit'] = df['low'].shift(1).rolling(window=exit_period).min()
# チャネル幅(ボラティリティ指標)
df['channel_width'] = df['upper_channel'] - df['lower_channel']
df['channel_width_ma'] = df['channel_width'].rolling(window=upper_period).mean()
# シグナル初期化
df['signal'] = 0
df['is_buy'] = False
df['is_sell'] = False
# 現在のポジション状態を追跡
position = 0
for i in range(max(upper_period, lower_period), len(df)):
# 買いシグナル(上部チャネルブレイクアウト)
if position <= 0 and df['close'].iloc[i] > df['upper_channel'].iloc[i]:
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['lower_channel'].iloc[i]:
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
# NaN値を0で埋める
df['signal'] = df['signal'].fillna(0)
return df
def get_strategy_name() -> str:
"""戦略名を返す"""
return "Price Channel"
def get_strategy_description() -> str:
"""戦略の説明を返す"""
return "価格チャネルのブレイクアウトを狙うトレンドフォロー戦略"
なぜこの結果になったのか(3つの理由)
- 1この方法は、値段がぐんぐん上がったり下がったりする「波」に乗るのが得意です。でも、今回は値段があまりハッキリ動かない、行ったり来たりの時期だったのかもしれません。そのため、トンネルを抜けたと見せかけて、すぐに戻ってきちゃう「だまし」が多くて、うまく勝てなかった可能性があります。
- 2勝てた確率は約29%でした。これは、3回やって1回勝てるかどうか、というくらいです。今回は、勝ったときにもらえるお金よりも、負けたときに失うお金のほうが大きくなってしまい、全体で見るとマイナスになってしまいました。
- 3一番うまくいかなかった時期には、お金が約18%も減ってしまいました。これは、何もせずにただビットコインを持っていた場合(約16%のプラス)よりも、悪い結果だったということになります。
この結果から学べる3つの教訓
- 1「プライスチャネル」のようなシンプルなルールでも、いつでもうまくいくわけじゃない、ということがわかりました。今の値動きが、波に乗っている時期なのか、行ったり来たりしている時期なのか、見分けることがとても大事なんですね。
- 2何回勝てたか(勝率)だけじゃなくて、勝ったときにいくら増えて、負けたときにいくら減ったのか、トータルでプラスになったのかどうかを見ることが大切だとわかりました。
- 3どんなに良い方法でも、「何時間前までの値段を見るか」みたいな設定を、そのときの状況に合わせて変えていくことが必要なんですね。そして、大きな失敗をしないように、しっかり自分のお金を守るルール(リスク管理)が一番大事だということも学びました。
リスク管理の具体的手法
取引量の決め方
一度の取引に使うお金は、持っているお金のほんの一部(例えば100分の1とか)だけにします。こうすれば、もし負けても、全体のお金がガクッと減ることはありません。
損失が大きくなったときの対処法
もし、全体のお金が、ある程度(例えば10%)減ってしまったら、一度全部の取引をお休みします。そして、やり方や設定が今の状況に合っているか、じっくり考え直します。こうすることで、ズルズルと負け続けるのを防げます。
資金管理の方法
取引で増えたお金を、次も全部使っちゃうのか、それとも少しは貯金しておくのか、ちゃんと計画を立てることが大事です。こうすることで、安定してコツコツお金を増やしていくことができます。
改良案の具体的提案
- トンネルを抜けた!とすぐに判断するんじゃなくて、抜けた後の勢いがどれくらい強いかとか、他の道具(例えば「移動平均線」)も一緒に見てあげると、「だまし」に引っかかりにくくなるかもしれません。
- 「何時間前までの値段を見るか」という設定を、そのときの値動きに合わせてコンピューターが自動で変えるようにしたり、色々な数字の組み合わせを試したりすると、もっと良い結果が出るかもしれません。
- 取引をやめるタイミングのルールを、もっと賢くするのも良い方法です。例えば、「うまくいっているときは、できるだけ長く続けて利益を大きくする」、「ダメそうなときは、すぐにやめて損を小さくする」みたいに、工夫する余地がありそうです。
実用性の向上(運用上の注意)
- この方法は、値段がぐんぐん上がっていたり、逆にどんどん下がっていたりする「波のある時」に力を発揮しやすいです。値段が狭い範囲で上がったり下がったりしている「行ったり来たり」の時には、「だまし」が多くてうまくいかないことがあるので、注意が必要です。
- 「何時間前までを見るか」みたいな設定は、ビットコインでやるのか、他のものでやるのか、1時間ごとに見るのか、1日ごとに見るのか、によって一番いい数字が変わってきます。色々試してみて、自分にピッタリの設定を見つけるのが大事です。
- このお話は、あくまで過去の値段で試してみた結果です。「未来もこうなる!」と決まったわけではありません。もし実際にやってみるなら、まずはお小遣いみたいな少ないお金で試してみて、慎重に進めるのがおすすめです。
検証の透明性と信頼性
- データの出所: このテストでは、過去のビットコインの1時間ごとの値段のデータを使いました。
- 検証のやり方: あるプログラムを使って、2025年4月28日から8月26日までの約4ヶ月間、この方法がうまくいったかどうかを、過去のデータでチェックしました。これを「バックテスト」と言います。
- コード: この方法をコンピューターで動かすためのプログラム(Pythonコード)も、ちゃんと用意されています。
- 注意事項: このお話は、あくまで情報のひとつです。「こうすれば絶対もうかるよ!」とおすすめしているわけではありません。投資には、お金が減ってしまう可能性(リスク)が必ずあります。やるかやらないかは、最後は自分で決めてくださいね。