シェア:

ビットコインの動きは予測できる?「ふしぎな動き発見器」で挑戦!

この作戦は、ビットコインの値段の動きが「サイコロをふるような、てきとうな動き」から、どれくらいズレているかを見て、売り買いのタイミングをさがす方法です。5分ごとの値段を見て、短い時間で何度も売り買いしてみました。でも、結果は残念なことに、お金が全部なくなってしまいました…。どうしてこうなったのか、一緒に見ていきましょう。

取引数
4733
勝率
10.80%
最終リターン
-100.00%
最大DD
100.00%

導入と前提条件

この作戦は、ビットコインの値段の動きが「サイコロをふるような、てきとうな動き」から、どれくらいズレているかを見て、売り買いのタイミングをさがす方法です。5分ごとの値段を見て、短い時間で何度も売り買いしてみました。でも、結果は残念なことに、お金が全部なくなってしまいました…。どうしてこうなったのか、一緒に見ていきましょう。

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

  • 戦略名: Random Walk Index を使用したトレンド追従戦略
  • 対象銘柄: BTC/USDT
  • 時間足: 5m
  • 期間: 2024-07-23〜2025-08-25(397日間)
  • 初期資金: $10,000
  • 手数料・スリッページ: 0.1% / 0.1%
  • 取引所: binance

Random Walk Index の理論的背景

「ランダムウォーク理論」という考え方があります。これは「株やビットコインの値段の動きは、次どうなるか予測するのがすごく難しい。まるでサイコロを振るみたいに、偶然で決まることが多いんだよ」という考えです。でも、実際の値段の動きは、いつも完全に偶然というわけではありません。ときどき、一つの方向にグーッと強く動いたり、逆にピタッと動きが止まったりします。「ランダムウォーク指数」は、この「偶然じゃないかも?」という特別な動きを見つけようとする道具なんです。具体的には、普段の平均的な値動きの大きさと、今の値動きの大きさを比べて、どれくらい勢いがあるかを調べています。

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

エントリー条件

  • 「買い」の合図が出たら買う(値段が上に大きく動きそうな勢いが、決めたラインをこえたとき)
  • 「売り」の合図が出たら売る(値段が下に大きく動きそうな勢いが、決めたラインをこえたとき)

エグジット条件

  • 利益が出ているときに、反対の合図が出たら、そこで利益を確定させます
  • もし損が出たら、それが大きくなる前にやめます(損切り)。今回は、はっきりした損切りのルールが決まっていませんでしたが、本当はとても大事です

リスク管理

売り買いをするときは、一度にたくさんのお金を使わないことが大切です。もし予想と反対に値段が動いても、持っているお金全体があまり減らないように、1回の売り買いで使うお金の量を少なくします。

再現手順(HowTo)

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

【結果】パフォーマンス

価格の推移

価格推移

資産の推移

資産推移

パフォーマンス指標

指標
総トレード数4733回
勝率10.8%
平均利益0.58%
平均損失-0.51%
期待値-0.4%
プロフィットファクター0.18
最大ドローダウン100%
最終リターン-100%
シャープレシオ-2.12
HODL(Buy&Hold)68.75%

HODL戦略との比較

HODL戦略との比較

実装コード(Python)

strategy.py
"""
Random Walk Index Trading Signal Generator
価格変動がランダムウォークからどれだけ乖離しているかを測定
"""
import pandas as pd
import numpy as np


def calculate_rwi_signals(df: pd.DataFrame,
                         period: int = 14,
                         threshold: float = 1.0) -> pd.DataFrame:
    """
    Random Walk Index戦略のシグナル生成
    
    Parameters:
    -----------
    df : pd.DataFrame
        OHLCVデータ
    period : int
        計算期間(デフォルト: 14)
    threshold : float
        シグナル閾値(デフォルト: 1.0)
    
    Returns:
    --------
    pd.DataFrame
        シグナルが追加されたDataFrame
    """
    df = df.copy()
    
    # ATR計算
    df['h_l'] = df['high'] - df['low']
    df['h_c'] = np.abs(df['high'] - df['close'].shift(1))
    df['l_c'] = np.abs(df['low'] - df['close'].shift(1))
    df['true_range'] = df[['h_l', 'h_c', 'l_c']].max(axis=1)
    df['atr'] = df['true_range'].rolling(window=period).mean()
    
    # RWI High と RWI Low の計算
    df['rwi_high'] = 0.0
    df['rwi_low'] = 0.0
    
    for i in range(2, period + 1):
        # RWI High
        high_move = df['high'] - df['low'].shift(i)
        expected_move = df['atr'] * np.sqrt(i)
        rwi_h = high_move / (expected_move + 0.0001)
        df[f'rwi_h_{i}'] = rwi_h
        
        # RWI Low
        low_move = df['high'].shift(i) - df['low']
        rwi_l = low_move / (expected_move + 0.0001)
        df[f'rwi_l_{i}'] = rwi_l
    
    # 最大値を取得
    rwi_h_cols = [f'rwi_h_{i}' for i in range(2, period + 1)]
    rwi_l_cols = [f'rwi_l_{i}' for i in range(2, period + 1)]
    
    df['rwi_high'] = df[rwi_h_cols].max(axis=1)
    df['rwi_low'] = df[rwi_l_cols].max(axis=1)
    
    # RWI差分
    df['rwi_diff'] = df['rwi_high'] - df['rwi_low']
    
    # 移動平均
    df['rwi_high_ma'] = df['rwi_high'].rolling(window=3).mean()
    df['rwi_low_ma'] = df['rwi_low'].rolling(window=3).mean()
    
    # シグナル生成
    df['rwi_high_prev'] = df['rwi_high_ma'].shift(1)
    df['rwi_low_prev'] = df['rwi_low_ma'].shift(1)
    
    df['is_buy'] = (
        (df['rwi_high_ma'] > threshold) & 
        (df['rwi_high_ma'] > df['rwi_low_ma']) &
        (df['rwi_high_prev'] <= df['rwi_low_prev'])
    ) & df['rwi_high_ma'].notna()
    
    df['is_sell'] = (
        (df['rwi_low_ma'] > threshold) & 
        (df['rwi_low_ma'] > df['rwi_high_ma']) &
        (df['rwi_low_prev'] <= df['rwi_high_prev'])
    ) & df['rwi_low_ma'].notna()
    
    # 不要カラム削除
    drop_cols = ['h_l', 'h_c', 'l_c', 'rwi_diff', 'rwi_high_ma', 'rwi_low_ma',
                 'rwi_high_prev', 'rwi_low_prev'] + rwi_h_cols + rwi_l_cols
    df.drop(drop_cols, axis=1, inplace=True, errors='ignore')
    
    return df

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

  1. 1勝てた確率がとても低かった(10回やって1回くらい)ので、ほとんどの売り買いで損をしてしまったみたいです。
  2. 21回の売り買いで、もうかる金額よりも損する金額の方が平均して大きかったんです。だから、やればやるほどお金が減っていく計算でした。
  3. 3利益と損失のバランスも悪かったです。損した金額に比べて、もうかった金額がすごく少なかったことを示しています。

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

  1. 1「ランダムウォーク指数」のような一つの道具だけで、売り買いのタイミングを決めるのは難しいことがあるとわかりました。
  2. 2勝つ確率が低くても、1回勝ったときにすごく大きな利益を出して、負けるときの損を小さくできれば、全体ではプラスになることもあります。でも、今回の作戦では、そうはなりませんでした。
  3. 3ただビットコインを買って持っているだけ(これをHODLと言います)の方が、良い結果でした。つまり、何度も売り買いしたことが、逆に損を大きくしてしまったようです。

