シェア:

ビットコインの「勢い」で挑戦!ある作戦のひみつ

この作戦は、ビットコインが1時間ごとにどう動くかを観察して、「いつ買って、いつ売るか」を見つける方法です。昔のデータを使って、この作戦がどれくらいうまくいくのか試してみました。

取引数
55
勝率
29.09%
最終リターン
-14.67%
最大DD
19.86%

導入と前提条件

この作戦は、ビットコインが1時間ごとにどう動くかを観察して、「いつ買って、いつ売るか」を見つける方法です。昔のデータを使って、この作戦がどれくらいうまくいくのか試してみました。

【検証】戦略のバックテスト概要

  • 戦略名: ROC Momentum を使用したトレンド追従戦略
  • 対象銘柄: BTC/USDT
  • 時間足: 1h
  • 期間: 2025-04-27〜2025-08-25(119日間)
  • 初期資金: $10,000
  • 手数料・スリッページ: 0.1% / 0.1%
  • 取引所: binance

ROC Momentum の理論的背景

この作戦の基本は、「勢いがついたものは、しばらくそのままで進むことが多い」という考え方です。例えば、坂道を転がり始めたボールが、しばらくそのまま転がり続けるのに似ています。ビットコインの値段も、急に上がり始めたら、しばらく上がり続けることが多いと考えられます。この「勢い」を数字にしたものが「ROC」という道具です。この数字がある決まったラインより上になったら「買いの合図」、下になったら「売りの合図」と判断します。さらに、値段の動きの激しさも考えに入れて、もっと上手にタイミングをつかもうとしています。

具体的な売買ルール(今回の検証)

エントリー条件

  • 値段の「勢い」を表す数字が、決めておいた「ここからが買い時!」というラインを、ポンと上回った瞬間に買います。
  • (今回の作戦では、買うときの合図はこれだけです)

エグジット条件

  • 値段の「勢い」を表す数字が、決めておいた「勢いが弱まった」というラインを、スッと下回った瞬間に売ります。
  • (今回の作戦では、売るときの合図はこれだけです)

リスク管理

もし予想と反対に値段が動いて損をしそうになったら、すぐに売り買いをやめて、損が大きくならないようにします。この作戦では、そのルールが自動で働くようになっているので、大きな失敗を防ぎやすくなっています。

再現手順(HowTo)

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

【結果】パフォーマンス

価格の推移

価格推移

資産の推移

資産推移

パフォーマンス指標

指標
総トレード数55回
勝率29.09%
平均利益2.01%
平均損失-1.2%
期待値-0.27%
プロフィットファクター0.67
最大ドローダウン19.86%
最終リターン-14.67%
シャープレシオ-0.31
HODL(Buy&Hold)20.28%

HODL戦略との比較

HODL戦略との比較

実装コード(Python)

strategy.py
#!/usr/bin/env python3
"""
ROC(Rate of Change)モメンタム戦略
価格変化率でモメンタムを測定
"""
import pandas as pd
import numpy as np


def calculate_roc_signals(df: pd.DataFrame, roc_period: int = 12, 
                         threshold: float = 0.0) -> pd.DataFrame:
    """
    ROCモメンタムシグナルを生成
    
    Parameters:
    -----------
    df : pd.DataFrame
        OHLCVデータ
    roc_period : int
        ROC計算期間(デフォルト: 12)
    threshold : float
        シグナル閾値(デフォルト: 0.0)
    
    Returns:
    --------
    pd.DataFrame
        シグナル列が追加されたDataFrame
    """
    df = df.copy()
    
    # ROC計算(価格変化率)
    df['roc'] = ((df['close'] - df['close'].shift(roc_period)) / df['close'].shift(roc_period)) * 100
    
    # ROCの移動平均(スムージング)
    df['roc_ma'] = df['roc'].rolling(window=3).mean()
    
    # ROCの標準偏差(ボラティリティ)
    df['roc_std'] = df['roc'].rolling(window=roc_period).std()
    
    # 動的閾値(ボラティリティ調整)
    df['upper_threshold'] = threshold + df['roc_std']
    df['lower_threshold'] = threshold - df['roc_std']
    
    # シグナル生成
    df['is_buy'] = (
        (df['roc_ma'] > df['upper_threshold']) & 
        (df['roc_ma'].shift(1) <= df['upper_threshold'].shift(1))
    )
    
    df['is_sell'] = (
        (df['roc_ma'] < df['lower_threshold']) & 
        (df['roc_ma'].shift(1) >= df['lower_threshold'].shift(1))
    )
    
    # NaN値をFalseに置換
    df['is_buy'] = df['is_buy'].fillna(False)
    df['is_sell'] = df['is_sell'].fillna(False)
    
    print(f"ROCモメンタム: 期間={roc_period}, 基準閾値={threshold}")
    print(f"買いシグナル数: {df['is_buy'].sum()}")
    print(f"売りシグナル数: {df['is_sell'].sum()}")
    
    return df

