シェア:

ビットコイン値段の「波」に乗る作戦! DPOサイクル作戦の結果と反省点

この作戦は、ビットコイン(BTC)の値段の勢いを調べて、いつ「買う」か「売る」かを決める方法です。1時間ごとの値段の動きを見て、約1年半の成績を調べてみました。結果は残念ながら損をしてしまいましたが、この失敗から学べる大切なことがたくさんあります。

取引数
383
勝率
38.90%
最終リターン
-68.77%
最大DD
73.00%

導入と前提条件

この作戦は、ビットコイン(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)

  1. Python/依存(ccxt, pandas, ta)をインストール
  2. ccxtでBTC/USDTのOHLCVを取得して前処理
  3. 『DPO Cycle』に必要な指標を算出(ta 等)
  4. 閾値・クロス条件から売買シグナルを生成
  5. 手数料・スリッページを加味して検証・評価

【結果】パフォーマンス

価格の推移

価格推移

資産の推移

資産推移

パフォーマンス指標

指標
総トレード数383回
勝率38.9%
平均利益1.04%
平均損失-1.13%
期待値-0.29%
プロフィットファクター0.62
最大ドローダウン73%
最終リターン-68.77%
シャープレシオ-0.34
HODL(Buy&Hold)158.88%

HODL戦略との比較

HODL戦略との比較

実装コード(Python)

strategy.py
#!/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. 1勝てた割合が38.9%と低く、1回の取引で期待できるもうけもマイナスだったので、この作戦はビットコインの1時間ごとの動きには合っていなかったのかもしれません。
  2. 2「もうけの合計」よりも「損の合計」の方が大きかったため、全体として損をしてしまいました。
  3. 3売り買いした回数は383回と多かったのですが、一つ一つの取引で少しずつ損が積み重なってしまい、最終的に68.77%という大きなマイナスになってしまいました。

この結果から学べる3つの教訓

  1. 1この作戦は、値段が大きく動かず、決まった範囲を行ったり来たりしているときにうまくいくことが多いようです。でも、ビットコインがぐんぐん値上がりしているときは、ただずっと持っている(HODL)方が、158.88%ももうかっていました。相場の状況に合わせて作戦を使い分けることが大切だとわかりました。
  2. 2勝つ割合が低くても、1回で大きくもうけて、損を小さくできれば、全部合わせるとプラスになることもあります。でも、今回の作戦ではそれができませんでした。
  3. 3どんなに良いと思った作戦でも、必ず結果を確かめることが大切です。うまくいかなかったら、その理由を考えて、やり方を変えていく必要があります。

リスク管理の具体的手法

取引量の決め方

1回の取引で使うお金は、持っているお金全体のほんの少し(例えば100分の1とか2)に決めます。そうすれば、もし損をしても、大きなダメージを受けずにすみます。

損失が大きくなったときの対処法

もし、お金が大きく減ってしまったら(今回の結果では最大73%)、一旦すべての取引をやめます。そして、作戦や設定が本当にこれで良いのか、じっくり見直します。

資金管理の方法

投資に使うお金は、もしなくなっても生活に困らないお金だけにします。一度に全部のお金を失わないように、慎重に管理することが大切です。

改良案の具体的提案

  • DPOを計算するときの「期間」の設定を変えて、ビットコインの1時間ごとの波にピッタリ合う設定を探してみます。
  • DPOからの「買え!」「売れ!」の合図だけでなく、他の道具(例えば、値段の勢いを示すもの)も一緒に使って、もっと確実なタイミングを見つけます。
  • 損が大きくなりすぎないように、「損切り」のルールをもっと厳しくしたり、1回に使うお金の量を調整したりします。

実用性の向上(運用上の注意)

  • この作戦は、値段があまり大きく動かないときに試してみるのが良いかもしれません。
  • まずは、ほんの少しのお金で試してみて、この作戦がどんな風に動くのかをよく観察することが大切です。
  • 実際のお金を使う前に、必ず過去のデータで「もしこの作戦を使っていたらどうなっていたか」をしっかり確かめましょう。

検証の透明性と信頼性

  • データの出所: この結果は、2024年2月7日から2025年8月25日までの、ビットコイン(BTC/USDT)の1時間ごとの値段のデータを使って計算しました。
  • 検証のやり方: この結果は、「バックテスト」という方法で確かめました。これは、過去のデータを使って「もしこの作戦で売り買いしていたら、結果はどうなっていたかな?」と練習試合をしてみるようなものです。
  • コード: この作戦をコンピューターで動かすためのプログラム(設計図のようなもの)は、見られるようになっています。
  • 注意事項: このお話は、あくまで過去のデータで試した結果です。未来も同じようにもうかることを保証するものではありません。投資は、自分の判断と責任で行ってくださいね。

よくある質問

Q.DPOって何ですか?

A.値段の勢いの「波」を見つけやすくするために、値段がずっと上がったり下がったりする大きな流れを取り除いてくれる道具のことです。

Q.「サイクル」ってどういう意味ですか?

A.値段の動きには、決まったリズムで繰り返される波のようなパターンがある、という考え方のことです。

Q.「HODL(ホドル)」って何ですか?

A.英語の言葉を短くしたもので、ビットコインなどを売らずに「ずーっと持ち続ける」という意味で使われます。

Q.勝つ割合が低くても、もうかることはありますか?

A.はい、ありますよ。1回の取引でとても大きくもうけたり、損をするときはとても小さく抑えたりできれば、勝つ回数が少なくても、全体ではプラスになることがあります。

Q.この作戦は、どんなときに使うのが良いですか?

A.値段があまり大きく上がったり下がったりせず、決まった範囲を行ったり来たりしているような相場のときに試してみると、うまくいくかもしれません。

Q.検証に使用した期間と時間足は?

A.1h足で検証しました。期間は記事内の概要をご確認ください。

Q.最終リターンと最大ドローダウンは?

A.最終リターンは-68.77%、最大DDは73.00%です。

Q.勝率やPFはどの程度?

A.勝率は38.90%、プロフィットファクターは0.62です。

Q.HODLとの比較結果は?

A.HODLは158.88%でした。記事内の比較表をご覧ください。

Q.手数料やスリッページは考慮済み?

A.はい。バックテスト設定の手数料・スリッページを損益に反映しています。

Q.市場環境はトレンド/レンジどちらに近かった?

A.期間中はトレンド優勢と推測されます。

Q.この戦略は初心者でも扱える?

A.基礎的な指標と検証環境の知識があれば扱えます。まずは少額・デモから。

Q.推奨のリスク管理は?

A.最大DDを踏まえた損切り・ポジションサイジングと、システム停止基準の設定を推奨します。

Q.将来の結果は期待できる?

A.過去の結果は将来を保証しません。市場環境やパラメータ適合性に大きく依存します。

Q.改良の方向性は?

A.トレンド・ボラティリティのフィルター併用、パラメータの再最適化、取引頻度の制御を検討してください。

著者情報