値動きの勢いで未来はわかる?ある投資作戦の失敗から学ぼう!
今回は、「モメンタムオシレーター」という、値動きの勢いをはかる道具を使った投資の作戦がどうだったか、その結果をみんなにも分かりやすく説明します。この作戦は、「ソラナ(SOL)」という暗号資産(仮想通貨)で試されました。考え方はとってもシンプルで、「値段が上がる勢いが強ければ買い、下がる勢いが強ければ売る」というものです。
導入と前提条件
今回は、「モメンタムオシレーター」という、値動きの勢いをはかる道具を使った投資の作戦がどうだったか、その結果をみんなにも分かりやすく説明します。この作戦は、「ソラナ(SOL)」という暗号資産(仮想通貨)で試されました。考え方はとってもシンプルで、「値段が上がる勢いが強ければ買い、下がる勢いが強ければ売る」というものです。
【検証】戦略のバックテスト概要
- 戦略名: Momentum Oscillator を使用したトレンド追従戦略
- 対象銘柄: SOL/USDT
- 時間足: 5m
- 期間: 2024-08-04〜2025-08-25(385日間)
- 初期資金: $10,000
- 手数料・スリッページ: 0.1% / 0.1%
- 取引所: okx
Momentum Oscillator の理論的背景
この作戦の根っこにある考え方は、「勢いはしばらく続くことが多い」というものです。もし、値段がグングン上がっていたら、この後もまだ上がるかもしれない。逆に、どんどん下がっていたら、この後もまだ下がるかもしれない。そんなふうに考えます。具体的には、過去10個分の値段と今の値段を比べて勢いを計算し、その勢いの変化をなめらかな線グラフにします。その線が、基準となるゼロのラインを上向きに突き抜けたら「買い」、下向きに突き抜けたら「売り」のサインとしました。つまり、「イケイケだ!」という流れに乗ろうとする作戦なんです。
具体的な売買ルール(今回の検証)
エントリー条件
- 値段の勢いを表すグラフの線が、ゼロのラインを上に突き抜けたとき(上がる勢いが出てきたので買うタイミングです)
- 勢いのグラフが、ゼロのラインよりも上にいるとき(上がる勢いが続いているので買うタイミングです)
エグジット条件
- 値段の勢いを表すグラフの線が、ゼロのラインを下に突き抜けたとき(上がる勢いが弱まってきたので売るタイミングです)
- 勢いのグラフが、ゼロのラインよりも下にいるとき(勢いがなくなってきたので売るタイミングです)
リスク管理
この作戦には、とても大事なルールがありませんでした。それは、「ここまで損したらあきらめて売る(損切り)」というルールです。このルールがなかったので、一度損が出始めると、どこまでも損がふくらんでしまう可能性がありました。最終的に、用意したお金が全部なくなってしまったのは、これが一番大きな原因だと考えられます。大きな損を避けるためには、「損切り」のルールは絶対に必要なんです。
再現手順(HowTo)
- Python/依存(ccxt, pandas, ta)をインストール
- ccxtでSOL/USDTのOHLCVを取得して前処理
- 『Momentum Oscillator』に必要な指標を算出(ta 等)
- 閾値・クロス条件から売買シグナルを生成
- 手数料・スリッページを加味して検証・評価
【結果】パフォーマンス
価格の推移
資産の推移
パフォーマンス指標
指標 | 値 |
---|---|
総トレード数 | 4876回 |
勝率 | 17.99% |
平均利益 | 0.91% |
平均損失 | -0.68% |
期待値 | -0.4% |
プロフィットファクター | 0.35 |
最大ドローダウン | 100% |
最終リターン | -100% |
シャープレシオ | -1.39 |
HODL(Buy&Hold) | 42.01% |
HODL戦略との比較
実装コード(Python)
#!/usr/bin/env python3
"""
モメンタムオシレーター戦略
価格の変化率(モメンタム)でトレンド転換を検出
"""
import pandas as pd
import numpy as np
def calculate_momentum_signals(df: pd.DataFrame, momentum_period: int = 10,
threshold: float = 0.0) -> pd.DataFrame:
"""
モメンタムオシレーターシグナルを生成
Parameters:
-----------
df : pd.DataFrame
OHLCVデータ
momentum_period : int
モメンタム計算期間(デフォルト: 10)
threshold : float
シグナル閾値(デフォルト: 0.0)
Returns:
--------
pd.DataFrame
シグナル列が追加されたDataFrame
"""
df = df.copy()
# モメンタム計算(現在価格 - N期間前価格)
df['momentum'] = df['close'] - df['close'].shift(momentum_period)
# モメンタム変化率(%)
df['momentum_pct'] = (df['momentum'] / df['close'].shift(momentum_period)) * 100
# モメンタムの移動平均(スムージング)
df['momentum_ma'] = df['momentum'].rolling(window=3).mean()
# シグナル生成(ゼロラインクロス)
df['is_buy'] = (
(df['momentum_ma'] > threshold) &
(df['momentum_ma'].shift(1) <= threshold)
)
df['is_sell'] = (
(df['momentum_ma'] < -threshold) &
(df['momentum_ma'].shift(1) >= -threshold)
)
# NaN値をFalseに置換
df['is_buy'] = df['is_buy'].fillna(False)
df['is_sell'] = df['is_sell'].fillna(False)
print(f"モメンタムオシレーター: 期間={momentum_period}, 閾値={threshold}")
print(f"買いシグナル数: {df['is_buy'].sum()}")
print(f"売りシグナル数: {df['is_sell'].sum()}")
return df
なぜこの結果になったのか(3つの理由)
- 1勝った確率が約18%と、とても低かったです。これは、100回取引したら82回は失敗してしまった、ということです。作戦が、値動きの変わり目をうまく見つけられなかったことが分かります。
- 2「期待値」という、1回あたりの取引で平均どれくらい損するか得するかを示す数字が、マイナス0.4%でした。これは、取引を1回するたびに、使ったお金の0.4%ずつ平均して損していた、ということです。つまり、やればやるほどお金が減っていく状態でした。
- 3最終的に用意したお金が全部なくなり(最終損益-100%)、一番損した時も全部なくなっていた(最大DD100%)というのは、「損切り」のような、損がふくらむのを止める仕組みがなかったからだと考えられます。
この結果から学べる3つの教訓
- 1値動きの「勢い」だけに注目しても、うまくいくとは限らないと分かりました。勢いがあるように見えても、急に反対に動くことはよくあります。
- 2取引の回数が4876回とすごく多かったのに、結局お金が全部なくなってしまいました。これは、取引の回数が多ければ良いというわけではない、ということを教えてくれています。むしろ、意味のない取引が多かったのかもしれません。
- 3勝つ確率が低くても、一回でとても大きな利益が出れば、トータルでプラスになることもあります。でも、この作戦は勝つ確率も低く、一回あたりの平均的な結果もマイナスだったので、大きな損につながってしまいました。
リスク管理の具体的手法
取引量の決め方
この作戦では、1回の取引にどれくらいのお金を使うか、というルールが決まっていなかったようです。もし、持っているお金のほとんどを一度の取引で使ってしまうと、失敗した時に大損してしまいます。ふつうは、「1回の取引で損してもいいのは、持っているお金の2%まで」のように決めて、それに合わせて使う金額を調整します。
損失が大きくなったときの対処法
一番お金が減った時(最大DD)に100%になってしまったのは、損がどんどん大きくなっても、それを止める仕組みがなかったからです。例えば、「持っているお金が20%減ったら、一度すべての取引をやめて作戦を見直す」といったルールが必要です。
資金管理の方法
この作戦には、お金をどう守って、どう使っていくかという「資金管理」の考え方がありませんでした。だから、取引を繰り返すうちにお金が減っていき、最後にはゼロになってしまったと考えられます。長く取引を続けるためには、お金を守るためのルールがとても大切です。
改良案の具体的提案
- まず一番大事なのは、「損切り」のルールを入れることです。例えば、「買値から5%下がったら、あきらめて売る」といったルールを決めれば、一度の失敗で大きなお金を失うのを防げます。
- 他の道具(例えば、値段の平均的な動きを示す「移動平均線」など)と組み合わせることで、もっと成功しやすいタイミングが見つかるかもしれません。勢いだけでなく、全体の流れが上向きなのか下向きなのかも見てみましょう。
- 作戦で使う数字(例えば、勢いを計算する期間など)をいろいろ変えて試したり、違う時期のデータでテストしたりすることで、もっと良い結果が出るようになるかもしれません。
実用性の向上(運用上の注意)
- この作戦は、過去のデータで試したら、とても悪い結果になりました。このまま本番のお金で使うのは、すごく危険です。
- もしこの作戦を使いたいなら、必ず「損切り」のルールなどを追加して、うまくいくかどうか、しっかりテストしてからにしてください。そのまま使うと、お金を全部なくす可能性がとても高いです。
- 暗号資産の取引は、値段の動きがとても激しいです。挑戦するときは、必ず「なくなっても生活に困らないお金」で、危険なものだと理解しながらやりましょう。
検証の透明性と信頼性
- データの出所: この作戦は、過去の「ソラナ(SOL)」という暗号資産の5分ごとの値段のデータを使って、うまくいくかどうかをテストしました。
- 検証のやり方: 2024年8月4日から2025年8月25日までの約1年間のデータを使って、「もしこの作戦で取引していたら、どうなっていたか」をコンピューターで試してみました。その結果を分析しています。
- コード: このテストに使われた計算のプログラム(Pythonという言葉で書かれています)は、誰でも見ることができます。
- 注意事項: この結果は、あくまで過去のデータで試したものです。未来も同じようにうまくいくとは限りません。投資には、お金が減ってしまう危険が必ずあります。自分でよく考えて判断してくださいね。