ビットコインの値段が大きく動いた時をねらった作戦、でも残念な結果に
ビットコインの値段が、急に上がりすぎたり、下がりすぎたりした時、「そろそろ元に戻るだろう」と考えて取引する作戦があります。でも、実際に試してみたら、残念ながらうまくいきませんでした。どうして失敗したのか、そこから何を学べるのかを一緒に見ていきましょう。
導入と前提条件
ビットコインの値段が、急に上がりすぎたり、下がりすぎたりした時、「そろそろ元に戻るだろう」と考えて取引する作戦があります。でも、実際に試してみたら、残念ながらうまくいきませんでした。どうして失敗したのか、そこから何を学べるのかを一緒に見ていきましょう。
【検証】戦略のバックテスト概要
- 戦略名: Funding Rate Extreme を使用したトレンド追従戦略
- 対象銘柄: BTC/USDT
- 時間足: 5m
- 期間: 2024-08-25〜2025-08-25(364日間)
- 初期資金: $10,000
- 手数料・スリッページ: 0.1% / 0.1%
- 取引所: binance
Funding Rate Extreme の理論的背景
この作戦の土台になっているのは、「平均回帰(へいきんかいき)」という考え方です。これは、モノの値段がいつもの平均的な値段から大きく離れたら、いずれ平均に戻ってくるだろう、という考えです。例えば、みんなが急に買い始めて値段がすごく上がっても、いつかは落ち着いて元の値段に近づく、というイメージです。この作戦では、「Zスコア」というものさしを使って、値段が平均からどれくらい離れているかを測ります。このスコアが一定のラインを超えたら、「今がチャンス!」と判断して取引を始めるルールにしました。たくさんの人が取引しているかどうかも、ちゃんと見ています。
具体的な売買ルール(今回の検証)
エントリー条件
- 値段がいつもの平均よりすごく安くなって、しかもたくさんの人が取引している時に、「これから上がるかも!」と予想して「買う」という注文をします。
- 値段がいつもの平均よりすごく高くなって、しかもたくさんの人が取引している時に、「これから下がるかも!」と予想して「売る」という注文をします。
エグジット条件
- 買った後は、値段が上がって利益が出たら、または、値段が下がって決めておいた以上の損が出そうになったら、取引を終わらせます。
- 売った後は、値段が下がって利益が出たら、または、値段が上がって決めておいた以上の損が出そうになったら、取引を終わらせます。
リスク管理
どんな取引でも、損をしないためのルールはとても大事です。この作戦では、1回の取引で損しても大丈夫な金額を決めておきます。もし予想が外れても、その金額以上の損が出ないように、自動で取引をやめる「損切り」というルールも設定しておくことが大切です。
再現手順(HowTo)
- Python/依存(ccxt, pandas, ta)をインストール
- ccxtでBTC/USDTのOHLCVを取得して前処理
- 『Funding Rate Extreme』に必要な指標を算出(ta 等)
- 閾値・クロス条件から売買シグナルを生成
- 手数料・スリッページを加味して検証・評価
【結果】パフォーマンス
価格の推移
資産の推移
パフォーマンス指標
指標 | 値 |
---|---|
総トレード数 | 1564回 |
勝率 | 23.66% |
平均利益 | 0.27% |
平均損失 | -0.57% |
期待値 | -0.38% |
プロフィットファクター | 0.16 |
最大ドローダウン | 99.73% |
最終リターン | -99.73% |
シャープレシオ | -0.78 |
HODL(Buy&Hold) | 75.21% |
HODL戦略との比較
実装コード(Python)
"""
Mean Reversion Signal (formerly funding_rate_extreme)
価格の平均回帰を利用したシグナル生成
"""
import pandas as pd
import numpy as np
def calculate_funding_rate_signals(df: pd.DataFrame,
exchange_name: str = 'binance',
derivative_symbol: str = None,
threshold: float = 0.0005,
window: int = 20,
zscore_threshold: float = 1.5) -> pd.DataFrame:
"""
平均回帰戦略のシグナル生成
Parameters:
-----------
df : pd.DataFrame
OHLCVデータ
window : int
移動平均の期間(デフォルト: 20)
zscore_threshold : float
Zスコアの閾値(デフォルト: 2.0)
Returns:
--------
pd.DataFrame
シグナルが追加されたDataFrame
"""
df = df.copy()
# 移動平均と標準偏差を計算
df['ma'] = df['close'].rolling(window=window).mean()
df['std'] = df['close'].rolling(window=window).std()
# Zスコアを計算
df['zscore'] = (df['close'] - df['ma']) / (df['std'] + 0.0001)
# ボリュームの移動平均
df['volume_ma'] = df['volume'].rolling(window=window).mean()
# シグナル生成(平均回帰)
df['is_buy'] = (
(df['zscore'] < -zscore_threshold) & # 過度に売られている
(df['volume'] > df['volume_ma'] * 0.8) & # 十分なボリューム
df['zscore'].notna()
)
df['is_sell'] = (
(df['zscore'] > zscore_threshold) & # 過度に買われている
(df['volume'] > df['volume_ma'] * 0.8) & # 十分なボリューム
df['zscore'].notna()
)
# 不要カラム削除
df.drop(['ma', 'std', 'zscore', 'volume_ma'], axis=1, inplace=True, errors='ignore')
return df
なぜこの結果になったのか(3つの理由)
- 1勝率が約24%と、とても低かったです。これは、4回取引したら3回は負けてしまう計算です。これでは、なかなか利益を積み重ねられませんでした。
- 21回取引するごとに、平均して少しずつお金が減っていく計算でした。だから、取引すればするほど、お金が減ってしまう結果になりました。
- 3もうかった金額と、損した金額を比べると、損した金額の方がずっと大きかったのです。最終的に、もとのお金がほとんどなくなってしまう(-99.73%)という、とても残念な結果になりました。
この結果から学べる3つの教訓
- 1「値段はいつか平均に戻るはず」という考え方が、いつでも通用するわけではないことがわかりました。特に、値段がどんどん上がり続けたり、下がり続けたりする「トレンド」が起きている時は、平均に戻らず、そのまま進んでしまうことが多いのです。
- 2勝つ回数が少なくても、1回勝った時にすごく大きな利益が出れば、良い作戦になることもあります。でも、この作戦は勝つ回数が少ない上に、勝った時の利益も小さかったので、うまくいきませんでした。
- 31500回以上もたくさん取引したのに、結果がとても悪かったということは、作戦そのものに何か問題があったと考えられます。「平均に戻るはず」という単純な考えだけでは、複雑な値段の動きには対応できない、ということが学べました。
リスク管理の具体的手法
取引量の決め方
1回の取引に使うお金は、持っているお金全部のうちの、ほんの一部(例えば100分の1とか)だけにしておきます。こうすれば、もし負けても、大きなダメージを受けずにすみます。
損失が大きくなったときの対処法
もし、決めておいた以上に損がふくらんでしまったら、すぐに取引をストップします。そして、「作戦のどこが悪かったんだろう?」と見直すことが大切です。今回のように、お金がほとんど無くなるまで続けるのはとても危険です。
資金管理の方法
取引に使うお金は、かならず「もし無くなっても生活に困らないお金」だけにしましょう。また、もし利益が出ても、全部使ってしまわずに、一部は次の取引のためにとっておくなど、長い目で見たお金の管理が重要です。
改良案の具体的提案
- 値段の勢いが強い時(トレンド)にもうまくいくように、「流れに乗る」という考え方(トレンドフォロー)を作戦に加えてみるのはどうでしょうか。
- 「ここまできたら取引する」というライン(基準値)などを、その時の状況に合わせて変えられるように、作戦を改良することが考えられます。
- 値段の動きを分析するための道具(指標)は他にもたくさんあります。それらをいくつか組み合わせることで、もっと良いタイミングで取引できるようになるかもしれません。
実用性の向上(運用上の注意)
- この作戦は、お金を増やすのがとても難しいことがわかっています。もし試すなら、まずは本物のお金を使わない練習(デモ取引)や、なくなってもいいと思える少額のお金で試すことを強くおすすめします。
- 作戦で使う数字の設定(「ここまで来たら取引する」というラインなど)は、今の状況に合わせて変えていくことが大切です。古いルールのままでは、うまくいかないかもしれません。
- この結果は、あくまで過去のデータで試したものです。未来も同じ結果になるという保証はどこにもありません。このことを絶対に忘れないでください。
検証の透明性と信頼性
- データの出所: この結果は、過去1年間のビットコインの5分ごとの値段のデータを使って計算したものです。
- 検証のやり方: 決められた設定とプログラムを使って、過去のデータでこの作戦を試す「バックテスト」というシミュレーションを行いました。
- コード: どんなプログラムで計算したかは、公開されているので誰でも見ることができます。どうやって「買い」や「売り」の合図を出しているのか、中身を確認できます。
- 注意事項: 大切なことなので繰り返しますが、この作戦は過去のデータで試したもので、将来もうかることを約束するものではありません。投資をする時は、必ず自分で考えて、自分の責任で行ってください。また、この計算結果は、手数料などを考えない特別な条件でのものなので、実際に取引した時の結果とは違うことがあります。