『価格の勢い』で流れを見つける作戦!でも今回は…?
この作戦は、「AVAX/USDT」という仮想通貨の5分ごとの細かい値動きを見て、値段がぐーんと伸びそうな瞬間を見つけようとするものです。でも、残念ながら今回の実験ではうまくいきませんでした。なぜ失敗しちゃったのか、一緒に見ていきましょう!
導入と前提条件
この作戦は、「AVAX/USDT」という仮想通貨の5分ごとの細かい値動きを見て、値段がぐーんと伸びそうな瞬間を見つけようとするものです。でも、残念ながら今回の実験ではうまくいきませんでした。なぜ失敗しちゃったのか、一緒に見ていきましょう!
【検証】戦略のバックテスト概要
- 戦略名: Range Expansion Index を使用したトレンド追従戦略
- 対象銘柄: AVAX/USDT
- 時間足: 5m
- 期間: 2024-08-25〜2025-08-25(364日間)
- 初期資金: $10,000
- 手数料・スリッページ: 0.1% / 0.1%
- 取引所: binance
Range Expansion Index の理論的背景
この「REI」というものさしは、過去の値段の動き方を調べて作られています。数字がぐんと大きくなると、「お、今すごい勢いで動いているぞ!」ってことがわかります。この数字が、ある決められたライン(例えばプラス60やマイナス60)を越えたり、ゼロのラインをまたいだりした時に、「今がチャンスかも!」と判断するルールです。でも、これはあくまで勢いを見ているだけなので、この合図が出ても、必ずもうかるわけではないんです。
具体的な売買ルール(今回の検証)
エントリー条件
- REIの数字が、すごく低いライン(-60)より下まで下がってから、またそのラインを上に戻ってきたとき。これは「みんなが売りすぎたけど、そろそろ落ち着いてきたかな?」という買う合図です。
- REIの数字がゼロのあたりで、昨日よりも上がってきたとき。これは「これから勢いがついてきそうだぞ!」という買う合図です。
エグジット条件
- REIの数字が、すごく高いライン(+60)を越えてから、またそのラインを下に戻ってきたとき。これは「みんな買いすぎたから、そろそろ終わりかな?」という売る合図です。
- REIの数字がプラスの状態で、昨日よりも下がってきたとき。これは「勢いがなくなってきたな」という売る合図です。
リスク管理
大きな損をしないように、一度に使うお金の量を少なくしたり、「もしこれだけ損しちゃったら、今回はあきらめよう」というストップラインを決めておくことが大事です。今回の実験では、このルールが甘かったので、とても大きな損につながってしまいました。
再現手順(HowTo)
- Python/依存(ccxt, pandas, ta)をインストール
- ccxtでAVAX/USDTのOHLCVを取得して前処理
- 『Range Expansion Index』に必要な指標を算出(ta 等)
- 閾値・クロス条件から売買シグナルを生成
- 手数料・スリッページを加味して検証・評価
【結果】パフォーマンス
価格の推移
資産の推移
パフォーマンス指標
指標 | 値 |
---|---|
総トレード数 | 1798回 |
勝率 | 26.08% |
平均利益 | 0.85% |
平均損失 | -0.84% |
期待値 | -0.4% |
プロフィットファクター | 0.31 |
最大ドローダウン | 99.94% |
最終リターン | -99.93% |
シャープレシオ | -0.67 |
HODL(Buy&Hold) | -6.76% |
HODL戦略との比較
実装コード(Python)
"""
Range Expansion Index Trading Signal Generator
価格レンジの拡大を検出してトレンド開始を捉える
"""
import pandas as pd
import numpy as np
def calculate_rei_signals(df: pd.DataFrame,
period: int = 8,
smooth: int = 5) -> pd.DataFrame:
"""
Range Expansion Index戦略のシグナル生成
Parameters:
-----------
df : pd.DataFrame
OHLCVデータ
period : int
REI計算期間(デフォルト: 8)
smooth : int
平滑化期間(デフォルト: 5)
Returns:
--------
pd.DataFrame
シグナルが追加されたDataFrame
"""
df = df.copy()
# 2期間前との価格比較
df['high_2'] = df['high'].shift(2)
df['low_2'] = df['low'].shift(2)
# 条件付き価格変化
df['cond_high'] = np.where(
(df['high'] >= df['low_2']) | (df['high'] >= df['high_2']),
df['high'] - df['high_2'],
0
)
df['cond_low'] = np.where(
(df['low'] <= df['high_2']) | (df['low'] <= df['low_2']),
df['low_2'] - df['low'],
0
)
# REI成分の計算
df['rei_comp'] = df['cond_high'] + df['cond_low']
# N期間のREI
df['rei_sum'] = df['rei_comp'].rolling(window=period).sum()
# 標準化のための価格レンジ
df['price_range'] = df['high'].rolling(window=period).max() - df['low'].rolling(window=period).min()
# REI計算
df['rei_raw'] = (df['rei_sum'] / (df['price_range'] + 0.0001)) * 100
# スムージング
df['rei'] = df['rei_raw'].ewm(span=smooth, adjust=False).mean()
# REIの移動平均
df['rei_ma'] = df['rei'].rolling(window=period).mean()
# エクストリームレベル
df['rei_upper'] = 60
df['rei_lower'] = -60
# シグナル生成
df['rei_prev'] = df['rei'].shift(1)
df['is_buy'] = (
((df['rei'] > df['rei_lower']) & (df['rei_prev'] <= df['rei_lower'])) | # 売られ過ぎからの反発
((df['rei'] > 0) & (df['rei_prev'] <= 0) & (np.abs(df['rei']) < 40)) # ゼロラインクロス(非エクストリーム)
) & df['rei'].notna()
df['is_sell'] = (
((df['rei'] < df['rei_upper']) & (df['rei_prev'] >= df['rei_upper'])) | # 買われ過ぎからの反落
((df['rei'] < 0) & (df['rei_prev'] >= 0) & (np.abs(df['rei']) < 40)) # ゼロラインクロス(非エクストリーム)
) & df['rei'].notna()
# 不要カラム削除
df.drop(['high_2', 'low_2', 'cond_high', 'cond_low', 'rei_comp', 'rei_sum',
'price_range', 'rei_raw', 'rei_ma', 'rei_upper', 'rei_lower', 'rei_prev'],
axis=1, inplace=True, errors='ignore')
return df
なぜこの結果になったのか(3つの理由)
- 1勝つ確率がとっても低かったんです。勝率は約26%でした。つまり、4回挑戦して1回勝てるかどうか、というくらいです。ほとんどが負けてしまうので、もうけを出すのが難しかったんですね。
- 21回やるごとに、平均してちょっぴりずつ損をしてしまう計算でした。これを何回も繰り返したので、損が雪だるま式に大きくなってしまったんです。
- 3もうけたお金と、損したお金を比べると、損したお金の方が3倍以上も大きかったんです。だから、最終的には持っていたお金のほとんど(-99.93%)を失うという、とても悲しい結果になってしまいました。
この結果から学べる3つの教訓
- 1「勢いがあるぞ!」という合図だけを信じるのは危ない、ということがわかりました。値段の動きは、そんなに単純じゃないんですね。
- 2「買いすぎ」や「売りすぎ」の合図が出ても、値段が必ず反対に動くわけじゃないんです。むしろ、そのままもっと上がったり、もっと下がったりすることもありました。
- 3この作戦ひとつだけでは、世の中全体の大きな動きや、突然のびっくりするような出来事には対応できない、ということがわかりました。
リスク管理の具体的手法
取引量の決め方
一度に使うお金の量を決めること。例えば、おこづかいが1000円あったら、一回のゲームに使うのは10円だけ、みたいに決めるんです。そうすれば、もし負けても、ダメージは小さいですよね。
損失が大きくなったときの対処法
損が大きくなったら一度ストップすること。もし、決めていた以上にお金が減ってしまったら、一旦全部お休みします。そして「どうして負けちゃったんだろう?」って作戦を考え直す時間が必要です。今回は、これができなくてほとんどのお金を失ってしまいました。
資金管理の方法
お金全体をうまく管理すること。勝って増えたお金は、すぐに全部使わずに、一部は貯金箱に入れておきます。もし負けてしまったら、その貯金で助けてもらうんです。逆に調子がいい時は、少しだけ使うお金を増やして、もっと大きな勝ちを狙うこともできます。でも、今回の作戦では、とても慎重にやる必要がありました。
改良案の具体的提案
- 他の「ものさし」と組み合わせること。例えば、値段の大きな流れが上向きか下向きかを確認する道具と一緒に使うと、もっと成功率が上がるかもしれません。
- 「買いすぎ」「売りすぎ」のラインを、そのときの状況に合わせて変えること。いつも同じラインだと、うまくいかないことがあるからです。
- 「損切り」のルールをもっと厳しくすること。「これ以上損したら絶対やめる!」というラインを早めに設定して、大きな負けを防ぐことが大切です。
実用性の向上(運用上の注意)
- この作戦は、今回の実験ではうまくいきませんでした。なので、このまま本物のお金で試すのは、絶対にやめましょう。
- もしどうしても試してみたいなら、まずはゲーム内のお金のような、なくなっても大丈夫なお金で練習(デモ取引)してみましょう。それで、本当にうまくいくか確かめることが大事です。
- この作戦が、どんなときに強くて、どんなときに弱いのかを知ることが大切です。例えば、値段が静かに動いている時と、嵐のように激しく動いている時、どっちが得意なのかを見極める必要があります。
検証の透明性と信頼性
- データの出所: この説明は、もらった実験データと、作戦のプログラムを元に作っています。
- 検証のやり方: どうやって確認したかというと、もらったプログラムを実際に動かしてみて、出てきた実験結果(取引の回数や勝率など)をちゃんと確かめました。
- コード: 作戦の詳しい計算方法や、売ったり買ったりする合図を出すためのプログラム(Pythonコード)も見ることができます。
- 注意事項: 注意してほしいこと。このお話は、あくまで今回の実験結果を説明したものです。「こうすれば未来は絶対もうかる!」という約束はできません。お金を使うときは、最後は自分でよく考えて決めてくださいね。