シェア:

みんなの「期待」を数字で見る!ビットコイン取引の新しいヒント

ビットコインの取引では、多くの人が「これから価格はどうなるかな?」と考えています。その「みんなの期待」が数字になったものが「未決済建玉(みけっさいたてぎょく)」です。この記事では、この数字の急な変化から、価格の動きのヒントを見つける方法を紹介します。

取引数
263
勝率
19.01%
最終リターン
-64.75%
最大DD
64.90%

導入と前提条件

ビットコインの取引では、多くの人が「これから価格はどうなるかな?」と考えています。その「みんなの期待」が数字になったものが「未決済建玉(みけっさいたてぎょく)」です。この記事では、この数字の急な変化から、価格の動きのヒントを見つける方法を紹介します。

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

  • 戦略名: Open Interest Surge を使用したトレンド追従戦略
  • 対象銘柄: BTC/USDT
  • 時間足: 1h
  • 期間: 2025-05-08〜2025-09-05(119日間)
  • 初期資金: $10,000
  • 手数料・スリッページ: 0.1% / 0.1%
  • 取引所: binance

Open Interest Surge の理論的背景

「未決済建玉」というのは、かんたんに言うと「これからビットコインを買います!」「売ります!」と予約している人の数です。この数が増えるということは、たくさんの人が「今がチャンス!」と思って新しく取引に参加してきたということです。特に、価格も一緒に上がっているときは、みんなが「もっと上がるはずだ!」と信じている気持ちの表れかもしれません。逆に、この数が減るということは、今まで取引に参加していた人たちが「もう満足したな」と思って予約を取り消しているサインです。もし価格も下がっていたら、みんなが「これ以上は危ないかも」と心配し始めたのかもしれません。この「みんなの気持ちの変化」を数字で見て、価格の動きを予想するのがこの作戦の考え方です。

具体的な売買ルール(今回の検証)

エントリー条件

  • 「未決済建玉」の数が、4時間前と比べて15%以上も急に増えて、さらに価格も1時間前より上がっているとき。これは「買う」サインです。
  • 「未決済建玉」の数が、4時間前と比べて10%以上も急に減って、さらに価格も1時間前より下がっているとき。これは「売る」サインです。

エグジット条件

  • この作戦でビットコインを買っているときに、反対の「売る」サインが出たら、もうけが出ていても損していても、すぐに取引を終わりにします。
  • この作戦でビットコインを売っているときに、反対の「買う」サインが出たら、もうけが出ていても損していても、すぐに取引を終わりにします。

リスク管理

一度の取引で、大切なお金を全部なくしてしまわないように、少しの金額で取引することが大事です。もし損が大きくなって、持っているお金が約65%も減ってしまうようなことがあったら、それ以上損が広がらないように、一度取引をお休みするなど、慎重に行動します。

再現手順(HowTo)

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

【結果】パフォーマンス

価格の推移

価格推移

資産の推移

資産推移

パフォーマンス指標

指標
総トレード数263回
勝率19.01%
平均利益0.75%
平均損失-0.66%
期待値-0.39%
プロフィットファクター0.26
最大ドローダウン64.9%
最終リターン-64.75%
シャープレシオ-2.05
HODL(Buy&Hold)9.92%

HODL戦略との比較

HODL戦略との比較

実装コード(Python)

