シェア:

【ビットコイン】みんなが借金している時を狙う作戦!でも、うまくいかなかったみたい…

この作戦は、ビットコインの取引で「レバレッジ比率」という数字に注目します。これは、みんながどれくらい借金をして取引しているかを示すものです。この数字が高い時は「みんなが盛り上がりすぎ!もしかしたら急に値段が反対に動くかも?」というサイン。逆に低い時は「みんな落ち着いているな。このままの値段の動きが続くかも?」というサインと考えます。このサインを使って、いつビットコインを買ったり売ったりするかを決めます。

取引数
211
勝率
33.18%
最終リターン
-53.90%
最大DD
55.94%

導入と前提条件

この作戦は、ビットコインの取引で「レバレッジ比率」という数字に注目します。これは、みんながどれくらい借金をして取引しているかを示すものです。この数字が高い時は「みんなが盛り上がりすぎ!もしかしたら急に値段が反対に動くかも?」というサイン。逆に低い時は「みんな落ち着いているな。このままの値段の動きが続くかも?」というサインと考えます。このサインを使って、いつビットコインを買ったり売ったりするかを決めます。

【検証】戦略のバックテスト概要

  • 戦略名: 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)

  1. Python/依存(ccxt, pandas, ta)をインストール
  2. ccxtでBTC/USDTのOHLCVを取得して前処理
  3. 『Leverage Ratio Signal』に必要な指標を算出(ta 等)
  4. 閾値・クロス条件から売買シグナルを生成
  5. 手数料・スリッページを加味して検証・評価

【結果】パフォーマンス

価格の推移

価格推移

資産の推移

資産推移

パフォーマンス指標

指標
総トレード数211回
勝率33.18%
平均利益0.48%
平均損失-0.78%
期待値-0.36%
プロフィットファクター0.32
最大ドローダウン55.94%
最終リターン-53.9%
シャープレシオ-1.69
HODL(Buy&Hold)9.84%

HODL戦略との比較

HODL戦略との比較

実装コード(Python)