なぜこの結果になったのか(3つの理由)

  1. 1今回のテストでは、勝てたのは10回中3回くらいで、全体としては残念ながらマイナスになってしまいました。これは、ビットコインの値段の「勢い」が、いつも思った通りには続かなかった、ということです。
  2. 21回の売り買いで、平均してどれくらい儲かるかという目安の数字もマイナスでした。これは、売り買いを繰り返すほど、少しずつお金が減っていってしまったことを表しています。
  3. 3一番うまくいかなかった時には、持っていたお金が一時的に2割くらい減ってしまったことがありました。これは、一度の失敗で大きく損してしまう可能性があった、ということです。

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

  1. 1値段の「勢い」だけを頼りにするのは、いつでもうまくいくわけではない、ということが分かりました。市場の動きは、もっと複雑なようです。
  2. 2勝つ回数が少なくても、1回勝った時にすごく大きく儲けることができれば、全体でプラスになることもあります。でも、今回はそうはなりませんでした。
  3. 3どんなに良さそうに見える作戦でも、実際に試してみると、思ったような結果にならないことがある、と学びました。だから、しっかりテストすることが大切なんですね。

リスク管理の具体的手法

取引量の決め方

売り買いをするときは、もし失敗しても「これくらいなら大丈夫」と思える金額の範囲でやるのが大切です。例えば、「持っているお金の100分の1だけ使ってみよう」というように、自分でルールを決めておくと安心です。

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

もし思った方向と逆に値段が動いて損が出始めたら、それ以上損が広がらないように、すぐに取引をやめること(損切り)がとても重要です。この作戦でも、上手に損切りする仕組みを考える必要があります。

資金管理の方法

持っているお金全体のうち、1回の売り買いにどれくらいまで使うかを決めておくことです。例えば、「どんなときでも、持っているお金の10分の1以上は使わない」というルールを守れば、一度の失敗で全部のお金をなくしてしまうのを防げます。

改良案の具体的提案

  • 「ここからが買い時!」と判断するラインを、もっと工夫して、より良いタイミングが見つかるように調整してみます。
  • 「勢い」をはかる道具だけでなく、他の道具(例えば、値段の平均的な動きを示す線など)も一緒に使って、もっと確かな「合図」を見つけられるようにします。
  • 「これ以上損したらやめる」というルールを、もっと早めに、そして厳しく設定して、一度の失敗で失うお金を減らすようにします。

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

  • もしこの作戦を実際に使ってみたくなったら、まずはとても少ない金額で試して、本当に思った通りに動くかを確認してみましょう。
  • ビットコインの値段は、急に大きく動くことがあります。だから、いつも最新のニュースをチェックして、無理のない範囲で楽しむことが大切です。
  • このテスト結果は、あくまで昔のデータで試したものです。未来も同じようにうまくいくという保証はありません。色々なやり方を勉強して、自分に合った方法を見つけるのが一番です。

検証の透明性と信頼性

  • データの出所: このテストに使ったのは、過去のビットコインの1時間ごとの値段のデータです。
  • 検証のやり方: コンピューターのプログラムを使って、過去のある期間(このテストでは約4ヶ月間)のデータで、この作戦がどれくらい儲かったか、または損をしたかを計算しました。
  • コード: このテストに使ったプログラムの設計図は、誰でも見られるように公開されています。
  • 注意事項: これは昔のデータを使ったテストの結果であって、将来も必ず儲かることを約束するものではありません。お金をどう使うかは、自分でよく考えて決めてくださいね。特に、ビットコインのようなデジタルなお金は、値段の動きがとても激しいので、注意が必要です。

よくある質問

Q.「ROCモメンタム戦略」って、結局どんな作戦なの?

A.ビットコインの値段が、どれくらいのスピードで上がったり下がったりしているか、その「勢い」を見て、「今だ!」というタイミングで売り買いする作戦のことだよ。勢いが強いときに乗っかって、弱くなったら降りる、というイメージだね。

Q.「勝率29.09%」って、どういうこと?

A.これは、100回売り買いしたら、29回くらいしか勝てなかった(儲からなかった)という意味だよ。だいたい3回に1回も勝てていない計算だね。だから、負けたときの損をいかに小さくするかが大事になってくるんだ。

Q.「期待値」とか「PF」って何?

A.どっちも、その作戦が全体として儲かるかどうかを調べるための成績表みたいなものだよ。「期待値」は、1回売り買いするごとに、平均でどれくらいプラスかマイナスかを示しているんだ。「PF」は、儲かった合計金額が、損した合計金額の何倍になっているかを示しているよ。

Q.「最大DD(ドローダウン)」って、なんだか怖そう…

A.これは、この作戦を続けている中で、一番お金が減ってしまったときの金額の割合のことだよ。例えば、一番調子が良かったときから、一時的にどれくらい元手が減ってしまったか、ということ。この数字が大きいと、ドキドキしちゃうかもしれないから、注意が必要なサインなんだ。

Q.この作戦、これから使っても大丈夫?

A.このテストは昔のデータでやったことだから、未来も同じ結果になるとは限らないんだ。市場の様子はいつも変わっていくからね。もし試すなら、まずは失っても困らない少ないお金でやってみたり、他の作戦と組み合わせたりする工夫が必要だよ。

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

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

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

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

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

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

Q.HODLとの比較結果は?

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

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

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

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

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

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

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

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

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

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

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

Q.改良の方向性は?

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

著者情報