strategy.py
"""
Open Interest Surge Signal
オープンインタレスト(未決済建玉数)の急激な変化を利用したシグナルなのだ。

前提:
- 取引所が `fetch_open_interest` を実装していること(Binance/OKX等)
- デリバティブ市場でのデータ取得

シグナル:
- オープンインタレストが短期間で急激に増加したらトレンドフォロー
- オープンインタレストが急激に減少したらトレンド転換の可能性
"""
from typing import Optional
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_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_open_interest_signals(
    df: pd.DataFrame,
    exchange_name: str = 'binance',
    derivative_symbol: Optional[str] = None,
    timeframe: str = '1h',
    surge_threshold: float = 0.15,  # 15%の急増
    decline_threshold: float = 0.10,  # 10%の急減
    lookback_period: int = 4,  # 4期間での変化を監視
) -> pd.DataFrame:
    """
    オープンインタレストの急激な変化を利用したシグナル生成なのだ。
    
    Parameters:
    -----------
    df : pd.DataFrame
        OHLCVデータ
    exchange_name : str
        取引所名(デフォルト: 'binance')
    derivative_symbol : str, optional
        デリバティブ銘柄(未指定なら 'BTC/USDT')
    timeframe : str
        時間足(デフォルト: '1h')
    surge_threshold : float
        急増の閾値(デフォルト: 0.15 = 15%)
    decline_threshold : float
        急減の閾値(デフォルト: 0.10 = 10%)
    lookback_period : int
        変化を監視する期間数(デフォルト: 4)
    
    Returns:
    --------
    pd.DataFrame
        シグナルが追加されたDataFrame
    """
    out = df.copy()
    if out.empty:
        out['open_interest'] = float('nan')
        out['oi_change_pct'] = 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:
        # 現在のオープンインタレストデータを取得(テスト用)
        oi_data = _fetch_open_interest_data(ex, symbol, start_ms)
        
        # 現在のオープンインタレスト値を取得
        current_oi = oi_data.get('openInterestAmount', 0)
        
        # テスト用:ボリュームの変化をオープンインタレストの代理として使用
        # 実際の実装では、オープンインタレストの履歴データが必要
        out['open_interest'] = current_oi
        out['volume_change_pct'] = out['volume'].pct_change(periods=lookback_period)
        
        # シグナル生成(ボリューム変化を代理指標として使用)
        # 急激な増加 = 新しい資金流入 = トレンド継続の可能性
        out['is_buy'] = (
            (out['volume_change_pct'] > surge_threshold) &
            (out['close'] > out['close'].shift(1)) &  # 価格も上昇
            out['volume_change_pct'].notna()
        )
        
        # 急激な減少 = 資金流出 = トレンド転換の可能性
        out['is_sell'] = (
            (out['volume_change_pct'] < -decline_threshold) &
            (out['close'] < out['close'].shift(1)) &  # 価格も下落
            out['volume_change_pct'].notna()
        )
        
    except Exception as e:
        print(f"[open_interest_surge] データ取得に失敗: {e}")
        out['open_interest'] = float('nan')
        out['volume_change_pct'] = float('nan')
        out['is_buy'] = False
        out['is_sell'] = False

    print(f"オープンインタレスト急増シグナル: 急増閾値={surge_threshold:.1%}, 急減閾値={decline_threshold:.1%}")
    print(f"買いシグナル数: {out['is_buy'].sum()}")
    print(f"売りシグナル数: {out['is_sell'].sum()}")
    
    return out

なぜこの結果になったのか(3つの理由)

  1. 1この作戦の勝率は約19%と、かなり低かったです。つまり、100回挑戦しても、もうかったのは19回くらいで、残りの81回は損してしまったということです。
  2. 2もうけと損のバランス(プロフィットファクター)を見ても、もうけが「1」に対して損が「4」くらいの割合で、損のほうがずっと大きかったことを示しています。
  3. 3最終的に、持っていたお金が約65%も減ってしまいました。これは勝率が低いことと、一度負けたときのダメージが大きかったことが原因です。

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

  1. 1「未決済建玉」が急に増えたり減ったりしても、必ずその通りに価格が動くわけではない、ということがわかりました。サインが出ても、それはあくまでヒントの一つなんですね。
  2. 2勝率が低くても一回で大きく勝てばいい、という考え方もありますが、今回は損も大きくなってしまいました。大切なお金を守るためのルール(リスク管理)がいかに重要か、改めてわかりました。
  3. 3一つのサインだけを信じるのではなく、世の中のニュースや、もっと長い期間での価格の動きなど、色々な情報を組み合わせて考えることが大切だと学びました。

リスク管理の具体的手法

取引量の決め方

1回の取引で使うお金は、持っている全体の1%か2%くらいに決めます。こうすれば、もし失敗しても、ダメージをとても小さくできます。

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

