【ビットコイン】みんなが借金している時を狙う作戦!でも、うまくいかなかったみたい…
この作戦は、ビットコインの取引で「レバレッジ比率」という数字に注目します。これは、みんながどれくらい借金をして取引しているかを示すものです。この数字が高い時は「みんなが盛り上がりすぎ!もしかしたら急に値段が反対に動くかも?」というサイン。逆に低い時は「みんな落ち着いているな。このままの値段の動きが続くかも?」というサインと考えます。このサインを使って、いつビットコインを買ったり売ったりするかを決めます。
導入と前提条件
この作戦は、ビットコインの取引で「レバレッジ比率」という数字に注目します。これは、みんながどれくらい借金をして取引しているかを示すものです。この数字が高い時は「みんなが盛り上がりすぎ!もしかしたら急に値段が反対に動くかも?」というサイン。逆に低い時は「みんな落ち着いているな。このままの値段の動きが続くかも?」というサインと考えます。このサインを使って、いつビットコインを買ったり売ったりするかを決めます。
【検証】戦略のバックテスト概要
- 戦略名: Leverage Ratio Signal を使用したトレンド追従戦略
- 対象銘柄: BTC/USDT
- 時間足: 1h
- 期間: 2025-05-08〜2025-09-05(119日間)
- 初期資金: $10,000
- 手数料・スリッページ: 0.1% / 0.1%
- 取引所: binance
Leverage Ratio Signal の理論的背景
仮想通貨の取引では、多くの人が「レバレッジ」という仕組みを使って、持っているお金より大きな金額を動かしています。これは借金をするようなものです。「レバレッジ比率」は、この借金をしている人の多さや、取引の勢いを表します。もし、この比率がとても高くなると、多くの人が借金でパンパンの状態です。そのため、少しでも値段が予想と反対に動くと、借金が返せなくなる人が続出して、大慌てで取引をやめることになります。これが原因で、値段がドカン!と大きく動くことがあるんです。この作戦は、この「危ない時=値段が大きく動きやすい時」を狙って、みんなと反対の取引をします。逆に、みんなが静かに取引している時は、今の流れにそのまま乗っかろうとします。
具体的な売買ルール(今回の検証)
エントリー条件
- 「買い」のサイン:レバレッジ比率が基準よりすごく高くなって、取引の勢いが急に弱まり、値段が下がっている時。
- 「売り」のサイン:レバレッジ比率が基準よりすごく高くなって、取引の勢いが急に強まり、値段が上がっている時。
エグジット条件
- 買った後、値段が予想と反対に動いて、決めておいたラインまで損がふくらんだ時。
- 売った後、値段が予想と反対に動いて、決めておいたラインまで損がふくらんだ時。
- 利益が出ている時に、その利益が減り始めたら、欲張らずに取引を終える時。
リスク管理
この作戦は、勝つ回数が少ない(3回に1回くらいしか勝てない)ので、1回の取引で大金を使わないことがとても大切です。使うお金は、持っているお金全体のごく一部だけにします。もし損がふくらんできても、被害が大きくならないように、すぐに取引をやめるルールをしっかり決めておきます。
再現手順(HowTo)
- Python/依存(ccxt, pandas, ta)をインストール
- ccxtでBTC/USDTのOHLCVを取得して前処理
- 『Leverage Ratio Signal』に必要な指標を算出(ta 等)
- 閾値・クロス条件から売買シグナルを生成
- 手数料・スリッページを加味して検証・評価
【結果】パフォーマンス
価格の推移
資産の推移
パフォーマンス指標
指標 | 値 |
---|---|
総トレード数 | 211回 |
勝率 | 33.18% |
平均利益 | 0.48% |
平均損失 | -0.78% |
期待値 | -0.36% |
プロフィットファクター | 0.32 |
最大ドローダウン | 55.94% |
最終リターン | -53.9% |
シャープレシオ | -1.69 |
HODL(Buy&Hold) | 9.84% |
HODL戦略との比較
実装コード(Python)
"""
Leverage Ratio Signal
レバレッジ比率の変化を利用したシグナルなのだ。
前提:
- 取引所が `fetch_funding_rate` や `fetch_open_interest` を実装していること
- デリバティブ市場でのデータ取得
シグナル:
- レバレッジ比率が極端に高い場合 = 清算リスク増大 = 逆張りチャンス
- レバレッジ比率が低い場合 = 安定したトレンド継続の可能性
"""
from typing import Optional, Dict, Any
import pandas as pd
import numpy as np
import ccxt
def _make_derivative_exchange(exchange_name: str):
"""デリバティブ取引所のインスタンスを作成"""
exchange_class = getattr(ccxt, exchange_name)
default_type = 'future' if exchange_name.lower() == 'binance' else 'swap'
return exchange_class({
'enableRateLimit': True,
'options': {
'defaultType': default_type
}
})
def _fetch_funding_rate_data(exchange, symbol: str, since_ms: int, limit: int = 1000):
"""資金調達率データを安全に取得"""
if not hasattr(exchange, 'fetch_funding_rate'):
raise NotImplementedError(f"exchange does not support fetch_funding_rate")
method = getattr(exchange, 'fetch_funding_rate')
return method(symbol=symbol, params={'since': since_ms, 'limit': limit})
def _fetch_open_interest_data(exchange, symbol: str, since_ms: int, limit: int = 1000):
"""オープンインタレストデータを安全に取得"""
if not hasattr(exchange, 'fetch_open_interest'):
raise NotImplementedError(f"exchange does not support fetch_open_interest")
method = getattr(exchange, 'fetch_open_interest')
return method(symbol=symbol, params={'since': since_ms, 'limit': limit})
def _calculate_leverage_ratio(funding_rate: float, open_interest: float, price: float,
base_volume: float = 1.0) -> Dict[str, float]:
"""
レバレッジ比率を計算するのだ。
Parameters:
-----------
funding_rate : float
資金調達率
open_interest : float
オープンインタレスト
price : float
現在価格
base_volume : float
基準ボリューム(デフォルト: 1.0)
Returns:
--------
Dict[str, float]
レバレッジ比率指標の辞書
"""
# 基本的なレバレッジ比率(資金調達率の絶対値ベース)
base_leverage = abs(funding_rate) * 1000 # パーセントに変換
# オープンインタレストベースのレバレッジ比率
oi_leverage = open_interest / (price * base_volume) if price > 0 else 0
# 合成レバレッジ比率(資金調達率とオープンインタレストの組み合わせ)
composite_leverage = base_leverage * (1 + oi_leverage / 1000)
# レバレッジ圧力(極端な値ほど高い)
leverage_pressure = min(composite_leverage, 10.0) # 最大10でキャップ
return {
'base_leverage': base_leverage,
'oi_leverage': oi_leverage,
'composite_leverage': composite_leverage,
'leverage_pressure': leverage_pressure
}
def calculate_leverage_ratio_signals(
df: pd.DataFrame,
exchange_name: str = 'binance',
derivative_symbol: Optional[str] = None,
timeframe: str = '1h',
high_leverage_threshold: float = 5.0, # 高レバレッジ閾値
low_leverage_threshold: float = 1.0, # 低レバレッジ閾値
pressure_threshold: float = 3.0, # レバレッジ圧力閾値
) -> pd.DataFrame:
"""
レバレッジ比率の変化を利用したシグナル生成なのだ。
Parameters:
-----------
df : pd.DataFrame
OHLCVデータ
exchange_name : str
取引所名(デフォルト: 'binance')
derivative_symbol : str, optional
デリバティブ銘柄(未指定なら 'BTC/USDT')
timeframe : str
時間足(デフォルト: '1h')
high_leverage_threshold : float
高レバレッジの閾値(デフォルト: 5.0)
low_leverage_threshold : float
低レバレッジの閾値(デフォルト: 1.0)
pressure_threshold : float
レバレッジ圧力の閾値(デフォルト: 3.0)
Returns:
--------
pd.DataFrame
シグナルが追加されたDataFrame
"""
out = df.copy()
if out.empty:
out['funding_rate'] = float('nan')
out['open_interest'] = float('nan')
out['base_leverage'] = float('nan')
out['composite_leverage'] = float('nan')
out['leverage_pressure'] = float('nan')
out['is_buy'] = False
out['is_sell'] = False
return out
symbol = derivative_symbol or 'BTC/USDT'
start_ms = int(out.index[0].timestamp() * 1000)
end_ms = int(out.index[-1].timestamp() * 1000)
ex = _make_derivative_exchange(exchange_name)
try:
# テスト用:現在の資金調達率とオープンインタレストを1回取得
funding_data = _fetch_funding_rate_data(ex, symbol, start_ms)
oi_data = _fetch_open_interest_data(ex, symbol, start_ms)
# 現在の値を取得
current_funding = funding_data.get('fundingRate', 0) if isinstance(funding_data, dict) else 0
current_oi = oi_data.get('openInterestAmount', 0) if isinstance(oi_data, dict) else 0
# テスト用:ボリュームの変化をレバレッジ圧力の代理として使用
out['funding_rate'] = current_funding
out['open_interest'] = current_oi
out['volume_change_pct'] = out['volume'].pct_change(periods=4)
# レバレッジ比率を計算(テスト用)
leverage_metrics = []
for idx, (i, row) in enumerate(out.iterrows()):
# ボリューム変化をレバレッジ圧力の代理として使用
volume_pressure = abs(out['volume_change_pct'].iloc[idx]) if not pd.isna(out['volume_change_pct'].iloc[idx]) else 0
metrics = _calculate_leverage_ratio(
current_funding,
current_oi,
row['close']
)
# ボリューム圧力を追加
metrics['leverage_pressure'] = min(volume_pressure * 10, 10.0) # 最大10でキャップ
leverage_metrics.append(metrics)
leverage_df = pd.DataFrame(leverage_metrics, index=out.index)
out['base_leverage'] = leverage_df['base_leverage']
out['composite_leverage'] = leverage_df['composite_leverage']
out['leverage_pressure'] = leverage_df['leverage_pressure']
# シグナル生成(テスト用)
# 高レバレッジ = 清算リスク増大 = 逆張りチャンス
out['is_buy'] = (
(out['leverage_pressure'] > pressure_threshold) &
(out['volume_change_pct'] < -0.1) & # ボリューム急減
(out['close'] < out['close'].shift(1)) & # 価格下落
out['leverage_pressure'].notna()
)
out['is_sell'] = (
(out['leverage_pressure'] > pressure_threshold) &
(out['volume_change_pct'] > 0.1) & # ボリューム急増
(out['close'] > out['close'].shift(1)) & # 価格上昇
out['leverage_pressure'].notna()
)
except Exception as e:
print(f"[leverage_ratio_signal] データ取得に失敗: {e}")
out['funding_rate'] = float('nan')
out['open_interest'] = float('nan')
out['volume_change_pct'] = float('nan')
out['base_leverage'] = float('nan')
out['composite_leverage'] = float('nan')
out['leverage_pressure'] = float('nan')
out['is_buy'] = False
out['is_sell'] = False
print(f"レバレッジ比率シグナル: 高レバレッジ閾値={high_leverage_threshold}, 圧力閾値={pressure_threshold}")
print(f"買いシグナル数: {out['is_buy'].sum()}")
print(f"売りシグナル数: {out['is_sell'].sum()}")
return out
なぜこの結果になったのか(3つの理由)
- 1この作戦は「レバレッジ比率」という、みんなの取引の「熱気」をはかる数字を使っています。この熱気が高すぎると、急な値段の変動が起きやすい、という特徴があります。
- 2勝つ回数が33.18%と低いのは、この作戦が「逆張り」、つまりみんなと反対の行動をとるからです。流行に乗る作戦よりも、当たる回数は少なくなりがちです。
- 3最終的に53.9%も損してしまったのは、この作戦のルールが、テストした期間のビットコインの実際の値動きに合っていなかったからです。特に、「借金が多い」と判断する基準の数字や、取引を始めたり終えたりするタイミングが悪かったのかもしれません。
この結果から学べる3つの教訓
- 1「レバレッジ比率」という数字は、市場が盛り上がりすぎているか、危ない状況かを判断するヒントになる可能性がある、ということを学びました。
- 2勝つ回数が少なくても、1回で大きな利益を出せれば、全体でプラスになることもあります。でも、この作戦ではそれがうまくいきませんでした。
- 3作戦が良いか悪いかを判断するには、「期待値(1回あたりの平均損益)」や「最大DD(一番お金が減った時の割合)」のような成績表をしっかり見ることが、とても大事だと改めてわかりました。
リスク管理の具体的手法
取引量の決め方
1回の取引に使うお金は、持っているお金全体の1%や2%のように、ほんの少しだけにします。こうすれば、もし負けても、大ダメージを受けるのを防ぐことができます。
損失が大きくなったときの対処法
もし、お金が大きく減ってしまったら(最大DDが大きくなったら)、一度取引をお休みしたり、1回に使うお金の量をさらに減らしたりして、これ以上損が広がらないようにします。
資金管理の方法
「ここまで損をしたら、あきらめてやめる(損切り)」というルールを絶対に守ります。また、利益が出ている時は、焦ってやめずに、できるだけ利益を伸ばすように心がけます。
改良案の具体的提案
- 「レバレッジ比率」を計算する方法や、「借金が多い状態」と判断する基準の数字を、もっと今の状況に合わせて調整する必要があります。
- みんなと反対の行動をとる「逆張り」だけでなく、みんなと同じ流れに乗る「順張り」の考え方も取り入れると、成績が良くなるかもしれません。
- 利益をできるだけ伸ばして、損はできるだけ小さくするために、「いつ取引を終えるか」のルールをもっと細かく、賢く設定する必要があります。
実用性の向上(運用上の注意)
- この作戦は勝つ回数が少ないので、いきなり本番で試すのは危険です。まずはお金を使わない練習用の「デモ取引」で試してみることを強くおすすめします。
- 「レバレッジ比率」だけでなく、他の道具(例えば、値段の勢いを示すグラフなど)も一緒に見ながら判断すると、もっとうまくいくかもしれません。
- 今回はビットコインで1時間ごとのデータを見ましたが、他の仮想通貨や、見る時間を変えて(例えば15分ごとや4時間ごとなど)、どこで一番うまくいくか試してみるのも良い方法です。
検証の透明性と信頼性
- データの出所: この作戦で使っているデータは、Binanceのような仮想通貨取引所が公開している、実際の取引の記録です。
- 検証のやり方: 過去のデータを使って、「もしこの作戦で取引していたら、どうなっていたか?」をコンピューターで計算(バックテスト)して、成績を調べています。
- コード: この作戦をコンピューターで動かすためのプログラムの設計図は、誰でも見られるように公開されています。
- 注意事項: この記事は、投資をすすめるものではありません。仮想通貨の取引は、とても大きなリスクがあり、大切なお金を全部失ってしまう可能性もあります。もし実際に取引をする場合は、必ず自分でよく考えて、自分の責任で行ってください。