strategy.py
"""
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. 1この作戦は「レバレッジ比率」という、みんなの取引の「熱気」をはかる数字を使っています。この熱気が高すぎると、急な値段の変動が起きやすい、という特徴があります。
  2. 2勝つ回数が33.18%と低いのは、この作戦が「逆張り」、つまりみんなと反対の行動をとるからです。流行に乗る作戦よりも、当たる回数は少なくなりがちです。
  3. 3最終的に53.9%も損してしまったのは、この作戦のルールが、テストした期間のビットコインの実際の値動きに合っていなかったからです。特に、「借金が多い」と判断する基準の数字や、取引を始めたり終えたりするタイミングが悪かったのかもしれません。

この結果から学べる3つの教訓

  1. 1「レバレッジ比率」という数字は、市場が盛り上がりすぎているか、危ない状況かを判断するヒントになる可能性がある、ということを学びました。
  2. 2勝つ回数が少なくても、1回で大きな利益を出せれば、全体でプラスになることもあります。でも、この作戦ではそれがうまくいきませんでした。
  3. 3作戦が良いか悪いかを判断するには、「期待値(1回あたりの平均損益)」や「最大DD(一番お金が減った時の割合)」のような成績表をしっかり見ることが、とても大事だと改めてわかりました。

リスク管理の具体的手法

取引量の決め方

1回の取引に使うお金は、持っているお金全体の1%や2%のように、ほんの少しだけにします。こうすれば、もし負けても、大ダメージを受けるのを防ぐことができます。

損失が大きくなったときの対処法

もし、お金が大きく減ってしまったら(最大DDが大きくなったら)、一度取引をお休みしたり、1回に使うお金の量をさらに減らしたりして、これ以上損が広がらないようにします。

資金管理の方法

「ここまで損をしたら、あきらめてやめる(損切り)」というルールを絶対に守ります。また、利益が出ている時は、焦ってやめずに、できるだけ利益を伸ばすように心がけます。

改良案の具体的提案

  • 「レバレッジ比率」を計算する方法や、「借金が多い状態」と判断する基準の数字を、もっと今の状況に合わせて調整する必要があります。
  • みんなと反対の行動をとる「逆張り」だけでなく、みんなと同じ流れに乗る「順張り」の考え方も取り入れると、成績が良くなるかもしれません。
  • 利益をできるだけ伸ばして、損はできるだけ小さくするために、「いつ取引を終えるか」のルールをもっと細かく、賢く設定する必要があります。

実用性の向上(運用上の注意)

  • この作戦は勝つ回数が少ないので、いきなり本番で試すのは危険です。まずはお金を使わない練習用の「デモ取引」で試してみることを強くおすすめします。
  • 「レバレッジ比率」だけでなく、他の道具(例えば、値段の勢いを示すグラフなど)も一緒に見ながら判断すると、もっとうまくいくかもしれません。
  • 今回はビットコインで1時間ごとのデータを見ましたが、他の仮想通貨や、見る時間を変えて(例えば15分ごとや4時間ごとなど)、どこで一番うまくいくか試してみるのも良い方法です。

検証の透明性と信頼性

  • データの出所: この作戦で使っているデータは、Binanceのような仮想通貨取引所が公開している、実際の取引の記録です。
  • 検証のやり方: 過去のデータを使って、「もしこの作戦で取引していたら、どうなっていたか?」をコンピューターで計算(バックテスト)して、成績を調べています。
  • コード: この作戦をコンピューターで動かすためのプログラムの設計図は、誰でも見られるように公開されています。
  • 注意事項: この記事は、投資をすすめるものではありません。仮想通貨の取引は、とても大きなリスクがあり、大切なお金を全部失ってしまう可能性もあります。もし実際に取引をする場合は、必ず自分でよく考えて、自分の責任で行ってください。

よくある質問

Q.レバレッジ比率って、なんで大事なんですか?

A.市場の「熱気」がわかるからです。この数字が高いと、みんなが盛り上がりすぎていて、ちょっとしたことで値段が急に大きく動くかもしれない「危険信号」になります。この危険信号を読み取ることが大事なんです。

Q.勝率が低いって、どういうことですか?

A.取引が成功する回数が少ない、ということです。この作戦の勝率は約33%なので、だいたい3回取引したら2回は負けてしまう、という計算になります。勝つときに大きく勝たないと、全体でプラスにするのは難しいです。

Q.期待値がマイナスって、どういう意味ですか?

A.1回取引するごとに、平均して少しずつ損をしてしまう、という意味です。つまり、この作戦を長く続ければ続けるほど、お金が減っていく可能性が高い、ということを示しています。

Q.PFって何ですか?

A.プロフィットファクターの略で、「儲けの合計」を「損の合計」で割った数字です。例えば、PFが2なら、損した金額の2倍も儲かった、ということです。この数字が1より大きいと、全体として利益が出ていることになります。

Q.最大DDって、どういうことですか?

A.最大ドローダウンの略で、作戦の途中で、お金が一番減ってしまった時の下落率のことです。この作戦では最大55.94%なので、もし100万円で始めていたら、一時的に44万円くらいまで減ってしまった瞬間があった、ということ。精神的にかなりキツい状態です。

Q.検証に使用した期間と時間足は?

A.1h足で検証しました。期間は記事内の概要をご確認ください。

Q.最終リターンと最大ドローダウンは?

A.最終リターンは-53.90%、最大DDは55.94%です。

Q.勝率やPFはどの程度?

A.勝率は33.18%、プロフィットファクターは0.32です。

Q.HODLとの比較結果は?

A.HODLは9.84%でした。記事内の比較表をご覧ください。

Q.手数料やスリッページは考慮済み?

A.はい。バックテスト設定の手数料・スリッページを損益に反映しています。

Q.市場環境はトレンド/レンジどちらに近かった?

A.期間中はトレンド優勢と推測されます。

Q.この戦略は初心者でも扱える?

A.基礎的な指標と検証環境の知識があれば扱えます。まずは少額・デモから。

Q.推奨のリスク管理は?

A.最大DDを踏まえた損切り・ポジションサイジングと、システム停止基準の設定を推奨します。

Q.将来の結果は期待できる?

A.過去の結果は将来を保証しません。市場環境やパラメータ適合性に大きく依存します。

Q.改良の方向性は?

A.トレンド・ボラティリティのフィルター併用、パラメータの再最適化、取引頻度の制御を検討してください。

著者情報