リスク管理の具体的手法

取引量の決め方

1回の売り買いで使うお金は、持っているお金全体のごく一部(例えば100分の1)にします。こうすれば、もし負けても、全体のお金へのダメージを小さくできます。

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

もし、がまんできる範囲をこえてお金が減ってしまったら、一度お休みするか、「損切り」のルールを発動させます。こうすることで、大失敗を防ぎます。

資金管理の方法

投資に使うお金は、なくなっても生活に困らないお金にすることが基本です。また、利益が出たら少しだけ使う金額を増やしたり、損が出たら減らしたり、状況に合わせてやり方を変えていくことも大切です。

改良案の具体的提案

  • 「ランダムウォーク指数」の「ここをこえたら合図!」というラインの設定を変えて、合図の出方や正確さを調整してみます。
  • 他の道具(例えば、値段の平均の線など)と組み合わせて、もっと確実な「買い」や「売り」の合図をさがします。
  • 「このくらいの損が出たら、必ずやめる」という「損切り」のルールをはっきり決めて、大きな損を防ぐようにします。

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

  • この作戦は短い時間で何度も売り買いしますが、売り買いのたびに手数料がかかるので、その点も忘れないでくださいね。
  • 「ランダムウォーク指数」の計算の仕方や、合図を出すラインの設定を変えると、作戦の動きも変わります。色々と試してみるのがおすすめです。
  • 昔のデータでうまくいく方法が見つかっても、未来でも同じようにうまくいくとは限りません。まずは少ないお金で試してみて、少しずつ慣れていくのが安全です。

検証の透明性と信頼性

  • データの出所: 売り買いの判断には、ビットコインの値段(いつ始まって、一番高くて、一番安くて、いくらで終わったか)や、取引された量のデータを使いました。
  • 検証のやり方: 過去のデータ(2024年7月23日から2025年8月25日)を使って、この作戦でどれくらいもうかったか(または損したか)を計算しました。
  • コード: どんな計算で売り買いの合図を出しているか、そのプログラム(コード)は誰でも見ることができます。
  • 注意事項: この作戦は、昔のデータをもとにした結果です。将来も同じように利益が出ることを約束するものではありません。投資は、自分の判断と責任で行ってくださいね。

よくある質問

Q.ランダムウォーク指数って、どうやって計算するの?

A.昔の「値段がどれくらい動いたか」と、今の「値段の動き」を比べて、どれくらい勢いがあるかを計算しているんだよ。

Q.この戦略は、いつ使えばいいの?

A.値段がグーンと大きく動いているときや、逆にピタッと動きが止まっているときに反応しやすいと言われているよ。5分ごと、みたいに短い時間で見るのに向いているんだ。

Q.勝率が低いってことは、全然ダメな戦略なの?

A.そういうわけでもないんだ。勝つ確率が低くても、1回勝ったときにものすごくもうかって、負けるときの損を小さくできれば、全部合わせるとプラスになることもあるんだよ。

Q.ビットコイン以外でも使えるの?

A.理屈の上では使えるよ。ただ、ビットコインと株では値段の動き方が違うから、うまくいくかどうかは、それで試してみないとわからないんだ。

Q.「HODL」って何?なんでこの戦略より成績が良いの?

A.HODL(ホドル)は、ビットコインなどを買ったら、売らないでずーっと持っておくことだよ。今回は、短い時間で何度も売り買いしたことで手数料がかかったり、タイミングが悪かったりして、ただ持っているだけよりも成績が悪くなっちゃったんだと思うよ。

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

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

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

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

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

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

Q.HODLとの比較結果は?

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

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

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

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

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

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

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

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

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

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

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

Q.改良の方向性は?

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

著者情報