ビットコインの取引で大失敗? ある作戦の落とし穴から学ぼう!
今回は、ビットコインを5分ごとに売り買いする作戦を試したお話です。でも、この作戦はうまくいかなくて、ものすごく損をしてしまいました。どうして失敗しちゃったのか、この経験から何がわかるのか、一緒に見ていきましょう。
導入と前提条件
今回は、ビットコインを5分ごとに売り買いする作戦を試したお話です。でも、この作戦はうまくいかなくて、ものすごく損をしてしまいました。どうして失敗しちゃったのか、この経験から何がわかるのか、一緒に見ていきましょう。
【検証】戦略のバックテスト概要
- 戦略名: Williams %R を使用したトレンド追従戦略
- 対象銘柄: BTC/USDT
- 時間足: 5m
- 期間: 2024-10-06〜2025-08-25(323日間)
- 初期資金: $10,000
- 手数料・スリッページ: 0.1% / 0.1%
- 取引所: bybit
Williams %R の理論的背景
もう少し詳しく説明しますね。「ウィリアムズ%R」は、最近の値段の中で一番高かった時と、一番安かった時を比べます。そして、今の値段がその中のどのへんにあるかを見るんです。もし一番高い値段に近ければ「買いすぎかも!」、一番安い値段に近ければ「売りすぎかも!」と教えてくれます。この作戦は、そのサインの逆を狙います。「売りすぎ」なら「これ以上は下がらないで、そろそろ上がるかも?」と考えて買い、「買いすぎ」なら「これ以上は上がらないで、そろそろ下がるかも?」と考えて売る、というわけです。
具体的な売買ルール(今回の検証)
エントリー条件
- 「売りすぎ」を示す線より下にグラフが下がって、そのあとまた線より上に戻ってきたら『買い』の合図です。
- 「買いすぎ」を示す線より上にグラフが上がって、そのあとまた線より下に戻ってきたら『売り』の合図です。
エグジット条件
- 買った後、値段が上がってグラフが「買いすぎ」の線を超えたら、売って利益を確定します。
- 売った後、値段が下がってグラフが「売りすぎ」の線より下に行ったら、買い戻して取引を終わりにします。
リスク管理
もし予想と違う方向に値段が動いてしまったら、すぐに取引をやめるのが大事です。これを「損切り」と言います。そうすれば、大きな損を防げます。あと、一度にたくさんのお金を使わずに、少しずつ取引することも大切ですよ。
再現手順(HowTo)
- Python/依存(ccxt, pandas, ta)をインストール
- ccxtでBTC/USDTのOHLCVを取得して前処理
- 『Williams %R』に必要な指標を算出(ta 等)
- 閾値・クロス条件から売買シグナルを生成
- 手数料・スリッページを加味して検証・評価
【結果】パフォーマンス
価格の推移
資産の推移
パフォーマンス指標
指標 | 値 |
---|---|
総トレード数 | 2455回 |
勝率 | 12.67% |
平均利益 | 0.23% |
平均損失 | -0.48% |
期待値 | -0.39% |
プロフィットファクター | 0.07 |
最大ドローダウン | 99.99% |
最終リターン | -99.99% |
シャープレシオ | -1.4 |
HODL(Buy&Hold) | 81.24% |
HODL戦略との比較
実装コード(Python)
#!/usr/bin/env python3
"""
ウィリアムズ%R戦略
価格の相対的位置で買われすぎ・売られすぎを判定
"""
import pandas as pd
import numpy as np
def calculate_williams_r_signals(df: pd.DataFrame, period: int = 14,
oversold: float = -80, overbought: float = -20) -> pd.DataFrame:
"""
ウィリアムズ%Rシグナルを生成
Parameters:
-----------
df : pd.DataFrame
OHLCVデータ
period : int
計算期間(デフォルト: 14)
oversold : float
売られすぎ水準(デフォルト: -80)
overbought : float
買われすぎ水準(デフォルト: -20)
Returns:
--------
pd.DataFrame
シグナル列が追加されたDataFrame
"""
df = df.copy()
# Williams %R計算
highest_high = df['high'].rolling(window=period).max()
lowest_low = df['low'].rolling(window=period).min()
df['williams_r'] = -100 * ((highest_high - df['close']) / (highest_high - lowest_low))
# シグナル生成
df['is_buy'] = (
(df['williams_r'] < oversold) &
(df['williams_r'].shift(1) >= oversold)
)
df['is_sell'] = (
(df['williams_r'] > overbought) &
(df['williams_r'].shift(1) <= overbought)
)
# NaN値をFalseに置換
df['is_buy'] = df['is_buy'].fillna(False)
df['is_sell'] = df['is_sell'].fillna(False)
print(f"Williams %R: 期間={period}, 売られすぎ={oversold}, 買われすぎ={overbought}")
print(f"買いシグナル数: {df['is_buy'].sum()}")
print(f"売りシグナル数: {df['is_sell'].sum()}")
return df
なぜこの結果になったのか(3つの理由)
- 1この作戦は、値段が上がったり下がったりを繰り返すことを期待していました。でも実際には、値段が一つの方向にずっと動き続けることが多くて、うまく利益を出せませんでした。
- 2100回取引しても勝てたのは13回くらいで、ほとんどが負けでした。これでは、お金が増えるはずがありません。
- 3この作戦は、やればやるほどお金が減ってしまう仕組みになっていました。作戦そのものに問題があったようです。
この結果から学べる3つの教訓
- 1すごい専門家が考えたような作戦でも、必ずうまくいくわけじゃないんだ、とわかりました。
- 2うまくいかなかった時は、「なんでだろう?」と原因をしっかり考えて、次に活かすことが大切です。
- 3「買いすぎ」とか「売りすぎ」というサインだけで判断するのは、とても危ないことがあると学びました。
リスク管理の具体的手法
取引量の決め方
一度の取引で使うお金は、持っているお金全部の、ほんの少しだけ(例えば100分の1とか)にしましょう。そうすれば、もし負けても失うお金は少なくてすみます。
損失が大きくなったときの対処法
もし、損した金額が持っているお金の1割くらいになったら、いったん取引をお休みしましょう。そして、作戦が本当にこれでいいのか、もう一度じっくり考え直す時間を作ることが大事です。
資金管理の方法
取引で増えたお金は、全部を次の取引に使わずに、一部は貯金したり、もっと安全なものに使うなど、大切に管理しましょう。
改良案の具体的提案
- この道具だけでなく、他の道具(例えば、値段の平均を見る『移動平均線』など)も一緒に使って、もっと確実なサインが出たときだけ取引するようにします。
- 「これ以上損したらやめる」というルールをもっと厳しくします。小さな損で早くやめれば、大きな失敗を防げます。
- いつでもこの作戦を使うのではなく、市場の雰囲気がいい時だけ使うなど、タイミングを考えることも大切です。
実用性の向上(運用上の注意)
- この作戦を試してみたくなったら、まずは練習用の偽のお金で試すか、すごく少ない金額から始めてみましょう。
- 取引をしたら、勝ち負けをノートに記録しておきましょう。後で見返すと、どうしてうまくいったのか、どうして失敗したのかがわかって勉強になります。
- 世の中で何が起きているか、ニュースを見るのも大切です。大きな事件が値段に影響することもありますからね。
検証の透明性と信頼性
- データの出所: このお話で使ったのは、過去のビットコインが実際にどう動いたかの記録データです。
- 検証のやり方: 過去のデータを使って、『もしこの作戦を昔やっていたら、どうなっていたかな?』というコンピューターでの実験(シミュレーション)をしました。
- コード: この実験で使ったコンピューターのプログラムは、誰でも見られるように公開されています。
- 注意事項: このお話は、投資をオススメするものではありません。実際にお金の取引をするときは、自分でよく考えて、自分の責任で行ってください。昔うまくいったからといって、未来もうまくいくとは限りません。