5分でわかる投資の作戦!イーサリアム(ETH)で試したけど…勝率22%はやっぱり厳しい?
イーサリアム(ETH)という人気の暗号資産(仮想通貨)を使った投資の作戦を試してみました。この作戦は、値段の動きに勢いがあるときを狙って売り買いするものです。5分ごとの値動きで試してみましたが、残念ながら結果はマイナスになってしまいました。どうしてうまくいかなかったのか、この失敗から学べることを一緒に見ていきましょう。
導入と前提条件
イーサリアム(ETH)という人気の暗号資産(仮想通貨)を使った投資の作戦を試してみました。この作戦は、値段の動きに勢いがあるときを狙って売り買いするものです。5分ごとの値動きで試してみましたが、残念ながら結果はマイナスになってしまいました。どうしてうまくいかなかったのか、この失敗から学べることを一緒に見ていきましょう。
【検証】戦略のバックテスト概要
- 戦略名: ADX Trend Filter を使用したトレンド追従戦略
- 対象銘柄: ETH/USDT
- 時間足: 5m
- 期間: 2025-04-26〜2025-08-25(120日間)
- 初期資金: $10,000
- 手数料・スリッページ: 0.1% / 0.1%
- 取引所: binance
ADX Trend Filter の理論的背景
この作戦のねらいは、「大きな波に乗ること」です。市場には、値段がどんどん上がったり下がったりする「波が大きいとき(トレンド相場)」と、あまり動かない「波が穏やかなとき(レンジ相場)」があります。この作戦は、波が大きいときの方がもうけやすいと考えています。「ADX」メーターで波の大きさを測り、「25」を超えたら波に乗る準備をします。そして、「上がる力」が「下がる力」を追い越したら「買い」、「下がる力」が「上がる力」を追い越したら「売り」というように、大きな流れに乗って利益を出すことを目指すんです。
具体的な売買ルール(今回の検証)
エントリー条件
- 「ADX」メーターが25を超えて、値段が大きく動いているときだけ参加します。
- 「上がる力」の線が「下がる力」の線を追い越したら、買います。
- 「下がる力」の線が「上がる力」の線を追い越したら、売ります。
エグジット条件
- もうけが出ているときに、値段の勢いがなくなってきたら、利益を確定してやめます。
- 損しているときに、これ以上損が大きくならないように、途中でやめます。
- 例えば「買い」で入った後に「売り」の合図が出たら、一度やめます。
リスク管理
1回の取引で損してもいい金額は、持っているお金のすごく小さい一部(例えば100円とか)に決めておきます。もし予想と反対に値段が動いても、それ以上損しないように「ここまで値段が下がったら、あきらめて売る」というライン(損切りライン)を事前に決めておきます。こうすることで、一度の失敗で大金を失うのを防ぎます。
再現手順(HowTo)
- Python/依存(ccxt, pandas, ta)をインストール
- ccxtでETH/USDTのOHLCVを取得して前処理
- 『ADX Trend Filter』に必要な指標を算出(ta 等)
- 閾値・クロス条件から売買シグナルを生成
- 手数料・スリッページを加味して検証・評価
【結果】パフォーマンス
価格の推移
資産の推移
パフォーマンス指標
指標 | 値 |
---|---|
総トレード数 | 700回 |
勝率 | 22.43% |
平均利益 | 1.02% |
平均損失 | -0.68% |
期待値 | -0.3% |
プロフィットファクター | 0.44 |
最大ドローダウン | 89.1% |
最終リターン | -88.07% |
シャープレシオ | -0.62 |
HODL(Buy&Hold) | 162.24% |
HODL戦略との比較
実装コード(Python)
#!/usr/bin/env python3
"""
ADXトレンドフィルター戦略
ADXで強いトレンドを確認してからDIクロスでエントリー
"""
import pandas as pd
import numpy as np
def calculate_adx_signals(df: pd.DataFrame, adx_period: int = 14, adx_threshold: float = 25.0) -> pd.DataFrame:
"""
ADXトレンドフィルターシグナルを生成
Parameters:
-----------
df : pd.DataFrame
OHLCVデータ
adx_period : int
ADX期間(デフォルト: 14)
adx_threshold : float
トレンド判定閾値(デフォルト: 25.0)
Returns:
--------
pd.DataFrame
シグナル列が追加されたDataFrame
"""
df = df.copy()
# True Range計算
df['tr'] = np.maximum(
df['high'] - df['low'],
np.abs(df['high'] - df['close'].shift(1)),
np.abs(df['low'] - df['close'].shift(1))
)
# Directional Movement計算
df['dm_plus'] = np.where(
(df['high'] - df['high'].shift(1)) > (df['low'].shift(1) - df['low']),
np.maximum(df['high'] - df['high'].shift(1), 0),
0
)
df['dm_minus'] = np.where(
(df['low'].shift(1) - df['low']) > (df['high'] - df['high'].shift(1)),
np.maximum(df['low'].shift(1) - df['low'], 0),
0
)
# Smoothed TR and DM
df['atr'] = df['tr'].rolling(window=adx_period).mean()
df['dm_plus_smooth'] = df['dm_plus'].rolling(window=adx_period).mean()
df['dm_minus_smooth'] = df['dm_minus'].rolling(window=adx_period).mean()
# DI計算
df['di_plus'] = (df['dm_plus_smooth'] / df['atr']) * 100
df['di_minus'] = (df['dm_minus_smooth'] / df['atr']) * 100
# ADX計算
df['dx'] = np.abs(df['di_plus'] - df['di_minus']) / (df['di_plus'] + df['di_minus']) * 100
df['adx'] = df['dx'].rolling(window=adx_period).mean()
# シグナル生成(ADXが閾値以上でDIクロス)
df['is_buy'] = (
(df['adx'] > adx_threshold) & # 強いトレンド
(df['di_plus'] > df['di_minus']) & # +DIが上
(df['di_plus'].shift(1) <= df['di_minus'].shift(1)) # クロスオーバー
)
df['is_sell'] = (
(df['adx'] > adx_threshold) & # 強いトレンド
(df['di_plus'] < df['di_minus']) & # -DIが上
(df['di_plus'].shift(1) >= df['di_minus'].shift(1)) # クロスアンダー
)
# NaN値をFalseに置換
df['is_buy'] = df['is_buy'].fillna(False)
df['is_sell'] = df['is_sell'].fillna(False)
print(f"ADXトレンドフィルター: 期間={adx_period}, 閾値={adx_threshold}")
print(f"買いシグナル数: {df['is_buy'].sum()}")
print(f"売りシグナル数: {df['is_sell'].sum()}")
return df
なぜこの結果になったのか(3つの理由)
- 1勝った回数がとても少なかった(勝率 約22%)です。つまり、5回やって1回勝てるかどうか、というくらいでした。せっかく値段の勢いが強い時を狙っても、すぐに勢いがなくなったり、反対に動いてしまったりすることが多かったようです。
- 2たまに勝ってもらえるお金より、負けた時に失うお金の方が大きかったため、トータルでマイナスになってしまいました。
- 3もうかったお金の合計よりも、損したお金の合計の方がずっと大きかったことを示しています。だから、最終的にマイナスになってしまったんです。
この結果から学べる3つの教訓
- 1勝つ回数が少なくても、もうけることはできます。でもそのためには、「負けるときは少しだけ、勝つときは大きく」というルールが大切です。今回はそれがうまくできませんでした。
- 2「ADX」という勢いメーターだけでは、売り買いのタイミングを判断するのは難しかったようです。他の道具も組み合わせて、もっと確実なチャンスを待つ必要があるとわかりました。
- 3昔のデータでうまくいった作戦が、これからもずっとうまくいくとは限りません。市場はいつも変化しているということを忘れてはいけませんね。
リスク管理の具体的手法
取引量の決め方
1回の取引で使うお金の量は、もし損しても大丈夫な金額から計算します。例えば、お小遣いが1万円で、1回の損は100円までと決めたなら、その100円の損で済むように買う量を調整します。こうすれば、1回の失敗で大金を失うことがありません。
損失が大きくなったときの対処法
もし負けが続いて、持っているお金が大きく減ってしまったら(今回のテストでは最大で約89%も減りました!)、一度お休みすることが大切です。取引に使うお金を減らしたり、しばらく取引をやめて、どうして負けたのかを冷静に考え直す時間を作りましょう。
資金管理の方法
持っているお金を全部取引に使うのはとても危険です。取引に使うお金は一部だけにして、残りは貯金しておくなど、分けて管理しましょう。もし取引で失敗しても、生活に困らないようにしておくことが一番大事です。
改良案の具体的提案
- 「ADX」メーターが「25」を超えたら参加、というルールを変えてみる。例えば「30」にして、もっともっと強い勢いのときだけを狙うようにしてみます。
- 「ADX」メーターに加えて、例えば「移動平均線」のような別の道具も一緒に使ってみる。両方の合図がそろったときだけ取引すれば、もっと確実かもしれません。
- やめるときのルールをもっとハッキリさせます。「100円もうかったら必ずやめる」とか、「50円損したら必ずやめる」のように、具体的な数字でルールを決めると良さそうです。
実用性の向上(運用上の注意)
- 今回は5分ごとの短い時間で試しましたが、もっと長い時間(例えば1時間ごとや1日ごと)で見てみると、だましの動きが少なくなって、もっと安定した結果になるかもしれません。
- いきなり自分のお金で試すのは危険です。まずは、ゲームのお金で練習できる「デモ取引」で、この作戦が本当にうまくいくか試してみてください。
- この結果は、あくまで昔のデータでのお話です。未来も同じようにうまくいくとは限りません。投資は自己責任で、慎重に行いましょう。
検証の透明性と信頼性
- データの出所: このテストでは、イーサリアム(ETH)の5分ごとの値段のデータを使いました。どこの会社のデータかは書かれていませんが、ふつうは有名な会社のデータが使われます。
- 検証のやり方: 昔のデータを使って、「もしこの作戦で取引していたらどうなっていたか?」をコンピューターで計算しました。これをバックテストと言います。
- コード: はい、このテストに使ったプログラム(Pythonコード)は公開されています。だから、誰でも同じテストをしたり、自分なりに改造したりすることができます。
- 注意事項: このお話は、投資の作戦を分析したもので、これからのもうけを約束するものではありません。投資をするときは、必ず自分でよく考えて、自分の責任で行ってください。特に暗号資産は値段の動きが激しいので、十分注意してくださいね。