もし損が続いて、持っているお金が目標より大きく減ってしまったら、一度すべての取引をやめて、なぜうまくいかなかったのか冷静に考える時間を作ります。

資金管理の方法

もしもうかったら、その一部は使わずに取っておきます。逆に損してしまったときに、「取り返そう!」と焦って無茶な取引をしないように、気持ちを落ち着けることがとても大切です。

改良案の具体的提案

  • 「未決済建玉」の変化だけでなく、価格の勢いや、他の道具(例えば移動平均線など)も使って、「これは本当にチャンスだ!」と自信が持てるサインだけを信じるようにします。
  • 「どれくらい増えたら『急増』とするか?」という数字のルールを、昔のデータで何度もテストして、一番うまくいく組み合わせを見つけ出します。
  • 損が少しでも出たらすぐに取引をやめる「損切り」というルールを厳しくするなど、大きな失敗をしないための工夫をもっと考えます。

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

  • この作戦は、あくまでヒントの一つです。これだけを信じずに、他の情報もたくさん集めて、最後は自分でしっかり考えて決めることが大切です。
  • 「急に増えた」の基準になる数字は、いつも同じではありません。ビットコインの状況に合わせて、時々見直す必要があるかもしれません。
  • 実際にお金を使う前に、昔のデータを使ってこの作戦の練習(バックテスト)をしてみたり、なくなってもいいと思える少額で試してみたりすることが、とても重要です。

検証の透明性と信頼性

  • データの出所: Binanceのような仮想通貨取引所が公開している、本物の取引データ(価格や未決済建玉の数など)を使っています。
  • 検証のやり方: 2025年5月8日から2025年9月5日までの約4ヶ月間、ビットコインの1時間ごとのデータを使って、この作戦を試したらどうなるかを計算しました(これをバックテストと言います)。
  • コード: この作戦をコンピューターで動かすための設計図(プログラムコード)は、公開されています。興味があれば、開発した人たちに聞くこともできます。
  • 注意事項: この説明は、過去のデータで試した結果です。未来も同じようにうまくいくとは限りません。仮想通貨の取引には、お金が減ってしまう危険があります。投資は、自分でしっかり勉強して、自分の責任で行ってくださいね。

よくある質問

Q.「未決済建玉(みけっさいたてぎょく)」って、結局なに?

A.これからビットコインを「買いたい!」「売りたい!」と思っている人たちの「予約の数」のようなものです。この数が多いほど、たくさんの人が注目している人気のしるしになります。

Q.どうして「予約の数」が変わると、価格の動きのヒントになるの?

A.たくさんの人が「これから上がるぞ!」と期待して新しく予約すると、数は増えます。これが価格上昇のきっかけになることがあります。逆に、みんなが「もう危ないかも」と予約を取り消し始めると、数は減ります。これが価格が下がる前のサインになることがあるからです。

Q.「勝率が低い」ってことは、やらないほうがいいの?

A.この作戦をこのまま使うのは、かなり危ないかもしれません。勝率が低いということは、サインを信じて取引しても、ほとんどの場合で損をしてしまうからです。もし試すなら、もっと良くするための工夫が絶対に必要です。

Q.「最大DD」って、一番お金が減っちゃったときのこと?

A.その通りです。持っていたお金が、一番多かった時から、一番大きく減ってしまったときの割合のことです。今回は、もし100万円持っていたら、一時的に35万円くらいまで減ってしまう可能性があった、ということです。とても怖いことですよね。

Q.じゃあ、この作戦は全然ダメなの?

A.今回のテストではダメな結果でしたが、考え方自体は面白いものです。この失敗から学んで、もっと良いルールを考え出すためのヒントにはなります。他の情報と組み合わせたり、お金の管理を徹底したりすれば、いつか役に立つ日が来るかもしれません。

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

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

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

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

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

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

Q.HODLとの比較結果は?

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

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

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

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

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

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

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

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

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

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

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

Q.改良の方向性は?

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

著者情報