イーサリアム(ETH)で挑戦!ある投資の作戦はうまくいったかな?
このお話は、「プロジェクション・オシレーター」という道具を使って、仮想通貨イーサリアム(ETH)をいつ買っていつ売るか、という作戦を試してみた結果レポートです。5分ごとの値動きを見て、2154回も取引しました。さあ、どうなったか見てみましょう!
導入と前提条件
このお話は、「プロジェクション・オシレーター」という道具を使って、仮想通貨イーサリアム(ETH)をいつ買っていつ売るか、という作戦を試してみた結果レポートです。5分ごとの値動きを見て、2154回も取引しました。さあ、どうなったか見てみましょう!
【検証】戦略のバックテスト概要
- 戦略名: Projection Oscillator を使用したトレンド追従戦略
- 対象銘柄: ETH/USDT
- 時間足: 5m
- 期間: 2024-08-22〜2025-08-25(367日間)
- 初期資金: $10,000
- 手数料・スリッページ: 0.1% / 0.1%
- 取引所: binance
Projection Oscillator の理論的背景
この作戦の基本的な考え方は、「物の値段は、だいたい決まった範囲の中で上がったり下がったりすることが多い」というものです。そして、その範囲から大きくはみ出したり、端っこに近づいたりすると、また範囲の中に戻ってきやすい、という性質を使います。例えば、値段がすごく安くなったら(売られすぎ)、そろそろ上がるかも?と考えて買ってみたり、逆にすごく高くなったら(買われすぎ)、そろそろ下がるかも?と考えて売ってみたりします。
具体的な売買ルール(今回の検証)
エントリー条件
- 「値段の勢い」を示す線の数字が20より下だったのに、20をこえたら買う。
- 「値段の勢い」を示す線が、その平均の線よりも下にあったのに、それを上回ったら買う。(ただし、勢いが50より弱いときだけです)
エグジット条件
- 「値段の勢い」を示す線の数字が80より上だったのに、80を下回ったら売って取引を終える。
- 「値段の勢い」を示す線が、その平均の線よりも上(勢いが50より強いとき)にあったのに、それを下回ったら売って取引を終える。
リスク管理
もし予想が外れても、大損しないためのルールが「損切り」です。「これ以上損したら、あきらめて売る」という値段をあらかじめ決めておきます。こうすることで、被害を最小限におさえることができます。一回で大儲けを狙うのではなく、小さな勝ちを積み重ねることを目指します。
再現手順(HowTo)
- Python/依存(ccxt, pandas, ta)をインストール
- ccxtでETH/USDTのOHLCVを取得して前処理
- 『Projection Oscillator』に必要な指標を算出(ta 等)
- 閾値・クロス条件から売買シグナルを生成
- 手数料・スリッページを加味して検証・評価
【結果】パフォーマンス
価格の推移
資産の推移
パフォーマンス指標
指標 | 値 |
---|---|
総トレード数 | 2154回 |
勝率 | 24.28% |
平均利益 | 0.53% |
平均損失 | -0.69% |
期待値 | -0.39% |
プロフィットファクター | 0.2 |
最大ドローダウン | 99.98% |
最終リターン | -99.98% |
シャープレシオ | -0.8 |
HODL(Buy&Hold) | 78.21% |
HODL戦略との比較
実装コード(Python)
"""
Projection Oscillator Trading Signal Generator
価格投影バンドに基づくオシレーター
"""
import pandas as pd
import numpy as np
def calculate_projection_signals(df: pd.DataFrame,
period: int = 14,
smooth: int = 3) -> pd.DataFrame:
"""
Projection Oscillator戦略のシグナル生成
Parameters:
-----------
df : pd.DataFrame
OHLCVデータ
period : int
投影期間(デフォルト: 14)
smooth : int
平滑化期間(デフォルト: 3)
Returns:
--------
pd.DataFrame
シグナルが追加されたDataFrame
"""
df = df.copy()
# 線形回帰による投影バンド
df['period_high'] = df['high'].rolling(window=period).max()
df['period_low'] = df['low'].rolling(window=period).min()
# 投影上限と下限
df['proj_upper'] = df['period_high']
df['proj_lower'] = df['period_low']
# 中心線
df['proj_center'] = (df['proj_upper'] + df['proj_lower']) / 2
# バンド幅
df['proj_width'] = df['proj_upper'] - df['proj_lower']
# Projection Oscillator(現在価格の相対位置)
df['po_raw'] = ((df['close'] - df['proj_lower']) / (df['proj_width'] + 0.0001)) * 100
# スムージング
df['po'] = df['po_raw'].rolling(window=smooth).mean()
# POの移動平均
df['po_ma'] = df['po'].rolling(window=period).mean()
# シグナル生成
df['po_prev'] = df['po'].shift(1)
df['is_buy'] = (
((df['po'] > 20) & (df['po_prev'] <= 20)) | # 売られ過ぎからの反発
((df['po'] > df['po_ma']) & (df['po_prev'] <= df['po_ma']) & (df['po'] < 50)) # MAクロス(下半分)
) & df['po'].notna()
df['is_sell'] = (
((df['po'] < 80) & (df['po_prev'] >= 80)) | # 買われ過ぎからの反落
((df['po'] < df['po_ma']) & (df['po_prev'] >= df['po_ma']) & (df['po'] > 50)) # MAクロス(上半分)
) & df['po'].notna()
# 不要カラム削除
df.drop(['period_high', 'period_low', 'proj_upper', 'proj_lower', 'proj_center',
'proj_width', 'po_raw', 'po_ma', 'po_prev'], axis=1, inplace=True, errors='ignore')
return df
なぜこの結果になったのか(3つの理由)
- 1勝った確率が約24%と低かったのは、たぶん「今がチャンス!」という合図が出たのに、すぐに値段が反対に動いてしまうことが多かったからだと思います。
- 2最終的に99.98%も損してしまったのは、勝ったときの儲けよりも、負けたときの一回の損がとても大きかったからだと考えられます。
- 3持っていたお金がほとんど無くなりそうになるくらい大きく損してしまったのは、「損切り」のルールがうまく働かなかったか、損切りするまでの値段の幅が大きすぎたのかもしれません。
この結果から学べる3つの教訓
- 1「今がチャンス!」という合図が出ても、その通りに値段が動くとは限らない、ということを学びました。
- 2何回勝ったか、という回数だけでなく、一回ごとの「勝ちの大きさ」と「負けの大きさ」のバランスが、最終的にプラスになるためにすごく大事だとわかりました。
- 3「これは良い作戦だ!」と思っても、実際にやってみるとうまくいかないことがあります。そして、なぜダメだったのかを考えることが、次に繋がるんだと学びました。
リスク管理の具体的手法
取引量の決め方
一回の取引で使うお金は、持っているお金全部ではなく、ほんの少し(例えば1000円持っていたら10円とか20円)だけにするルールです。もし負けても、ダメージが少なくてすみます。
損失が大きくなったときの対処法
もし損が続いて、持っているお金が一定の金額より減ってしまったら、「今日はもうやめよう」と取引をストップするルールを作ります。これで、ヤケになって大失敗するのを防げます。
資金管理の方法
持っているお金の管理方法です。取引に使うお金と、使わないお金をちゃんと分けておきます。もし儲かったら、その一部は使わずに取っておくなど、コツコツとお金を管理することが大切です。
改良案の具体的提案
- 「買え」や「売れ」の合図が出た後、もし思った通りに値段が動かなかったら、すぐに取引をやめるという新しいルールを追加します。
- 「値段の勢い」を見る道具だけでなく、他の道具(例えば、全体の流れが上がり調子か下がり調子かを見る道具など)も組み合わせて、もっと確実なチャンスのときだけ取引するようにします。
- 損切りする値段の幅や、一回の取引に使うお金の量をしっかり決めて、大きな損をしないように、もっと厳しくルールを守るようにします。
実用性の向上(運用上の注意)
- この結果は、あくまで昔のデータで試したものです。未来も同じ結果になるとは限りません。
- 本当に自分のお金で取引する前に、まずはゲームのお金で練習したり、すごく少ない金額で試したりすることがとても大事です。
- 取引を始めた後も、ニュースを見たりして世の中の動きに気を配りましょう。もし状況が変わったら、作戦を変える勇気も必要です。
検証の透明性と信頼性
- データの出所: このテストで使ったのは、イーサリアム(ETH)という仮想通貨の、5分ごとの実際の値段のデータです。
- 検証のやり方: 昔の値段のデータを使って、この作戦通りに売買したら、いくら儲かったり損したりしたかをコンピューターで計算しました。
- コード: この作戦をコンピューターにやらせるための命令文(プログラムコード)は、誰でも見られるように公開されています。
- 注意事項: このレポートは、投資の勉強や研究のためのものです。これを読んで「よし、投資しよう!」とすぐに行動することはお勧めしません。投資は、自分の判断と責任で行うものです。昔うまくいったからといって、将来もうまくいくとは限りません。