ビットコインの値動きの秘密を探ろう!「エルゴディック・オシレーター」って何?
このお話は、ビットコインの「5分ごと」という短い時間の値動きを見て、いつ買っていつ売ればいいかを探す作戦についてです。でも、残念ながら、過去のデータで試してみたら、お金が全部なくなってしまうという結果になりました。この作戦がどんなもので、どうしてうまくいかなかったのか、一緒に見ていきましょう。
導入と前提条件
このお話は、ビットコインの「5分ごと」という短い時間の値動きを見て、いつ買っていつ売ればいいかを探す作戦についてです。でも、残念ながら、過去のデータで試してみたら、お金が全部なくなってしまうという結果になりました。この作戦がどんなもので、どうしてうまくいかなかったのか、一緒に見ていきましょう。
【検証】戦略のバックテスト概要
- 戦略名: Ergodic Oscillator を使用したトレンド追従戦略
- 対象銘柄: BTC/USDT
- 時間足: 5m
- 期間: 2024-05-20〜2025-08-25(462日間)
- 初期資金: $10,000
- 手数料・スリッページ: 0.1% / 0.1%
- 取引所: okx
Ergodic Oscillator の理論的背景
この作戦の基本的な考え方は、「値動きの勢い」と「値動きの大きさ」の2つを見ることです。まず、値段がどれくらい変わったかを計算します。次に、その動きをなめらかにした線(移動平均線といいます)を使って、短い期間の勢いと長い期間の勢いを比べます。こうして計算してできた特別な数値が「エルゴディック・オシレーター」です。この数値がマイナスからプラスに変わったら「買い」、プラスからマイナスに変わったら「売り」のサインと考えます。さらに、このサインを分かりやすくするためのもう一本の線(シグナルライン)との差を見ることも大切です。
具体的な売買ルール(今回の検証)
エントリー条件
- 2本の線の差を表すグラフが、マイナスからプラスに変わった瞬間に「買い」のサインとします。
- 逆に、プラスからマイナスに変わった瞬間に「売り」のサインとします。
エグジット条件
- 買った後、もし値段が下がり始めたら、損が大きくならないうちに取引をやめます(これを損切りといいます)。
- 売った後、もし値段が上がり始めたら、同じように損が大きくならないうちに取引をやめます。
リスク管理
投資では、損をできるだけ小さくすることがとても大切です。この作戦では、もし予想と違う方向に値段が動いてしまっても、決めておいた金額以上の損が出ないように、必ず途中で取引をやめる「損切り」というルールを守ることが重要です。また、1回の取引に使うお金を、持っているお金のほんの一部にすることも、大きな失敗を防ぐために役立ちます。
再現手順(HowTo)
- Python/依存(ccxt, pandas, ta)をインストール
- ccxtでBTC/USDTのOHLCVを取得して前処理
- 『Ergodic Oscillator』に必要な指標を算出(ta 等)
- 閾値・クロス条件から売買シグナルを生成
- 手数料・スリッページを加味して検証・評価
【結果】パフォーマンス
価格の推移
資産の推移
パフォーマンス指標
指標 | 値 |
---|---|
総トレード数 | 10806回 |
勝率 | 8.25% |
平均利益 | 0.44% |
平均損失 | -0.47% |
期待値 | -0.4% |
プロフィットファクター | 0.07 |
最大ドローダウン | 100% |
最終リターン | -100% |
シャープレシオ | -3.99 |
HODL(Buy&Hold) | 67.67% |
HODL戦略との比較
実装コード(Python)
"""
Ergodic Oscillator Trading Signal Generator
True Strength Indexの変形版でトレンド強度を測定
"""
import pandas as pd
import numpy as np
def calculate_ergodic_signals(df: pd.DataFrame,
short_period: int = 5,
long_period: int = 14,
signal_period: int = 5) -> pd.DataFrame:
"""
Ergodic Oscillator戦略のシグナル生成
Parameters:
-----------
df : pd.DataFrame
OHLCVデータ
short_period : int
短期EMA期間(デフォルト: 5)
long_period : int
長期EMA期間(デフォルト: 14)
signal_period : int
シグナルライン期間(デフォルト: 5)
Returns:
--------
pd.DataFrame
シグナルが追加されたDataFrame
"""
df = df.copy()
# 価格変化
df['change'] = df['close'] - df['close'].shift(1)
# 絶対値変化
df['abs_change'] = np.abs(df['change'])
# 第1スムージング(短期)
df['change_ema1'] = df['change'].ewm(span=short_period, adjust=False).mean()
df['abs_ema1'] = df['abs_change'].ewm(span=short_period, adjust=False).mean()
# 第2スムージング(長期)
df['change_ema2'] = df['change_ema1'].ewm(span=long_period, adjust=False).mean()
df['abs_ema2'] = df['abs_ema1'].ewm(span=long_period, adjust=False).mean()
# Ergodic Oscillator
df['ergodic'] = (df['change_ema2'] / (df['abs_ema2'] + 0.0001)) * 100
# シグナルライン
df['signal'] = df['ergodic'].ewm(span=signal_period, adjust=False).mean()
# ヒストグラム
df['histogram'] = df['ergodic'] - df['signal']
# シグナル生成
df['hist_prev'] = df['histogram'].shift(1)
df['is_buy'] = (df['histogram'] > 0) & (df['hist_prev'] <= 0) & df['histogram'].notna()
df['is_sell'] = (df['histogram'] < 0) & (df['hist_prev'] >= 0) & df['histogram'].notna()
# 不要カラム削除
df.drop(['change', 'abs_change', 'change_ema1', 'abs_ema1',
'change_ema2', 'abs_ema2', 'hist_prev'], axis=1, inplace=True, errors='ignore')
return df
なぜこの結果になったのか(3つの理由)
- 1取引の回数が1万回以上とすごく多いのですが、勝てたのはたったの8%くらいでした。つまり、ほとんどの取引で負けてしまっていたようです。
- 21回取引するごとに、平均して少しずつお金が減っていく計算でした。これでは、取引すればするほど損がふくらんでしまいます。
- 3最終的に、最初のお金が100%なくなってしまうという結果でした。何もしないでビットコインをずっと持っていたほうが、よっぽど良い結果になっていました。
この結果から学べる3つの教訓
- 1たくさん取引すれば儲かるわけではなく、一つ一つの取引でしっかり勝てることが大事だと分かりました。サインがたくさん出ても、そのサインが当たらなければ意味がないんですね。
- 2「期待値」のような成績をチェックする数字は、その作戦が本当に使えるかどうかを判断するために、とても重要だと改めて感じました。
- 3過去のデータでうまくいかなかった作戦は、そのまま使ってはいけません。設定する数字を変えたり、他の方法と組み合わせたりして、もっと良い方法を探す必要があると学びました。
リスク管理の具体的手法
取引量の決め方
1回の取引で使うお金の量を、持っているお金全体の1%や2%のように、あらかじめ決めておくことです。こうすれば、もし負けてもダメージは小さくなります。
損失が大きくなったときの対処法
もし連続で負けて、お金が一定の金額まで減ってしまったら、それ以上損をしないように、一度すべての取引をお休みすることです。大きな失敗を防ぐためのブレーキになります。
資金管理の方法
取引に使うお金と、普段の生活に使うお金をしっかり分けることです。利益が出たら、その一部は貯金するなど、上手にお金を管理していく計画のことです。
改良案の具体的提案
- 作戦で使う数字(短い期間と長い期間の設定など)を、ビットコインの値動きに合うように、細かく調整してみる。
- この作戦だけでなく、他の分析道具(例えば、移動平均線など)と組み合わせて、ウソのサインにだまされないようにする。
- 5分ごとの短い動きだけでなく、1時間や4時間といった、もっと大きな時間の流れを見て、大きな流れに逆らわないように取引する。
実用性の向上(運用上の注意)
- この作戦は取引の回数がとても多いので、取引のたびにかかる手数料のことも考えないといけません。手数料で利益がなくなってしまう可能性もあります。
- 5分ごとの値動きは、変わりやすく予想が難しいです。急に値段が大きく動くこともあるので、注意が必要です。
- この作戦は、今回のテスト結果がとても悪かったので、もし試すなら、そのまま使ってはいけません。必ず自分で改良して、練習してから、失ってもいいと思える少額で始めるようにしてください。
検証の透明性と信頼性
- データの出所: このテストは、2024年5月20日から2025年8月25日までの、ビットコインの5分ごとの値動きデータを使って行いました。
- 検証のやり方: コンピュータープログラムを使って、過去のデータ上で「もしこの作戦を使っていたらどうなっていたか」という練習試合(バックテスト)をしました。その結果として、勝率などの成績を出しています。
- コード: このテストで使った計算プログラムは公開されています。なので、誰でも同じ結果になるかを確認することができます。
- 注意事項: このお話は、あくまで過去のデータを使ったテストの結果です。未来も同じようにうまくいくとは限りません。投資は、自分のお金が減ってしまうリスクがあるので、最後は自分でよく考えて判断してくださいね。