ビットコインの動きは予測できる?「ふしぎな動き発見器」で挑戦!
この作戦は、ビットコインの値段の動きが「サイコロをふるような、てきとうな動き」から、どれくらいズレているかを見て、売り買いのタイミングをさがす方法です。5分ごとの値段を見て、短い時間で何度も売り買いしてみました。でも、結果は残念なことに、お金が全部なくなってしまいました…。どうしてこうなったのか、一緒に見ていきましょう。
導入と前提条件
この作戦は、ビットコインの値段の動きが「サイコロをふるような、てきとうな動き」から、どれくらいズレているかを見て、売り買いのタイミングをさがす方法です。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)
- Python/依存(ccxt, pandas, ta)をインストール
- ccxtでBTC/USDTのOHLCVを取得して前処理
- 『Random Walk Index』に必要な指標を算出(ta 等)
- 閾値・クロス条件から売買シグナルを生成
- 手数料・スリッページを加味して検証・評価
【結果】パフォーマンス
価格の推移
資産の推移
パフォーマンス指標
指標 | 値 |
---|---|
総トレード数 | 4733回 |
勝率 | 10.8% |
平均利益 | 0.58% |
平均損失 | -0.51% |
期待値 | -0.4% |
プロフィットファクター | 0.18 |
最大ドローダウン | 100% |
最終リターン | -100% |
シャープレシオ | -2.12 |
HODL(Buy&Hold) | 68.75% |
HODL戦略との比較
実装コード(Python)
"""
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勝てた確率がとても低かった(10回やって1回くらい)ので、ほとんどの売り買いで損をしてしまったみたいです。
- 21回の売り買いで、もうかる金額よりも損する金額の方が平均して大きかったんです。だから、やればやるほどお金が減っていく計算でした。
- 3利益と損失のバランスも悪かったです。損した金額に比べて、もうかった金額がすごく少なかったことを示しています。
この結果から学べる3つの教訓
- 1「ランダムウォーク指数」のような一つの道具だけで、売り買いのタイミングを決めるのは難しいことがあるとわかりました。
- 2勝つ確率が低くても、1回勝ったときにすごく大きな利益を出して、負けるときの損を小さくできれば、全体ではプラスになることもあります。でも、今回の作戦では、そうはなりませんでした。
- 3ただビットコインを買って持っているだけ(これをHODLと言います)の方が、良い結果でした。つまり、何度も売り買いしたことが、逆に損を大きくしてしまったようです。
リスク管理の具体的手法
取引量の決め方
1回の売り買いで使うお金は、持っているお金全体のごく一部(例えば100分の1)にします。こうすれば、もし負けても、全体のお金へのダメージを小さくできます。
損失が大きくなったときの対処法
もし、がまんできる範囲をこえてお金が減ってしまったら、一度お休みするか、「損切り」のルールを発動させます。こうすることで、大失敗を防ぎます。
資金管理の方法
投資に使うお金は、なくなっても生活に困らないお金にすることが基本です。また、利益が出たら少しだけ使う金額を増やしたり、損が出たら減らしたり、状況に合わせてやり方を変えていくことも大切です。
改良案の具体的提案
- 「ランダムウォーク指数」の「ここをこえたら合図!」というラインの設定を変えて、合図の出方や正確さを調整してみます。
- 他の道具(例えば、値段の平均の線など)と組み合わせて、もっと確実な「買い」や「売り」の合図をさがします。
- 「このくらいの損が出たら、必ずやめる」という「損切り」のルールをはっきり決めて、大きな損を防ぐようにします。
実用性の向上(運用上の注意)
- この作戦は短い時間で何度も売り買いしますが、売り買いのたびに手数料がかかるので、その点も忘れないでくださいね。
- 「ランダムウォーク指数」の計算の仕方や、合図を出すラインの設定を変えると、作戦の動きも変わります。色々と試してみるのがおすすめです。
- 昔のデータでうまくいく方法が見つかっても、未来でも同じようにうまくいくとは限りません。まずは少ないお金で試してみて、少しずつ慣れていくのが安全です。
検証の透明性と信頼性
- データの出所: 売り買いの判断には、ビットコインの値段(いつ始まって、一番高くて、一番安くて、いくらで終わったか)や、取引された量のデータを使いました。
- 検証のやり方: 過去のデータ(2024年7月23日から2025年8月25日)を使って、この作戦でどれくらいもうかったか(または損したか)を計算しました。
- コード: どんな計算で売り買いの合図を出しているか、そのプログラム(コード)は誰でも見ることができます。
- 注意事項: この作戦は、昔のデータをもとにした結果です。将来も同じように利益が出ることを約束するものではありません。投資は、自分の判断と責任で行ってくださいね。