ビットコインで挑戦!「かしこいチャネル」作戦をわかりやすく解説します
この作戦は、ビットコインの値段が5分ごとにどう動くかを見て、売り買いのチャンスを見つけるための方法です。周りの状況に合わせて賢く変化する「かしこいチャネル」という道具を使って、上手に取引することを目指します。
導入と前提条件
この作戦は、ビットコインの値段が5分ごとにどう動くかを見て、売り買いのチャンスを見つけるための方法です。周りの状況に合わせて賢く変化する「かしこいチャネル」という道具を使って、上手に取引することを目指します。
【検証】戦略のバックテスト概要
- 戦略名: Adaptive Channel Index を使用したトレンド追従戦略
- 対象銘柄: BTC/USDT
- 時間足: 5m
- 期間: 2025-03-16〜2025-08-25(161日間)
- 初期資金: $10,000
- 手数料・スリッページ: 0.1% / 0.1%
- 取引所: kucoin
Adaptive Channel Index の理論的背景
この作戦の元にある考え方は、「世の中の動きはいつも変わる」ということです。ビットコインの値段の動き方も、激しい時とおだやかな時があります。そこで、その時の値動きの激しさを測る道具を使って、チャネルの幅を自動で変えるんです。値動きが激しい時は幅を広く、おだやかな時は幅をせまくします。こうすることで、どんな状況でも売り買いのチャンスを見つけやすくなります。「ACI」という、値段がチャネルのどの辺にいるかを示す数字を使って、0.2より小さくなったら買いの準備、0.8より大きくなったら売りの準備、というふうにタイミングをはかります。
具体的な売買ルール(今回の検証)
エントリー条件
- ACIという数字が、0.2より小さくなった後で、また0.2より大きくなったら買います。
- 値段がチャネルの下の線より下に行ってしまってから、また線の上に戻ってきたら買います。
エグジット条件
- ACIという数字が、0.8より大きくなった後で、また0.8より小さくなったら取引を終わります(利益が出ても損が出ても、ここで一旦やめます)。
- 値段がチャネルの上の線より上に行ってしまってから、また線の下に戻ってきたら取引を終わります。
リスク管理
大きな損をしないための工夫はとても大切です。この作戦の過去の成績を見ると、803回も取引したのに、勝てたのは約13%だけでした。しかも、最終的にはお金が大きく減ってしまいました。これは、勝つときは少しだけ、でも負けるときは大きく損をしてしまったからだと考えられます。だから、損が大きくならないうちに取引をやめる「損切り」という工夫が、ものすごく重要になります。
再現手順(HowTo)
- Python/依存(ccxt, pandas, ta)をインストール
- ccxtでBTC/USDTのOHLCVを取得して前処理
- 『Adaptive Channel Index』に必要な指標を算出(ta 等)
- 閾値・クロス条件から売買シグナルを生成
- 手数料・スリッページを加味して検証・評価
【結果】パフォーマンス
価格の推移
資産の推移
パフォーマンス指標
指標 | 値 |
---|---|
総トレード数 | 803回 |
勝率 | 13.45% |
平均利益 | 0.37% |
平均損失 | -0.49% |
期待値 | -0.37% |
プロフィットファクター | 0.15 |
最大ドローダウン | 95.1% |
最終リターン | -95.05% |
シャープレシオ | -1.1 |
HODL(Buy&Hold) | 33.11% |
HODL戦略との比較
実装コード(Python)
"""
Adaptive Channel Index Trading Signal Generator
市場状況に応じて動的に調整されるチャネル
"""
import pandas as pd
import numpy as np
def calculate_adaptive_channel_signals(df: pd.DataFrame,
period: int = 20,
multiplier: float = 2.0) -> pd.DataFrame:
"""
Adaptive Channel Index戦略のシグナル生成
Parameters:
-----------
df : pd.DataFrame
OHLCVデータ
period : int
基本期間(デフォルト: 20)
multiplier : float
チャネル幅の倍率(デフォルト: 2.0)
Returns:
--------
pd.DataFrame
シグナルが追加されたDataFrame
"""
df = df.copy()
# ハイローチャネル
df['highest'] = df['high'].rolling(window=period).max()
df['lowest'] = df['low'].rolling(window=period).min()
df['hl_mid'] = (df['highest'] + df['lowest']) / 2
# ATRベースの適応幅
df['h_l'] = df['high'] - df['low']
df['h_c'] = np.abs(df['high'] - df['close'].shift(1))
df['l_c'] = np.abs(df['low'] - df['close'].shift(1))
df['true_range'] = df[['h_l', 'h_c', 'l_c']].max(axis=1)
df['atr'] = df['true_range'].rolling(window=period).mean()
# 適応係数(ボラティリティ比率)
df['atr_ratio'] = df['atr'] / df['atr'].rolling(window=period * 2).mean()
df['adaptive_mult'] = multiplier * df['atr_ratio']
# 適応チャネル
df['channel_upper'] = df['hl_mid'] + df['adaptive_mult'] * df['atr']
df['channel_lower'] = df['hl_mid'] - df['adaptive_mult'] * df['atr']
# チャネル内での位置(ACI)
df['aci'] = (df['close'] - df['channel_lower']) / (df['channel_upper'] - df['channel_lower'] + 0.0001)
# ACIのスムージング
df['aci_smooth'] = df['aci'].rolling(window=3).mean()
# シグナル生成
df['aci_prev'] = df['aci_smooth'].shift(1)
df['is_buy'] = (
((df['aci_smooth'] > 0.2) & (df['aci_prev'] <= 0.2)) | # 下部チャネルからの反発
((df['close'] > df['channel_lower']) & (df['close'].shift(1) <= df['channel_lower'].shift(1)))
) & df['aci_smooth'].notna()
df['is_sell'] = (
((df['aci_smooth'] < 0.8) & (df['aci_prev'] >= 0.8)) | # 上部チャネルからの反落
((df['close'] < df['channel_upper']) & (df['close'].shift(1) >= df['channel_upper'].shift(1)))
) & df['aci_smooth'].notna()
# 不要カラム削除
df.drop(['highest', 'lowest', 'hl_mid', 'h_l', 'h_c', 'l_c', 'true_range',
'atr_ratio', 'adaptive_mult', 'aci_smooth', 'aci_prev'],
axis=1, inplace=True, errors='ignore')
return df
なぜこの結果になったのか(3つの理由)
- 1勝った割合が約13%とすごく低いのは、売り買いのタイミングがずれていたり、損切りがうまくできていなかったりするからかもしれません。
- 2成績を表すPFという数字が、1よりずっと小さい0.15でした。これは、儲けたお金よりも、損したお金のほうがずっと大きかった、ということを表しています。
- 3最大DDという数字が95.1%とすごく大きいのは、一時期、持っていたお金がほとんど無くなってしまうくらい、大きな失敗があったことを意味します。
この結果から学べる3つの教訓
- 1勝つ回数が少なくても、一回ごとの「勝ち」を大きく、「負け」を小さくできれば、うまくいく作戦もあります。でも、この作戦はそうなっていませんでした。
- 2値動きに合わせてチャネルの幅を変える、というアイデア自体は良いものです。でも、その設定や売り買いのルールが、実際のビットコインの動きと合っていなかったのかもしれません。
- 3過去のデータで試してみて成績が悪かった場合、そのまま使ってはいけません。なぜダメだったのかを考えて、やり方をもっと良くしていくことが大切です。
リスク管理の具体的手法
取引量の決め方
一度に使うお金の量を決めておくことは、お金を守る基本です。例えば、「1回の取引で損していいのは、持っているお金の1%まで」と決めておけば、続けて負けてもすぐにお金が全部なくなることはありません。
損失が大きくなったときの対処法
もし、持っているお金が10%のように、決めておいた割合以上減ってしまったら、一度取引をお休みします。そして、作戦や設定を見直す時間を作りましょう。この作戦ではお金が95.1%も減った時期があったので、このルールが全く守れていなかったと言えます。
資金管理の方法
長く取引を続けていくためには、計画が大切です。儲かったお金を次にどう使うか、損した時はどうやって取り戻すか、などを考えます。目の前の勝ち負けだけでなく、自分のお金全体がどうなっていくかを管理するんです。
改良案の具体的提案
- 売り買いの合図になるACIの数字(0.2や0.8)を、今の状況に合わせて変えられないか考えてみます。
- 「これ以上損したらやめる」という損切りのルールを、もっと厳しくします。そうすれば、大きな損を防げるかもしれません。
- 勝つ回数が少ない作戦なので、勝つときはできるだけたくさん利益をもらい、負けるときは少しの損で済ませる。そんな上手な売り買いのルールを考える必要があります。
実用性の向上(運用上の注意)
- この作戦は、過去のデータで試した結果がとても悪いです。なので、このまま本物のお金で使うのは、すごく危ないです。
- もしこの作戦を試してみたいなら、まずは練習用のお金(デモトレード)で十分に試しましょう。そして、設定やルールをもっと良くしてからにしてください。
- 昔のデータでうまくいったかだけでなく、今の実際の値動きを見ながら、注意深く判断することがとても大事です。
検証の透明性と信頼性
- データの出所: この説明は、もらった情報をもとに作っています(どの会社のデータを使ったかは書かれていません)。
- 検証のやり方: もらった設定とプログラムを使って、「もし過去にこの作戦をやっていたらどうなったか」を計算した結果が書かれています。
- コード: 計算に使ったPythonというプログラムのコードは公開されています。
- 注意事項: この作戦は、昔のデータでどうだったかを示しているだけです。これから先も同じようにうまくいくとは限りません。投資は、自分の判断と責任で行ってくださいね。