シェア:

5分でわかる投資の作戦!イーサリアム(ETH)で試したけど…勝率22%はやっぱり厳しい?

イーサリアム(ETH)という人気の暗号資産(仮想通貨)を使った投資の作戦を試してみました。この作戦は、値段の動きに勢いがあるときを狙って売り買いするものです。5分ごとの値動きで試してみましたが、残念ながら結果はマイナスになってしまいました。どうしてうまくいかなかったのか、この失敗から学べることを一緒に見ていきましょう。

取引数
700
勝率
22.43%
最終リターン
-88.07%
最大DD
89.10%

導入と前提条件

イーサリアム(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)

  1. Python/依存(ccxt, pandas, ta)をインストール
  2. ccxtでETH/USDTのOHLCVを取得して前処理
  3. 『ADX Trend Filter』に必要な指標を算出(ta 等)
  4. 閾値・クロス条件から売買シグナルを生成
  5. 手数料・スリッページを加味して検証・評価

【結果】パフォーマンス

価格の推移

価格推移

資産の推移

資産推移

パフォーマンス指標

指標
総トレード数700回
勝率22.43%
平均利益1.02%
平均損失-0.68%
期待値-0.3%
プロフィットファクター0.44
最大ドローダウン89.1%
最終リターン-88.07%
シャープレシオ-0.62
HODL(Buy&Hold)162.24%

HODL戦略との比較

HODL戦略との比較

実装コード(Python)

strategy.py
#!/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. 1勝った回数がとても少なかった(勝率 約22%)です。つまり、5回やって1回勝てるかどうか、というくらいでした。せっかく値段の勢いが強い時を狙っても、すぐに勢いがなくなったり、反対に動いてしまったりすることが多かったようです。
  2. 2たまに勝ってもらえるお金より、負けた時に失うお金の方が大きかったため、トータルでマイナスになってしまいました。
  3. 3もうかったお金の合計よりも、損したお金の合計の方がずっと大きかったことを示しています。だから、最終的にマイナスになってしまったんです。

この結果から学べる3つの教訓

  1. 1勝つ回数が少なくても、もうけることはできます。でもそのためには、「負けるときは少しだけ、勝つときは大きく」というルールが大切です。今回はそれがうまくできませんでした。
  2. 2「ADX」という勢いメーターだけでは、売り買いのタイミングを判断するのは難しかったようです。他の道具も組み合わせて、もっと確実なチャンスを待つ必要があるとわかりました。
  3. 3昔のデータでうまくいった作戦が、これからもずっとうまくいくとは限りません。市場はいつも変化しているということを忘れてはいけませんね。

リスク管理の具体的手法

取引量の決め方

1回の取引で使うお金の量は、もし損しても大丈夫な金額から計算します。例えば、お小遣いが1万円で、1回の損は100円までと決めたなら、その100円の損で済むように買う量を調整します。こうすれば、1回の失敗で大金を失うことがありません。

損失が大きくなったときの対処法

もし負けが続いて、持っているお金が大きく減ってしまったら(今回のテストでは最大で約89%も減りました!)、一度お休みすることが大切です。取引に使うお金を減らしたり、しばらく取引をやめて、どうして負けたのかを冷静に考え直す時間を作りましょう。

資金管理の方法

持っているお金を全部取引に使うのはとても危険です。取引に使うお金は一部だけにして、残りは貯金しておくなど、分けて管理しましょう。もし取引で失敗しても、生活に困らないようにしておくことが一番大事です。

改良案の具体的提案

  • 「ADX」メーターが「25」を超えたら参加、というルールを変えてみる。例えば「30」にして、もっともっと強い勢いのときだけを狙うようにしてみます。
  • 「ADX」メーターに加えて、例えば「移動平均線」のような別の道具も一緒に使ってみる。両方の合図がそろったときだけ取引すれば、もっと確実かもしれません。
  • やめるときのルールをもっとハッキリさせます。「100円もうかったら必ずやめる」とか、「50円損したら必ずやめる」のように、具体的な数字でルールを決めると良さそうです。

