SOL/USDTで大損?「値段の勢いをはかる作戦」の、びっくりな結果と学べること
この作戦は、「SOL/USDT」という仮想通貨を5分ごとの値動きで見ながら取引するものです。値段の勢いをはかる「相対スプレッド強度」というモノサシを使いました。でも、結果はとてもひどくて、持っていたお金のほとんどをなくしてしまいました。どうしてこうなったのか、そして、この失敗から何を学べるのかを、わかりやすく説明しますね。
導入と前提条件
この作戦は、「SOL/USDT」という仮想通貨を5分ごとの値動きで見ながら取引するものです。値段の勢いをはかる「相対スプレッド強度」というモノサシを使いました。でも、結果はとてもひどくて、持っていたお金のほとんどをなくしてしまいました。どうしてこうなったのか、そして、この失敗から何を学べるのかを、わかりやすく説明しますね。
【検証】戦略のバックテスト概要
- 戦略名: Relative Spread Strength を使用したトレンド追従戦略
- 対象銘柄: SOL/USDT
- 時間足: 5m
- 期間: 2024-08-13〜2025-08-25(376日間)
- 初期資金: $10,000
- 手数料・スリッページ: 0.1% / 0.1%
- 取引所: bybit
Relative Spread Strength の理論的背景
この作戦の基本的な考え方は、「値段の勢いは、短い時間の動きと長い時間の動きの差ではかれる」というものです。短い時間の値段の動きが、長い時間の平均的な動きからすごく離れると、「すごく元気がいいぞ!」と考えます。そして、その元気のよさが「ふつう」の状態からどれくらい離れているかを数字(相対スプレッド強度)で表します。この数字が大きく動いたり、あるラインをこえたりしたときが、売り買いのチャンスだと考えるんです。例えば、短い時間の値段が急に上がってみんなが買いすぎると「買われすぎ」、急に下がってみんなが売りすぎると「売られすぎ」と判断して、値段が逆に戻るのをねらうイメージです。
具体的な売買ルール(今回の検証)
エントリー条件
- 値段の勢いをはかるモノサシが、マイナスの世界からプラスの世界に入ったとき(勢いが下向きから上向きに変わったしるしです)
- モノサシが「売られすぎだよ!」という低いしるしから、元気よく上向きになったとき
エグジット条件
- 値段の勢いをはかるモノサシが、プラスの世界からマイナスの世界に入ったとき(勢いが上向きから下向きに変わったしるしです)
- モノサシが「買われすぎだよ!」という高いしるしから、元気よく下向きになったとき
リスク管理
この作戦では、残念ながら損を止めるためのハッキリしたルールが、うまく働きませんでした。取引を始めたら、どんどん損が大きくなってしまって、最後にはほとんどのお金がなくなってしまいました。損を小さくするには、もっと早く取引をやめたり、取引する金額をすごく小さくしたりする工夫が必要です。
再現手順(HowTo)
- Python/依存(ccxt, pandas, ta)をインストール
- ccxtでSOL/USDTのOHLCVを取得して前処理
- 『Relative Spread Strength』に必要な指標を算出(ta 等)
- 閾値・クロス条件から売買シグナルを生成
- 手数料・スリッページを加味して検証・評価
【結果】パフォーマンス
価格の推移
資産の推移
パフォーマンス指標
指標 | 値 |
---|---|
総トレード数 | 2012回 |
勝率 | 30.57% |
平均利益 | 0.99% |
平均損失 | -0.99% |
期待値 | -0.38% |
プロフィットファクター | 0.4 |
最大ドローダウン | 99.97% |
最終リターン | -99.96% |
シャープレシオ | -0.58 |
HODL(Buy&Hold) | 40.95% |
HODL戦略との比較
実装コード(Python)
"""
Relative Spread Strength Trading Signal Generator
異なる期間の移動平均スプレッドから強度を測定
"""
import pandas as pd
import numpy as np
def calculate_rss_signals(df: pd.DataFrame,
fast_period: int = 10,
slow_period: int = 40) -> pd.DataFrame:
"""
Relative Spread Strength戦略のシグナル生成
Parameters:
-----------
df : pd.DataFrame
OHLCVデータ
fast_period : int
短期EMA期間(デフォルト: 10)
slow_period : int
長期EMA期間(デフォルト: 40)
Returns:
--------
pd.DataFrame
シグナルが追加されたDataFrame
"""
df = df.copy()
# 指数移動平均
df['ema_fast'] = df['close'].ewm(span=fast_period, adjust=False).mean()
df['ema_slow'] = df['close'].ewm(span=slow_period, adjust=False).mean()
# スプレッド
df['spread'] = df['ema_fast'] - df['ema_slow']
# スプレッドの移動平均と標準偏差
df['spread_ma'] = df['spread'].rolling(window=slow_period).mean()
df['spread_std'] = df['spread'].rolling(window=slow_period).std()
# 相対スプレッド強度(標準化)
df['rss'] = (df['spread'] - df['spread_ma']) / (df['spread_std'] + 0.0001)
# RSSのスムージング
df['rss_smooth'] = df['rss'].ewm(span=3, adjust=False).mean()
# RSSの加速度
df['rss_acceleration'] = df['rss_smooth'] - df['rss_smooth'].shift(1)
# ダイナミックレベル
df['rss_upper'] = 2.0
df['rss_lower'] = -2.0
# トレンド強度
df['trend_strength'] = np.abs(df['rss_smooth'])
# シグナル生成
df['rss_prev'] = df['rss_smooth'].shift(1)
df['is_buy'] = (
((df['rss_smooth'] > 0) & (df['rss_prev'] <= 0)) | # ゼロラインクロス
((df['rss_smooth'] > df['rss_lower']) & (df['rss_prev'] <= df['rss_lower']) &
(df['rss_acceleration'] > 0)) # 売られ過ぎからの反発
) & df['rss_smooth'].notna()
df['is_sell'] = (
((df['rss_smooth'] < 0) & (df['rss_prev'] >= 0)) | # ゼロラインクロス
((df['rss_smooth'] < df['rss_upper']) & (df['rss_prev'] >= df['rss_upper']) &
(df['rss_acceleration'] < 0)) # 買われ過ぎからの反落
) & df['rss_smooth'].notna()
# 不要カラム削除
df.drop(['ema_fast', 'ema_slow', 'spread', 'spread_ma', 'spread_std',
'rss_smooth', 'rss_acceleration', 'rss_upper', 'rss_lower',
'trend_strength', 'rss_prev'], axis=1, inplace=True, errors='ignore')
return df
なぜこの結果になったのか(3つの理由)
- 1値段の勢いをはかるモノサシの計算方法や、売り買いのタイミングを決める基準が、今回の作戦ではうまく働かなかったのかもしれません。そのせいで、ムダな取引をたくさんしてしまい、損が積み重なった可能性があります。
- 2調べた期間(2024年8月〜2025年8月)のSOL/USDTの値段の動きが、この作戦が「こう動くだろう」と考えていた動きとちがったのかもしれません。そのため、勝てる回数がすごく少なくなったと考えられます。
- 3取引の回数が2012回とすごく多いのに、勝てたのは3回に1回くらい(勝率30.57%)でした。これは、ほとんどの取引で損をしていて、その小さな損がたくさん積み重なって、最後にはマイナス99.96%という大きな損になったと考えられます。
この結果から学べる3つの教訓
- 1どんなに良さそうに見える作戦でも、実際に試してみると、思ったのと全然ちがう結果になることがある、ということを学びました。
- 2勝つ回数が少なくても、1回勝ったときにすごく大きな利益が出ればトータルでプラスになることもあります。でも、この作戦では負けが続いてしまったので、最後の結果が悪くなりました。
- 3「最大ドローダウン(一番大きくお金が減ったときの割合)」が99.97%と、ほぼ全部のお金を失うところでした。これは、損を小さくするためのブレーキが、全然きかなかった、ということです。とてもこわいことですね。
リスク管理の具体的手法
取引量の決め方
この作戦には、どれくらいの金額で売り買いするかを決めるハッキリしたルールがありませんでした。そのため、損がどんどんふくらんでしまったと考えられます。本当は、1回の取引で失っても大丈夫な金額(例えば、持っているお金全体の1〜2%)を決めて、その中で取引することが大切です。
損失が大きくなったときの対処法
一番大きく損したときには、お金がほぼ100%なくなってしまいました。これは、損が大きくなったときのストップが、まったくかからなかったということです。損が一定の金額をこえたら、すぐに取引をやめて、それ以上損をしないようにすることがとても重要です。
資金管理の方法
お金の管理で一番大切なのは、なくなっても生活に困らないお金で取引すること、そして1回の取引で失う金額を決めておくことです。この作戦では、それができていなかったので、ほとんど全部のお金を失うという結果になってしまいました。
改良案の具体的提案
- 売り買いのタイミングを決める「基準の数字」を、そのときの状況に合わせて、コンピューターが自動で変えてくれる仕組みを入れると良いかもしれません。
- 損がこれくらいになったら絶対にやめる、というもっとキビシイ「損切り」のルールを作ることが大切です。
- この作戦がうまくいくのは、どんな値段の動きのときなのかを詳しく調べます。そして、その条件に合わないときは取引をしないようにします。
実用性の向上(運用上の注意)
- この作戦をそのままマネするのではなく、まずはとても少ない金額で試したり、過去のデータで「もしやっていたらどうなったか」をしっかり確かめたりして、本当にうまくいくのか確認しましょう。
- 「勝つ回数」だけでなく、「1回勝ったときにもらえる利益」と「1回負けたときに失う損」のバランスも大事です。この作戦は、負けたときの損が積み重なって、結果が悪くなりました。
- 取引の途中で、思ったよりも大きな損が出そうになったら、すぐに取引をやめる勇気も大切です。「負けました」と認めるのはつらいですが、それ以上お金を失わないための、とても重要な判断です。
検証の透明性と信頼性
- データの出所: この説明は、もとになったデータを使って書いています。
- 検証のやり方: もとになったデータと設定を使って、この作戦の成績を計算しました。
- コード: この作戦を動かすためのプログラム(コード)は、見ることができます。
- 注意事項: 昔の成績が良かったからといって、これからも同じようにうまくいくとは限りません。投資は、自分の判断と責任で行いましょう。