みんなの「期待」を数字で見る!ビットコイン取引の新しいヒント
ビットコインの取引では、多くの人が「これから価格はどうなるかな?」と考えています。その「みんなの期待」が数字になったものが「未決済建玉(みけっさいたてぎょく)」です。この記事では、この数字の急な変化から、価格の動きのヒントを見つける方法を紹介します。
導入と前提条件
ビットコインの取引では、多くの人が「これから価格はどうなるかな?」と考えています。その「みんなの期待」が数字になったものが「未決済建玉(みけっさいたてぎょく)」です。この記事では、この数字の急な変化から、価格の動きのヒントを見つける方法を紹介します。
【検証】戦略のバックテスト概要
- 戦略名: 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)
- Python/依存(ccxt, pandas, ta)をインストール
- ccxtでBTC/USDTのOHLCVを取得して前処理
- 『Open Interest Surge』に必要な指標を算出(ta 等)
- 閾値・クロス条件から売買シグナルを生成
- 手数料・スリッページを加味して検証・評価
【結果】パフォーマンス
価格の推移
資産の推移
パフォーマンス指標
指標 | 値 |
---|---|
総トレード数 | 263回 |
勝率 | 19.01% |
平均利益 | 0.75% |
平均損失 | -0.66% |
期待値 | -0.39% |
プロフィットファクター | 0.26 |
最大ドローダウン | 64.9% |
最終リターン | -64.75% |
シャープレシオ | -2.05 |
HODL(Buy&Hold) | 9.92% |
HODL戦略との比較
実装コード(Python)
"""
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この作戦の勝率は約19%と、かなり低かったです。つまり、100回挑戦しても、もうかったのは19回くらいで、残りの81回は損してしまったということです。
- 2もうけと損のバランス(プロフィットファクター)を見ても、もうけが「1」に対して損が「4」くらいの割合で、損のほうがずっと大きかったことを示しています。
- 3最終的に、持っていたお金が約65%も減ってしまいました。これは勝率が低いことと、一度負けたときのダメージが大きかったことが原因です。
この結果から学べる3つの教訓
- 1「未決済建玉」が急に増えたり減ったりしても、必ずその通りに価格が動くわけではない、ということがわかりました。サインが出ても、それはあくまでヒントの一つなんですね。
- 2勝率が低くても一回で大きく勝てばいい、という考え方もありますが、今回は損も大きくなってしまいました。大切なお金を守るためのルール(リスク管理)がいかに重要か、改めてわかりました。
- 3一つのサインだけを信じるのではなく、世の中のニュースや、もっと長い期間での価格の動きなど、色々な情報を組み合わせて考えることが大切だと学びました。
リスク管理の具体的手法
取引量の決め方
1回の取引で使うお金は、持っている全体の1%か2%くらいに決めます。こうすれば、もし失敗しても、ダメージをとても小さくできます。
損失が大きくなったときの対処法
もし損が続いて、持っているお金が目標より大きく減ってしまったら、一度すべての取引をやめて、なぜうまくいかなかったのか冷静に考える時間を作ります。
資金管理の方法
もしもうかったら、その一部は使わずに取っておきます。逆に損してしまったときに、「取り返そう!」と焦って無茶な取引をしないように、気持ちを落ち着けることがとても大切です。
改良案の具体的提案
- 「未決済建玉」の変化だけでなく、価格の勢いや、他の道具(例えば移動平均線など)も使って、「これは本当にチャンスだ!」と自信が持てるサインだけを信じるようにします。
- 「どれくらい増えたら『急増』とするか?」という数字のルールを、昔のデータで何度もテストして、一番うまくいく組み合わせを見つけ出します。
- 損が少しでも出たらすぐに取引をやめる「損切り」というルールを厳しくするなど、大きな失敗をしないための工夫をもっと考えます。
実用性の向上(運用上の注意)
- この作戦は、あくまでヒントの一つです。これだけを信じずに、他の情報もたくさん集めて、最後は自分でしっかり考えて決めることが大切です。
- 「急に増えた」の基準になる数字は、いつも同じではありません。ビットコインの状況に合わせて、時々見直す必要があるかもしれません。
- 実際にお金を使う前に、昔のデータを使ってこの作戦の練習(バックテスト)をしてみたり、なくなってもいいと思える少額で試してみたりすることが、とても重要です。
検証の透明性と信頼性
- データの出所: Binanceのような仮想通貨取引所が公開している、本物の取引データ(価格や未決済建玉の数など)を使っています。
- 検証のやり方: 2025年5月8日から2025年9月5日までの約4ヶ月間、ビットコインの1時間ごとのデータを使って、この作戦を試したらどうなるかを計算しました(これをバックテストと言います)。
- コード: この作戦をコンピューターで動かすための設計図(プログラムコード)は、公開されています。興味があれば、開発した人たちに聞くこともできます。
- 注意事項: この説明は、過去のデータで試した結果です。未来も同じようにうまくいくとは限りません。仮想通貨の取引には、お金が減ってしまう危険があります。投資は、自分でしっかり勉強して、自分の責任で行ってくださいね。