実用性の向上(運用上の注意)

  • 今回は5分ごとの短い時間で試しましたが、もっと長い時間(例えば1時間ごとや1日ごと)で見てみると、だましの動きが少なくなって、もっと安定した結果になるかもしれません。
  • いきなり自分のお金で試すのは危険です。まずは、ゲームのお金で練習できる「デモ取引」で、この作戦が本当にうまくいくか試してみてください。
  • この結果は、あくまで昔のデータでのお話です。未来も同じようにうまくいくとは限りません。投資は自己責任で、慎重に行いましょう。

検証の透明性と信頼性

  • データの出所: このテストでは、イーサリアム(ETH)の5分ごとの値段のデータを使いました。どこの会社のデータかは書かれていませんが、ふつうは有名な会社のデータが使われます。
  • 検証のやり方: 昔のデータを使って、「もしこの作戦で取引していたらどうなっていたか?」をコンピューターで計算しました。これをバックテストと言います。
  • コード: はい、このテストに使ったプログラム(Pythonコード)は公開されています。だから、誰でも同じテストをしたり、自分なりに改造したりすることができます。
  • 注意事項: このお話は、投資の作戦を分析したもので、これからのもうけを約束するものではありません。投資をするときは、必ず自分でよく考えて、自分の責任で行ってください。特に暗号資産は値段の動きが激しいので、十分注意してくださいね。

よくある質問

Q.ADXやDIって、結局なに?

A.値段の動きの「元気度」を数字にしたものです。ADXは全体の盛り上がり具合、DIプラスは上がる元気、DIマイナスは下がる元気を表している、とイメージしてください。詳しい計算は知らなくても大丈夫です。

Q.勝つ回数が少なくても、もうかるって本当?

A.本当です。例えば、9回負けて100円ずつ損しても(合計-900円)、1回だけ勝って2000円もうかれば、トータルではプラスになりますよね。大事なのは、勝つ回数よりも「損を小さく、利益を大きく」することなんです。

Q.ETH/USDTってどういう意味?

A.「ETH」はイーサリアムという暗号資産(仮想通貨)の名前です。「USDT」はテザーといって、アメリカのドルと同じくらいの価値を持つように作られた特別なコインです。なので、ETH/USDTは「イーサリアム1枚が、何ドル分のテザーと交換できるか」という値段を表しています。

Q.5分足ってどんな取引?

A.5分足は、5分間の値段の動きを1本の棒グラフ(ローソク足)で表したものです。短い時間で取引のチャンスがたくさん見つかるかもしれませんが、その分、ちょっとした動きにだまされやすいという注意点もあります。

Q.HODLってどういう意味?

A.「HODL(ホドル)」は、暗号資産(仮想通貨)を売らずに、ずっと持ち続けることです。もともとは「HOLD(持つ)」の打ち間違いから生まれた言葉ですが、今では「ガチホ(ガチでホールドする)」のような意味で使われています。

Q.検証に使用した期間と時間足は?

A.5m足で検証しました。期間は記事内の概要をご確認ください。

Q.最終リターンと最大ドローダウンは?

A.最終リターンは-88.07%、最大DDは89.10%です。

Q.勝率やPFはどの程度?

A.勝率は22.43%、プロフィットファクターは0.44です。

Q.HODLとの比較結果は?

A.HODLは162.24%でした。記事内の比較表をご覧ください。

Q.手数料やスリッページは考慮済み?

A.はい。バックテスト設定の手数料・スリッページを損益に反映しています。

Q.市場環境はトレンド/レンジどちらに近かった?

A.期間中はトレンド優勢と推測されます。

Q.この戦略は初心者でも扱える?

A.基礎的な指標と検証環境の知識があれば扱えます。まずは少額・デモから。

Q.推奨のリスク管理は?

A.最大DDを踏まえた損切り・ポジションサイジングと、システム停止基準の設定を推奨します。

Q.将来の結果は期待できる?

A.過去の結果は将来を保証しません。市場環境やパラメータ適合性に大きく依存します。

Q.改良の方向性は?

A.トレンド・ボラティリティのフィルター併用、パラメータの再最適化、取引頻度の制御を検討してください。

著者情報