ビットコインのウラの動きを見つけよう!ADLダイバージェンス作戦
この作戦は、ビットコインの値段の動きと、「ADL」という特別な道具の動きがずれた時に、買ったり売ったりするタイミングを見つける方法です。1時間ごとのデータで、約4ヶ月間試してみた結果をお話ししますね。
取引数
96
勝率
23.96%
最終リターン
-33.67%
最大DD
34.20%
導入と前提条件
この作戦は、ビットコインの値段の動きと、「ADL」という特別な道具の動きがずれた時に、買ったり売ったりするタイミングを見つける方法です。1時間ごとのデータで、約4ヶ月間試してみた結果をお話ししますね。
【検証】戦略のバックテスト概要
- 戦略名: ADL Divergence を使用したトレンド追従戦略
- 対象銘柄: BTC/USDT
- 時間足: 1h
- 期間: 2025-04-28〜2025-08-26(119日間)
- 初期資金: $10,000
- 手数料・スリッページ: 0.1% / 0.1%
- 取引所: binance
ADL Divergence の理論的背景
ADLは、市場で「買いの勢い」と「売りの勢い」のどちらが強いかを示す道具です。もし値段がどんどん上がっているのに、ADLがあまり上がっていなかったら、それは「見かけほど買いの勢いは強くないかも」というサインかもしれません。逆に、値段が下がっているのにADLが上がっていたら、「そろそろ値段が上がり始めるかも」と期待できます。この「値段とADLのズレ(ダイバージェンス)」を使って、未来の動きを予想するのがこの作戦の考え方です。
具体的な売買ルール(今回の検証)
エントリー条件
- 【買うタイミング】ADLがいつもの平均よりずっと元気で、しかも上がり続けているとき。
- 【売るタイミング】ADLがいつもの平均よりずっと元気がなくて、しかも下がり続けているとき。
エグジット条件
- 【もうかっている時】取引を始めた後、予想通りに値段が動いて利益が出たら、取引を終わらせます。
- 【損している時】もし予想と反対に値段が動いてしまったら、これ以上損が大きくならないうちに取引をやめます(損切り)。
リスク管理
一度にたくさんのお金を使わないようにします。もし損が出ても「このくらいまでなら大丈夫」と決めた範囲でおさまるようにして、大きな失敗を防ぎます。
再現手順(HowTo)
- Python/依存(ccxt, pandas, ta)をインストール
- ccxtでBTC/USDTのOHLCVを取得して前処理
- 『ADL Divergence』に必要な指標を算出(ta 等)
- 閾値・クロス条件から売買シグナルを生成
- 手数料・スリッページを加味して検証・評価
【結果】パフォーマンス
価格の推移
資産の推移
パフォーマンス指標
指標 | 値 |
---|---|
総トレード数 | 96回 |
勝率 | 23.96% |
平均利益 | 1.13% |
平均損失 | -0.91% |
期待値 | -0.42% |
プロフィットファクター | 0.38 |
最大ドローダウン | 34.2% |
最終リターン | -33.67% |
シャープレシオ | -0.93 |
HODL(Buy&Hold) | 16.56% |
HODL戦略との比較
実装コード(Python)
strategy.py
"""
Accumulation Distribution Line Divergence Trading Signal
価格とADLの乖離を検出する戦略
"""
import pandas as pd
import numpy as np
def calculate_adl_divergence_signals(df: pd.DataFrame,
period: int = 14,
threshold: float = 0.02) -> pd.DataFrame:
"""
ADL Divergence戦略のシグナル生成
Parameters:
-----------
df : pd.DataFrame
OHLCVデータ
period : int
ダイバージェンス検出期間(デフォルト: 14)
threshold : float
ダイバージェンス閾値(デフォルト: 0.02)
Returns:
--------
pd.DataFrame
シグナルが追加されたDataFrame
"""
df = df.copy()
# ADL計算
money_flow_multiplier = ((df['close'] - df['low']) - (df['high'] - df['close'])) / (df['high'] - df['low'])
money_flow_multiplier = money_flow_multiplier.fillna(0)
money_flow_volume = money_flow_multiplier * df['volume']
df['adl'] = money_flow_volume.cumsum()
# ADLの移動平均
df['adl_ma'] = df['adl'].rolling(window=period).mean()
df['adl_std'] = df['adl'].rolling(window=period).std()
# シグナル初期化
df['signal'] = 0
df['is_buy'] = False
df['is_sell'] = False
# ADLが移動平均から大きく乖離した時にシグナル
# 買いシグナル: ADLが上昇トレンド
df['adl_signal'] = (df['adl'] - df['adl_ma']) / (df['adl_std'] + 1e-10)
# 買いシグナル
buy_condition = (
(df['adl_signal'] > 1.5) & # ADLが標準偏差の1.5倍以上上
(df['adl'] > df['adl'].shift(period)) # ADLが上昇トレンド
)
df.loc[buy_condition, 'is_buy'] = True
# 売りシグナル
sell_condition = (
(df['adl_signal'] < -1.5) | # ADLが標準偏差の1.5倍以上下
(df['adl'] < df['adl'].shift(period)) # ADLが下降トレンド
)
df.loc[sell_condition, 'is_sell'] = True
# シグナルの設定
df.loc[df['is_buy'], 'signal'] = 1
df.loc[df['is_sell'], 'signal'] = -1
# シグナルを前方補完(ffillを使わない方法)
for i in range(1, len(df)):
if df['signal'].iloc[i] == 0:
df.loc[df.index[i], 'signal'] = df['signal'].iloc[i-1]
df['signal'] = df['signal'].fillna(0)
return df
def get_strategy_name() -> str:
"""戦略名を返す"""
return "ADL Divergence"
def get_strategy_description() -> str:
"""戦略の説明を返す"""
return "価格とAccumulation Distribution Lineの乖離を検出してエントリー"
なぜこの結果になったのか(3つの理由)
- 1勝った回数が約24%と少なかったのは、ADLのサインだけでは、市場の本当の勢いをうまくつかめなかったからかもしれません。
- 2全体として損してしまった(期待値-0.42%)のは、勝った時にもらえる利益よりも、負けた時に失う金額の方が平均して大きかったからです。
- 3もうかったお金と損したお金のバランス(PF)が0.38と、1よりもずっと小さかったのは、取引全体で損した金額の方が多かったことを示しています。
この結果から学べる3つの教訓
- 1ADLと値段のズレを見るのは面白い考え方だけど、この作戦だけでは勝つのが難しいということがわかりました。
- 2勝てる回数が少なくても、他の方法と組み合わせたり、ルールを少し変えたりすれば、もっと良い結果になる可能性があると学びました。
- 3たとえうまくいかなくても、なぜダメだったのかを考えて、次に活かすことがとても大切だとわかりました。
リスク管理の具体的手法
取引量の決め方
1回の取引に使うお金は、持っているお金全体の1%や2%のように、ごく一部だけを使います。こうすれば、もし負けても大きなダメージを受けません。
損失が大きくなったときの対処法
もし負けが続いて、全体のお金が最初に決めた以上に減ってしまったら(最大DD: 34.2%)、一度取引をお休みして、冷静に作戦を考え直します。
資金管理の方法
もうかったら一部は使わずに取っておく、損したら無理して取り返そうとしないなど、おこづかい帳をつけるようにしっかりお金を管理して、長く続けられるようにします。
改良案の具体的提案
- 移動平均線やRSIといった、他のグラフ分析ツールと一緒に使うことで、もっと確実なサインを見つけられるようにします。
- ADLを計算するときの期間の長さを変えたり、「ズレ」を判断するための基準の数字を調整したりして、一番良い設定を探してみます。
- もうかっている時に、もっと利益を大きくするための新しいルール(トレーリングストップなど)を追加してみます。
実用性の向上(運用上の注意)
- この作戦は今回のテストではうまくいかなかったので、そのまま使うのはやめましょう。もし試すなら、自分でルールを良くしたり、他の方法と組み合わせたりしてくださいね。
- 取引を始める前に、今日の市場は元気なのか、静かなのかなど、全体の様子を確認することが大切です。
- 「期待値」や「PF」のような数字を見て、その作戦が本当にうまくいく可能性があるのかを、感情に流されずに判断しましょう。
検証の透明性と信頼性
- データの出所: このテストには、誰でも見ることができるビットコインの1時間ごとの値段のデータを使いました。
- 検証のやり方: 公開されているプログラムを使って、「もしこの作戦で過去に取引していたら、どうなっていたか?」をコンピューターで試してみました。
- コード: この作戦を動かすためのプログラム(コード)は公開されているので、誰でも見ることができます。
- 注意事項: この結果は、あくまでも過去のデータで試したものです。未来も同じようにうまくいくとは限りません。投資は、自分でしっかり勉強して、自分の判断と責任で行いましょう。
よくある質問
Q.ADLって何のこと?
A.「買いの勢い」と「売りの勢い」がどっちが強いかを数字で表した、グラフ分析の道具の一つだよ。
Q.ダイバージェンスってどういう意味?
A.「ズレ」とか「逆の動き」っていう意味だよ。ここでは、値段の動きとADLの動きが、ちぐはぐになっている状態のことを指しているんだ。
Q.勝率が低いって、どういうこと?
A.取引を100回やったら、勝てたのが24回くらいだったってこと。つまり、4回に1回くらいしか勝てず、負けることの方が多かったんだ。
Q.期待値がマイナスって、よくないこと?
A.そうだね。期待値がマイナスだと、取引を繰り返すごとに、平均して少しずつお金が減ってしまう可能性が高いってことなんだ。
Q.この作戦を実際に使ってみてもいい?
A.今回の結果を見る限り、このまま使うのはおすすめできないかな。でも、作戦の考え方は面白いから、自分でルールを工夫したり、他の方法と組み合わせたりすれば、将来使えるようになるかもしれないよ。試す前には、必ず自分でしっかり調べてね。
Q.検証に使用した期間と時間足は?
A.1h足で検証しました。期間は記事内の概要をご確認ください。
Q.最終リターンと最大ドローダウンは?
A.最終リターンは-33.67%、最大DDは34.20%です。
Q.勝率やPFはどの程度?
A.勝率は23.96%、プロフィットファクターは0.38です。
Q.HODLとの比較結果は?
A.HODLは16.56%でした。記事内の比較表をご覧ください。
Q.手数料やスリッページは考慮済み?
A.はい。バックテスト設定の手数料・スリッページを損益に反映しています。
Q.市場環境はトレンド/レンジどちらに近かった?
A.期間中はトレンド優勢と推測されます。
Q.この戦略は初心者でも扱える?
A.基礎的な指標と検証環境の知識があれば扱えます。まずは少額・デモから。
Q.推奨のリスク管理は?
A.最大DDを踏まえた損切り・ポジションサイジングと、システム停止基準の設定を推奨します。
Q.将来の結果は期待できる?
A.過去の結果は将来を保証しません。市場環境やパラメータ適合性に大きく依存します。
Q.改良の方向性は?
A.トレンド・ボラティリティのフィルター併用、パラメータの再最適化、取引頻度の制御を検討してください。