ビットコイン、「人気すぎ?」「不人気すぎ?」な時に反対をねらう作戦!その結果はどうだった?
この作戦は、ビットコインの値段が短い時間で上がりすぎたり、下がりすぎたりしたときに、反対に動くことをねらう「MFI逆張り(ぎゃくばり)作戦」です。5分ごとの値動きを見て、たくさん取引をしてみたらどんな成績になったか、わかりやすく見ていきましょう。
導入と前提条件
この作戦は、ビットコインの値段が短い時間で上がりすぎたり、下がりすぎたりしたときに、反対に動くことをねらう「MFI逆張り(ぎゃくばり)作戦」です。5分ごとの値動きを見て、たくさん取引をしてみたらどんな成績になったか、わかりやすく見ていきましょう。
【検証】戦略のバックテスト概要
- 戦略名: MFI Reversal を使用したトレンド追従戦略
- 対象銘柄: BTC/USDT
- 時間足: 5m
- 期間: 2024-09-18〜2025-08-25(340日間)
- 初期資金: $10,000
- 手数料・スリッページ: 0.1% / 0.1%
- 取引所: binance
MFI Reversal の理論的背景
この作戦の裏には、人の気持ちの動きが関係しています。値段が急に下がると、みんな「こわい!もっと下がるかも!」と焦って売ってしまいます。逆に急に上がると、「チャンスを逃したくない!」と慌てて買ってしまいます。こういう一時的な焦りや盛り上がりで、値段が行きすぎてしまうことがあるんです。この作戦は、そんな「行きすぎた値段」が、冷静になったときに元の位置に戻ろうとするところをねらって、利益を出そうとする考え方です。
具体的な売買ルール(今回の検証)
エントリー条件
- MFIというヒントの数字が20より小さくなったら、「売られすぎ」のサインです。この瞬間に「買い」のチャンスと考えます。
- MFIの数字が80より大きくなったら、「買われすぎ」のサインです。この瞬間に「売り」のチャンスと考えます。
エグジット条件
- 買った後は、目標の利益が出たら取引を終わりにします。もし予想が外れて損が出ても、大きくなる前に取引を終わりにして、被害を小さくします。
- 売った後も同じです。目標の利益が出たら終わりにして、損が大きくなる前にも終わらせます。
リスク管理
大きな失敗をしないためのルールも大切です。1回の取引で使うお金は、最初に決めた額までにします。もし負けても大丈夫な範囲でやるのがポイントです。こうすることで、もし予想が外れても、ダメージを一番小さくできます。
再現手順(HowTo)
- Python/依存(ccxt, pandas, ta)をインストール
- ccxtでBTC/USDTのOHLCVを取得して前処理
- 『MFI Reversal』に必要な指標を算出(ta 等)
- 閾値・クロス条件から売買シグナルを生成
- 手数料・スリッページを加味して検証・評価
【結果】パフォーマンス
価格の推移
資産の推移
パフォーマンス指標
指標 | 値 |
---|---|
総トレード数 | 519回 |
勝率 | 37.96% |
平均利益 | 0.61% |
平均損失 | -0.89% |
期待値 | -0.32% |
プロフィットファクター | 0.47 |
最大ドローダウン | 82.2% |
最終リターン | -81.86% |
シャープレシオ | -0.25 |
HODL(Buy&Hold) | 86.34% |
HODL戦略との比較
実装コード(Python)
#!/usr/bin/env python3
"""
MFI(Money Flow Index)逆張り戦略
出来高を考慮したRSI、資金流入・流出を測定
"""
import pandas as pd
import numpy as np
def calculate_mfi_signals(df: pd.DataFrame, mfi_period: int = 14,
oversold: float = 20, overbought: float = 80) -> pd.DataFrame:
"""
MFI逆張りシグナルを生成
Parameters:
-----------
df : pd.DataFrame
OHLCVデータ
mfi_period : int
MFI計算期間(デフォルト: 14)
oversold : float
売られすぎ水準(デフォルト: 20)
overbought : float
買われすぎ水準(デフォルト: 80)
Returns:
--------
pd.DataFrame
シグナル列が追加されたDataFrame
"""
df = df.copy()
# Typical Price
df['typical_price'] = (df['high'] + df['low'] + df['close']) / 3
# Raw Money Flow
df['raw_money_flow'] = df['typical_price'] * df['volume']
# Positive and Negative Money Flow
df['money_flow_positive'] = np.where(
df['typical_price'] > df['typical_price'].shift(1),
df['raw_money_flow'],
0
)
df['money_flow_negative'] = np.where(
df['typical_price'] < df['typical_price'].shift(1),
df['raw_money_flow'],
0
)
# Money Flow Ratio
positive_flow = df['money_flow_positive'].rolling(window=mfi_period).sum()
negative_flow = df['money_flow_negative'].rolling(window=mfi_period).sum()
df['money_flow_ratio'] = positive_flow / negative_flow
# MFI計算
df['mfi'] = 100 - (100 / (1 + df['money_flow_ratio']))
# シグナル生成
df['is_buy'] = (
(df['mfi'] < oversold) &
(df['mfi'].shift(1) >= oversold)
)
df['is_sell'] = (
(df['mfi'] > overbought) &
(df['mfi'].shift(1) <= overbought)
)
# NaN値をFalseに置換
df['is_buy'] = df['is_buy'].fillna(False)
df['is_sell'] = df['is_sell'].fillna(False)
print(f"MFI逆張り: 期間={mfi_period}, 売られすぎ={oversold}, 買われすぎ={overbought}")
print(f"買いシグナル数: {df['is_buy'].sum()}")
print(f"売りシグナル数: {df['is_sell'].sum()}")
return df
なぜこの結果になったのか(3つの理由)
- 1この作戦を試したところ、519回も取引をしましたが、勝てたのは10回中4回もありませんでした。つまり、半分以上は負けてしまった、ということです。
- 2平均すると、1回取引するたびに、少しずつお金が減っていく計算でした。これを続けると、どんどんお金が減ってしまうことになります。
- 3利益と損を比べると、損のほうがずっと大きかった、という結果でした。だから、この作戦では儲けるのが難しかったんです。最終的に、もとのお金が大きく減ってしまったのは、これらの理由が重なったからです。
この結果から学べる3つの教訓
- 1「みんなと反対の動きをねらう」作戦は、タイミングがずれると大きな損につながりやすいことがわかりました。特に、値段が上がり始めたら、そのままどんどん上がり続けるような「強い流れ」があるときは、この作戦はうまくいきません。
- 2MFIのようなヒント一つだけを信じるのは、ちょっと危ないのかもしれないと学びました。他のヒントや、世の中のニュースなども一緒に見て判断することが大切です。
- 3今回試した期間では、この作戦を使うよりも、ただビットコインを買ってずっと持っていた方が、ずっと良い結果になっていました。つまり、何もしない方が良かった、ということです。
リスク管理の具体的手法
取引量の決め方
1回の取引で使うお金は、持っているお金全部のうちの、ほんの一部(例えば100分の1)だけにします。こうすれば、もし負けても、失うお金は少しですみます。
損失が大きくなったときの対処法
もし、損が続いてしまって、持っているお金が一定の割合(例えば10分の1)より減ってしまったら、一度全部の取引をやめます。そして、作戦を見直すなど、冷静になる時間を作ることが大切です。
資金管理の方法
一度にたくさんのお金を使わないように気をつけます。長く取引を続けていくためには、自分のお金を守ることが一番大事だからです。
改良案の具体的提案
- 「売られすぎ」「買われすぎ」を判断する数字のルール(20や80)を、もっとピッタリなものに変えてみます。また、MFIだけでなく、他のヒント(例えば、値段の平均を見るものなど)と組み合わせて、もっと確実なタイミングをねらいます。
- 値段が一方向にどんどん動いている「強い流れ」があるときは、この作戦は休みます。そういう流れがあるかどうかを見分ける新しいルールを追加します。
- 取引の回数が多すぎると、そのたびに手数料がかかってしまいます。なので、「これだ!」という本当に良いチャンスの時だけ取引するようにして、回数を減らしてみます。
実用性の向上(運用上の注意)
- この作戦は5分ごとの細かい値動きを見るので、ちょっとした動きにだまされやすいです。だから、もっと大きな時間の流れ(1時間や4時間ごとの動き)も見て、全体の方向を確認することが大切です。
- MFIの数字だけじゃなく、グラフの形(例えば、下に長い線が出ているかなど)や、他のヒントが出すサインも一緒に見ることで、もっと成功しやすいチャンスを見つけやすくなります。
- 今回のテストの結果は、あくまでも過去のデータで試したものです。未来も同じ結果になるかはわかりません。本当に取引するときは、まず少ないお金で試したり、練習用のモードで試したりすることがとても大事です。
検証の透明性と信頼性
- データの出所: 使ったデータは、もらったデータに基づいています。
- 検証のやり方: Pythonというプログラミング言語を使って、決められた期間のビットコインの5分ごとの値動きデータで、この作戦がうまくいったかどうかをテストしました。
- コード: テストに使ったプログラムは、MFIというヒントを計算して、売り買いの合図を出すために使われました。
- 注意事項: このテストの結果は、過去のデータでどうだったかを見ただけなので、将来も同じようにうまくいくことを約束するものではありません。お金を増やすこと(投資)には、損をする可能性(リスク)もあります。やるときは、自分でよく考えて、自分の責任で行ってくださいね。