AIが試した投資の作戦!「ATRトレーリングストップ」をわかりやすく解説します!
AIを使って、イーサリアム(ETH)という人気の仮想通貨で、ある投資の作戦をテストしてみました。使った作戦は「ATRトレーリングストップ」というものです。この作戦で、いつ買っていつ売ればもうかるのか、過去のデータで試した結果を、中学生にもわかるように説明しますね。
導入と前提条件
AIを使って、イーサリアム(ETH)という人気の仮想通貨で、ある投資の作戦をテストしてみました。使った作戦は「ATRトレーリングストップ」というものです。この作戦で、いつ買っていつ売ればもうかるのか、過去のデータで試した結果を、中学生にもわかるように説明しますね。
【検証】戦略のバックテスト概要
- 戦略名: ATR Trailing Stop を使用したトレンド追従戦略
- 対象銘柄: ETH/USDT
- 時間足: 5m
- 期間: 2024-09-29〜2025-08-25(329日間)
- 初期資金: $10,000
- 手数料・スリッページ: 0.1% / 0.1%
- 取引所: binance
ATR Trailing Stop の理論的背景
この作戦の基本的な考え方は、「上がり調子のときはできるだけ長く持ち続けて、下がり始めたらすぐに売って損を小さくする」というものです。逆に、下がり調子のときも同じです。「ATR」という、最近の値段がどれくらい激しく動いたかを示す数字を使います。この数字を参考にして、「この値段まで下がったら取引を終える」というラインを決めます。値段が自分に有利な方に動くと、このラインも一緒に追いかけてくれるので、利益を伸ばしやすくなるんです。
具体的な売買ルール(今回の検証)
エントリー条件
- 値段が、少し前の値段から、そのときの「値段の動きの大きさ」の2倍くらいグーンと上がったら、買うチャンス!と判断します。
- 値段が、少し前の値段から、そのときの「値段の動きの大きさ」の2倍くらいガクンと下がったら、売るチャンス!と判断します。
エグジット条件
- もし買っているときに、値段が下がってきて、決めておいた「ここまで下がったら終わり」というラインを割ってしまったら、取引を終わらせます。
- もし売っているときに、値段が上がってきて、決めておいた「ここまで上がったら終わり」というラインを越えてしまったら、取引を終わらせます。
リスク管理
この作戦では、大きな損をしないように「ATRトレーリングストップ」の仕組みを使います。これは、もし予想と反対に値段が動いてしまったら、自動で取引をストップしてくれるルールです。これによって、一回の取引で失うお金を少なくできます。
再現手順(HowTo)
- Python/依存(ccxt, pandas, ta)をインストール
- ccxtでETH/USDTのOHLCVを取得して前処理
- 『ATR Trailing Stop』に必要な指標を算出(ta 等)
- 閾値・クロス条件から売買シグナルを生成
- 手数料・スリッページを加味して検証・評価
【結果】パフォーマンス
価格の推移
資産の推移
パフォーマンス指標
指標 | 値 |
---|---|
総トレード数 | 354回 |
勝率 | 31.92% |
平均利益 | 2.46% |
平均損失 | -1.44% |
期待値 | -0.2% |
プロフィットファクター | 0.77 |
最大ドローダウン | 62.19% |
最終リターン | -55.07% |
シャープレシオ | -0.08 |
HODL(Buy&Hold) | 76.3% |
HODL戦略との比較
実装コード(Python)
#!/usr/bin/env python3
"""
ATRトレーリングストップ戦略
ATRを使った動的なトレーリングストップでトレンドフォロー
"""
import pandas as pd
import numpy as np
def calculate_atr_signals(df: pd.DataFrame, atr_period: int = 14, atr_multiplier: float = 2.0) -> pd.DataFrame:
"""
ATRトレーリングストップシグナルを生成
Parameters:
-----------
df : pd.DataFrame
OHLCVデータ
atr_period : int
ATR計算期間(デフォルト: 14)
atr_multiplier : float
ATR倍率(デフォルト: 2.0)
Returns:
--------
pd.DataFrame
シグナル列が追加されたDataFrame
"""
df = df.copy()
# True Rangeの計算
df['high_low'] = df['high'] - df['low']
df['high_close'] = np.abs(df['high'] - df['close'].shift(1))
df['low_close'] = np.abs(df['low'] - df['close'].shift(1))
df['true_range'] = df[['high_low', 'high_close', 'low_close']].max(axis=1)
# ATRの計算
df['atr'] = df['true_range'].rolling(window=atr_period).mean()
# ATRトレーリングストップの計算
df['atr_distance'] = df['atr'] * atr_multiplier
# 上昇トレンドと下降トレンドのストップレベル
df['upper_stop'] = df['close'] - df['atr_distance']
df['lower_stop'] = df['close'] + df['atr_distance']
# トレンド方向の判定(シンプルなロジック)
df['trend'] = 0
for i in range(atr_period, len(df)):
if df.loc[df.index[i], 'close'] > df.loc[df.index[i-1], 'close'] + df.loc[df.index[i-1], 'atr_distance']:
df.loc[df.index[i], 'trend'] = 1
elif df.loc[df.index[i], 'close'] < df.loc[df.index[i-1], 'close'] - df.loc[df.index[i-1], 'atr_distance']:
df.loc[df.index[i], 'trend'] = -1
else:
df.loc[df.index[i], 'trend'] = df.loc[df.index[i-1], 'trend']
# シグナル生成(トレンド転換時)
df['is_buy'] = (df['trend'] == 1) & (df['trend'].shift(1) != 1)
df['is_sell'] = (df['trend'] == -1) & (df['trend'].shift(1) != -1)
# NaN値をFalseに置換
df['is_buy'] = df['is_buy'].fillna(False)
df['is_sell'] = df['is_sell'].fillna(False)
# デバッグ情報
print(f"ATR期間: {atr_period}, 倍率: {atr_multiplier}")
print(f"買いシグナル数: {df['is_buy'].sum()}")
print(f"売りシグナル数: {df['is_sell'].sum()}")
return df
なぜこの結果になったのか(3つの理由)
- 1この作戦は、値段が上がり続けたり下がり続けたりする「トレンド」があるときに強いです。でも今回のテスト(354回取引しました)では、はっきりしたトレンドがあまりなく、値段が上がったり下がったりを繰り返す場面が多かったようです。そのため、何度も取引を繰り返してしまい、小さな損が積み重なって勝率が低くなったと考えられます。
- 2勝率が31.92%ということは、10回取引したら約7回は負けてしまったということです。負けが多かったので、最終的にはマイナス55.07%という残念な結果になってしまいました。
- 3もしこの仮想通貨をただずっと持っているだけ(ガチホ)だったら、76.3%のプラスになっていました。それと比べると、今回の作戦の成績は悪かったですね。これは、この作戦が、テストした期間のイーサリアムの動き方には合っていなかったということかもしれません。
この結果から学べる3つの教訓
- 1どんなに良さそうに見える作戦でも、市場の状況によってはうまくいかないことがある、ということを学びました。
- 2勝率が低くても、1回の勝ちでとても大きな利益を出せれば、全体ではプラスになることもあります。(今回は残念ながらそうはなりませんでしたが、そういう作戦もあるんだと知りました。)
- 3実際に自分のお金を使う前に、過去のデータでテストしてみることがすごく大事だとわかりました。そうすれば、その作戦がどんな特徴を持っているかを知ることができます。
リスク管理の具体的手法
取引量の決め方
1回の取引に、自分のお金の何パーセントまで使うか決めることです。例えば「全財産の2%まで」のようにルールを作れば、もし負けても大きなダメージを受けずにすみます。
損失が大きくなったときの対処法
もし負けが続いて、全体のお金がかなり減ってしまったら、一度取引をお休みするルールを決めておくことも大切です。これ以上損が大きくならないようにするためです。
資金管理の方法
取引に使うお金全体をどう管理するか、という考え方です。いくらまでなら損しても大丈夫か考えたり、もうかったお金の一部は貯金するなど、長い目で見てお金が減らないように工夫することです。
改良案の具体的提案
- 損切りラインを決めるための倍率(今回は2倍)を変えてみると、結果が良くなるか試してみる価値はありそうです。
- 値段の大きな流れ(トレンド)が強いときだけ取引するように、他のヒント(例えば移動平均線など)と組み合わせると、もっと勝てるタイミングが見つかるかもしれません。
- イーサリアム以外の仮想通貨で試したり、5分ごとではなく1時間ごとなど、見る時間を変えたりして、この作戦がどんな場面で活躍するのか、もっと調べてみると良いでしょう。
実用性の向上(運用上の注意)
- この作戦は、値段の上がり下がりがはっきりしているときに力を発揮しやすいです。なので、市場全体の様子をよく見てから使うのがおすすめです。
- 損切りラインを決めるための設定を変えるだけで、作戦の成績は大きく変わります。自分に合った設定を見つけるために、色々なパターンで試してみることが大切です。
- AIのテスト結果は、あくまでも過去のデータでのお話です。未来でも同じようにうまくいくとは限りません。これを忘れないでくださいね。
検証の透明性と信頼性
- データの出所: Pythonというプログラミング言語を使って、過去のイーサリアム(ETH/USDT)の値段のデータを使ってテストしました。
- 検証のやり方: テストに使ったプログラムを動かして、決められた期間(2024年9月29日から2025年8月25日)のデータで、この作戦の成績を計算しました。
- コード: このテストに使ったプログラムのコード(設計図)は、見ることができます。
- 注意事項: この結果は、あくまで過去のデータでの話で、将来もうかることを約束するものではありません。投資には、お金が減ってしまうリスクもあります。必ず自分でよく考えて、自分の責任で行ってください。