ビットコイン値段の「波」に乗る作戦! DPOサイクル作戦の結果と反省点
この作戦は、ビットコイン(BTC)の値段の勢いを調べて、いつ「買う」か「売る」かを決める方法です。1時間ごとの値段の動きを見て、約1年半の成績を調べてみました。結果は残念ながら損をしてしまいましたが、この失敗から学べる大切なことがたくさんあります。
導入と前提条件
この作戦は、ビットコイン(BTC)の値段の勢いを調べて、いつ「買う」か「売る」かを決める方法です。1時間ごとの値段の動きを見て、約1年半の成績を調べてみました。結果は残念ながら損をしてしまいましたが、この失敗から学べる大切なことがたくさんあります。
【検証】戦略のバックテスト概要
- 戦略名: DPO Cycle を使用したトレンド追従戦略
- 対象銘柄: BTC/USDT
- 時間足: 1h
- 期間: 2024-02-07〜2025-08-25(564日間)
- 初期資金: $10,000
- 手数料・スリッページ: 0.1% / 0.1%
- 取引所: binance
DPO Cycle の理論的背景
この作戦は、「どんなものの値段も、決まったリズムの波みたいに動くことがある」という考え方が元になっています。DPOという道具は、この波を見つけやすくするために、値段がずっと上がり続けたり下がり続けたりする大きな流れを取り除いてくれます。そうすると、短期的な小さな波の動きがはっきり見えるようになります。この波の一番高いところ(山)や一番低いところ(谷)が、値段の向きが変わるサインになると考えています。
具体的な売買ルール(今回の検証)
エントリー条件
- DPOの波が一番低い「谷」になり、さらにその波が「0」のラインより下にあるとき(値段が一時的に安くなっているとき)に買います。
- (補足:この作戦では、このルールでしか買いません。)
エグジット条件
- DPOの波が一番高い「山」になり、さらにその波が「0」のラインより上にあるとき(値段が一時的に高くなっているとき)に売ります。
- (補足:この作戦では、このルールでしか売りません。)
リスク管理
もし、思ったのと反対に値段が動いてしまったら、損が大きくなる前に取引をやめる「損切り」をします。今回の結果では、最大で73%もお金が減ってしまったので、この損切りはとても大事なルールです。
再現手順(HowTo)
- Python/依存(ccxt, pandas, ta)をインストール
- ccxtでBTC/USDTのOHLCVを取得して前処理
- 『DPO Cycle』に必要な指標を算出(ta 等)
- 閾値・クロス条件から売買シグナルを生成
- 手数料・スリッページを加味して検証・評価
【結果】パフォーマンス
価格の推移
資産の推移
パフォーマンス指標
指標 | 値 |
---|---|
総トレード数 | 383回 |
勝率 | 38.9% |
平均利益 | 1.04% |
平均損失 | -1.13% |
期待値 | -0.29% |
プロフィットファクター | 0.62 |
最大ドローダウン | 73% |
最終リターン | -68.77% |
シャープレシオ | -0.34 |
HODL(Buy&Hold) | 158.88% |
HODL戦略との比較
実装コード(Python)
#!/usr/bin/env python3
"""
DPO(Detrended Price Oscillator)サイクル戦略
トレンドを除去して価格サイクルを検出
"""
import pandas as pd
import numpy as np
def calculate_dpo_signals(df: pd.DataFrame, dpo_period: int = 20) -> pd.DataFrame:
"""
DPOサイクルシグナルを生成
Parameters:
-----------
df : pd.DataFrame
OHLCVデータ
dpo_period : int
DPO計算期間(デフォルト: 20)
Returns:
--------
pd.DataFrame
シグナル列が追加されたDataFrame
"""
df = df.copy()
# 移動平均計算(中心化)
shift_period = int(dpo_period / 2) + 1
df['dpo_ma'] = df['close'].rolling(window=dpo_period).mean().shift(-shift_period)
# DPO計算(現在価格 - シフトされた移動平均)
df['dpo'] = df['close'] - df['dpo_ma'].shift(shift_period)
# DPOの移動平均(スムージング)
df['dpo_smooth'] = df['dpo'].rolling(window=3).mean()
# サイクルの山と谷を検出(未来データを参照しない)
# 前2本と比較して判定
df['dpo_peak'] = (df['dpo_smooth'].shift(1) > df['dpo_smooth'].shift(2)) & (df['dpo_smooth'] < df['dpo_smooth'].shift(1))
df['dpo_trough'] = (df['dpo_smooth'].shift(1) < df['dpo_smooth'].shift(2)) & (df['dpo_smooth'] > df['dpo_smooth'].shift(1))
# シグナル生成(サイクルの谷で買い、山で売り)
df['is_buy'] = df['dpo_trough'] & (df['dpo_smooth'] < 0)
df['is_sell'] = df['dpo_peak'] & (df['dpo_smooth'] > 0)
# NaN値をFalseに置換
df['is_buy'] = df['is_buy'].fillna(False)
df['is_sell'] = df['is_sell'].fillna(False)
print(f"DPOサイクル: 期間={dpo_period}")
print(f"買いシグナル数: {df['is_buy'].sum()}")
print(f"売りシグナル数: {df['is_sell'].sum()}")
return df
なぜこの結果になったのか(3つの理由)
- 1勝てた割合が38.9%と低く、1回の取引で期待できるもうけもマイナスだったので、この作戦はビットコインの1時間ごとの動きには合っていなかったのかもしれません。
- 2「もうけの合計」よりも「損の合計」の方が大きかったため、全体として損をしてしまいました。
- 3売り買いした回数は383回と多かったのですが、一つ一つの取引で少しずつ損が積み重なってしまい、最終的に68.77%という大きなマイナスになってしまいました。
この結果から学べる3つの教訓
- 1この作戦は、値段が大きく動かず、決まった範囲を行ったり来たりしているときにうまくいくことが多いようです。でも、ビットコインがぐんぐん値上がりしているときは、ただずっと持っている(HODL)方が、158.88%ももうかっていました。相場の状況に合わせて作戦を使い分けることが大切だとわかりました。
- 2勝つ割合が低くても、1回で大きくもうけて、損を小さくできれば、全部合わせるとプラスになることもあります。でも、今回の作戦ではそれができませんでした。
- 3どんなに良いと思った作戦でも、必ず結果を確かめることが大切です。うまくいかなかったら、その理由を考えて、やり方を変えていく必要があります。
リスク管理の具体的手法
取引量の決め方
1回の取引で使うお金は、持っているお金全体のほんの少し(例えば100分の1とか2)に決めます。そうすれば、もし損をしても、大きなダメージを受けずにすみます。
損失が大きくなったときの対処法
もし、お金が大きく減ってしまったら(今回の結果では最大73%)、一旦すべての取引をやめます。そして、作戦や設定が本当にこれで良いのか、じっくり見直します。
資金管理の方法
投資に使うお金は、もしなくなっても生活に困らないお金だけにします。一度に全部のお金を失わないように、慎重に管理することが大切です。
改良案の具体的提案
- DPOを計算するときの「期間」の設定を変えて、ビットコインの1時間ごとの波にピッタリ合う設定を探してみます。
- DPOからの「買え!」「売れ!」の合図だけでなく、他の道具(例えば、値段の勢いを示すもの)も一緒に使って、もっと確実なタイミングを見つけます。
- 損が大きくなりすぎないように、「損切り」のルールをもっと厳しくしたり、1回に使うお金の量を調整したりします。
実用性の向上(運用上の注意)
- この作戦は、値段があまり大きく動かないときに試してみるのが良いかもしれません。
- まずは、ほんの少しのお金で試してみて、この作戦がどんな風に動くのかをよく観察することが大切です。
- 実際のお金を使う前に、必ず過去のデータで「もしこの作戦を使っていたらどうなっていたか」をしっかり確かめましょう。
検証の透明性と信頼性
- データの出所: この結果は、2024年2月7日から2025年8月25日までの、ビットコイン(BTC/USDT)の1時間ごとの値段のデータを使って計算しました。
- 検証のやり方: この結果は、「バックテスト」という方法で確かめました。これは、過去のデータを使って「もしこの作戦で売り買いしていたら、結果はどうなっていたかな?」と練習試合をしてみるようなものです。
- コード: この作戦をコンピューターで動かすためのプログラム(設計図のようなもの)は、見られるようになっています。
- 注意事項: このお話は、あくまで過去のデータで試した結果です。未来も同じようにもうかることを保証するものではありません。投資は、自分の判断と責任で行ってくださいね。