Bot

開発記録#170(2025/4/4)「バイナリ複雑性-エントロピー平面(BiCEP)を用いた暗号通貨の価格変動解析」

前回の記事に引き続き、今回も仮想通貨botの開発状況をまとめていきます。

Yodaka

今回も論文をベースにbot開発のアイデアをまとめてみました

論文要約

この論文では、バイナリ系列および構造に特化して設計された複雑性-エントロピー平面(BiCEP)の初の応用について報告しています。特に、最も市場資本化が大きい暗号通貨の日々の価格変動(ステーブルコインを除く)を考慮に入れ、効率的市場仮説の数学的特性と関連するランダムウォークの基本的特徴と比較しています。この研究では、各暗号通貨のBiCEP上の位置から非効率スコアIIIを定義し、それに基づいてランキングしています。BiCEP分析の結果は統計的検定で裏付けられ、Shiba Inu(SHIB)のみが顕著な非効率性を示している一方で、暗号通貨取引の大部分はほぼ効率的な条件で行われていると評価されています。最終的に、この結果はバイナリ複雑性分析の有効性を支持しています​。

また、論文では、暗号通貨の複雑性と非効率性の関係をBiCEPを用いて研究しています。データは47種類の暗号通貨で構成され、市場資本化の合計が90%を占めています。この研究で、暗号通貨はBiCEP上で計算された成分に基づいて非効率性ランキングが行われ、非効率性が最も高かったSHIBを除き、他の暗号通貨は統計的に有意な非効率性とは評価されませんでした​。

詳細

この論文では、暗号通貨の価格変動を解析するために「バイナリ複雑性-エントロピー平面(BiCEP)」という新しい手法が紹介されています。暗号通貨市場の非効率性を数学的に評価するために開発されたこのモデルは、市場のランダム性と予測可能性を数値化するために使われます。具体的には、以下のステップで進められています:

  1. データセットの選定と処理:47種類の主要な暗号通貨が選ばれ、これらの通貨は市場全体の約90%の市場資本化を占めています。日々の価格変動(上昇は1、下降は0)がデータセットとして用いられます。
  2. バイナリ複雑性-エントロピー平面(BiCEP)の定義:この平面は、各暗号通貨の価格変動のパターンから計算されるエントロピー(無秩序の尺度)と複雑性(パターンの多様性や予測困難性の尺度)を軸に展開されます。具体的には、エントロピーは価格変動のランダム性を、複雑性は価格変動のパターンの非一様性をそれぞれ表しています。
  3. 非効率スコアIIIの導出:各暗号通貨はBiCEP上での位置に基づいて評価され、その位置から計算される非効率スコアIIIによってランキングされます。このスコアは、暗号通貨の市場効率性を数値的に示すもので、スコアが高いほど非効率性が大きいとされます。
  4. 結果の解釈:分析結果によると、Shiba Inu(SHIB)だけが顕著な非効率性を示しており、その他の暗号通貨は比較的効率的な運用がされていることが明らかになりました。これは、暗号通貨の設計や合意形成アーキテクチャがその効率性に重要な役割を果たしていることを示唆しています。

この研究は、暗号通貨市場の動態を理解する上で新たな視角を提供し、特に市場の非効率性がどのように暗号通貨の設計や市場構造に依存するかを明らかにしています。また、この分析手法は他の金融市場や異なる種類のデータセットにも応用可能であり、広範な研究や実践の場での利用が期待されています。

噛み砕いた解説

この論文は、暗号通貨市場における非効率性を数学的に分析する新しい方法を紹介しています。ここでいう「非効率性」とは、市場の価格変動がどれだけ予測可能か、またはランダムかを数値で示すことです。この分析には「バイナリ複雑性-エントロピー平面(BiCEP)」という手法が使われています。ここで、簡単に各ステップを説明します:

1. データセットの選定と処理

  • 何をしたの?
    • 論文では、市場の大部分を占める47種類の主要な暗号通貨を分析対象として選んでいます。これらの暗号通貨の価格変動(価格が上がれば1、下がれば0として記録)を使って分析を行います。

2. バイナリ複雑性-エントロピー平面(BiCEP)の定義

  • 何を分析するの?
    • この手法では、暗号通貨の価格がどれだけランダムに動いているか(エントロピー)、そして価格変動がどれだけパターン化されているか(複雑性)を計算します。エントロピーが高いと、価格変動が非常にランダムで予測が難しいことを意味し、複雑性が高いと、価格変動に一定のパターンや規則性があることを示します。

3. 非効率スコアIIIの導出

  • 何を評価するの?
    • 各暗号通貨は上記の方法で計算されたエントロピーと複雑性に基づいて、その非効率性を数値で評価されます。この「非効率スコアIII」と呼ばれる数値が高いほど、その暗号通貨の市場が非効率的であるとされます。

4. 結果の解釈

  • 何がわかるの?
    • 分析の結果、Shiba Inu(SHIB)という暗号通貨だけが特に非効率性が高いことが明らかになりました。これは、Shiba Inuの市場が予測しにくく、価格変動にランダムな動きが多いことを示しています。他の暗号通貨は比較的効率的に動いており、市場の設計や管理の仕組みがその効率性に大きく影響していることが示唆されています。

まとめ

この研究は、暗号通貨の市場がどのように動いているかを数学的に分析し、特定の暗号通貨がどれだけ効率的に運用されているかを明らかにする手法を提供しています。この手法は他の金融市場やデータセットにも適用可能で、市場の深い理解やさらなる研究につながる可能性があります。

考案されるアプローチ

この論文から得られる知見を仮想通貨の自動取引bot開発に転用する場合、以下のようなアプローチが考えられます:

  1. 非効率性の識別と利用
    • 非効率スコアIIIの活用:論文で定義された非効率スコアIIIを利用して、特定の暗号通貨が市場平均と比べてどれだけ非効率的に動いているかを評価します。このスコアが高い通貨は、予測可能なパターンや繰り返し発生する特定の市場動向を示している可能性があるため、自動取引botのアルゴリズムで特に監視し、利益を得るチャンスとして利用できます。
  2. 複雑性とエントロピーを用いた市場状態の分析
    • 市場のランダム性と構造性の分析:複雑性とエントロピーを分析することで、市場がどの程度予測可能か(ランダム性)及び市場にどの程度の構造(パターンや規則性)が存在するかを把握します。これらの情報は、botがどのタイプの戦略を適用するべきかを判断するのに役立ちます。
  3. 市場効率の評価に基づく戦略調整
    • 市場効率の変動に応じた取引戦略の最適化:市場が非効率的である時、特定の技術的指標やファンダメンタルズがより強い影響を及ぼす可能性が高まります。このような時期には、それらの指標に基づく取引戦略を強化し、市場が効率的な状態にあるときは、より多くの確率的アプローチや多様なポートフォリオ戦略を取り入れることが考えられます。
  4. アルゴリズムのバックテストと最適化
    • バイナリ複雑性-エントロピー平面を用いたバックテスト:BiCEPを用いて歴史的データに基づいたシミュレーションを行い、異なる市場条件下でのアルゴリズムのパフォーマンスを評価します。このプロセスを通じて、アルゴリズムの感度を調整し、最も効果的なパラメータ設定を見つけ出すことができます。
  5. リアルタイム市場分析と適応
    • 動的な市場分析の組み込み:市場の複雑性とエントロピーのリアルタイム分析を通じて、現在の市場状態がbotの戦略にどのように影響しているかを継続的に評価します。市場の状態が変化した場合、botは自動的にその変化に適応し、最適な取引決定を行うように設計されます。
Yodaka

これらのアプローチを通じて、仮想通貨の自動取引botは市場の非効率性を利用して利益を最大化すると同時に、市場の変動に強い適応性を持たせることが可能であると考えられます。

コードフレームワーク

以下は、上記のアイデアを実装するための基本的なコードフレームワークです。この例では、暗号通貨のデータを取得し、バイナリ複雑性-エントロピー平面(BiCEP)を計算し、非効率スコアIIIを求めるプロセスを実行します。このコードはデモンストレーション用であり、実際のトレーディング環境にはさらに多くの詳細なロジックが必要です。

まず、必要なライブラリをインポートし、データを取得する部分から始めます。

import numpy as np
import pandas as pd
from scipy.stats import entropy
from sklearn.preprocessing import MinMaxScaler

# 暗号通貨の価格データを取得するためのダミー関数(実際にはAPIから取得することが多い)
def fetch_crypto_data(symbol, start_date, end_date):
    # この部分は例えばBinance APIを使って実データを取得するコードに置き換える
    # ここではランダムデータを生成して使用
    dates = pd.date_range(start=start_date, end=end_date)
    prices = np.random.lognormal(mean=0, sigma=0.1, size=len(dates))
    return pd.DataFrame(data={'Date': dates, 'Close': prices})

# バイナリ複雑性-エントロピー平面(BiCEP)を計算する関数
def calculate_bicep(data):
    # 価格データから日次の変化(上昇: 1, 下降: 0)を計算
    data['Binary'] = (data['Close'].diff() > 0).astype(int)
    
    # バイナリ列からエントロピーを計算
    p_data = data['Binary'].value_counts(normalize=True)
    entropy_value = entropy(p_data, base=2)
    
    # 複雑性の計算(ここでは単純な例としてエントロピーのみを使用)
    complexity = entropy_value * (1 - entropy_value)  # 簡単な例
    
    return entropy_value, complexity

# 非効率スコアIを計算する関数
def calculate_inefficiency_score(entropy, complexity, ideal_entropy=1, ideal_complexity=0):
    inefficiency = np.sqrt((complexity - ideal_complexity)**2 + (entropy - ideal_entropy)**2)
    return inefficiency

# メイン処理
symbol = 'BTC'
start_date = '2022-01-01'
end_date = '2022-12-31'
data = fetch_crypto_data(symbol, start_date, end_date)
entropy_value, complexity = calculate_bicep(data)
inefficiency_score = calculate_inefficiency_score(entropy_value, complexity)

print(f"Entropy: {entropy_value:.4f}, Complexity: {complexity:.4f}, Inefficiency Score: {inefficiency_score:.4f}")

このコードは次のステップで構成されています:

  1. 暗号通貨の価格データを取得する(ここではダミーデータを生成)。
  2. 日次の価格変動を元にバイナリ列を生成し、そのバイナリ列からエントロピーと複雑性を計算します。
  3. エントロピーと複雑性を基に非効率スコアIIIを算出します。

実際の運用には、APIからのデータ取得、より高度なエラー処理、さらに複雑な複雑性計算メソッドの導入など、さまざまな拡張が必要になります。また、実際の取引戦略に組み込むためには、このスコアをトリガーとして利用するロジックも必要です。

挙動解説

上記のコードは、仮想通貨の価格データを分析し、そのデータからバイナリ複雑性-エントロピー平面(BiCEP)を計算し、最終的にそのデータの非効率スコアIIIを求めるプロセスを行っています。以下に各セクションの詳細な説明を記します:

1. 必要なライブラリのインポートとデータ取得関数

  • インポート
    • numpypandas はデータ操作と数学的計算のために使用されます。
    • scipy.statsentropy 関数は、確率分布のエントロピーを計算するために使用されます。
    • sklearn.preprocessingMinMaxScaler は使われていませんが、通常データのスケーリングに使用されることが多いです。
  • データ取得関数 (fetch_crypto_data)
    • 暗号通貨のシンボル、開始日、終了日を引数として取り、指定された期間の価格データを返します。
    • 実際のデータソースと接続する部分(例えばAPI)はダミーのランダムデータを生成してシミュレートされています。
    • 返されるデータフレームには日付と終値(Close)が含まれています。

2. バイナリ複雑性-エントロピー平面(BiCEP)の計算

  • 関数 (calculate_bicep)
    • 与えられたデータフレームから、日次の価格上昇(1)または下降(0)を示す新しいバイナリ列を生成します。
    • このバイナリデータの頻度を基にエントロピーを計算し、市場のランダム性を評価します。
    • 複雑性はここではエントロピーの関数として計算されており、市場データのパターンの非一様性を示します。

3. 非効率スコアIIIの計算

  • 関数 (calculate_inefficiency_score)
    • エントロピーと複雑性から理想的な値(完全なランダム性と0の複雑性)までのユークリッド距離を計算します。
    • この距離は、市場の効率性からどれだけ離れているかを示す非効率スコアIIIとして解釈されます。

4. メイン処理

  • メイン処理
    • 特定の暗号通貨(ここでは「BTC」)の特定期間の価格データを取得します。
    • 取得したデータを用いてBiCEPを計算し、その結果から非効率スコアを導出します。
    • 最終的なエントロピー、複雑性、非効率スコアを出力します。

このコードの実行結果は、特定の暗号通貨の市場行動がどれだけ効率的または非効率的であるかを数値的に評価するための洞察を提供します。この分析は、特定の市場条件下での自動取引戦略の設計や調整に役立つ可能性があります。

修正版

実際の取引所のAPIを使用して暗号通貨の価格データを取得し、それを分析するためのPythonコードを以下に示します。ここでは、一般的な取引所APIの一つであるCCXTライブラリを使用します。これにより、多くの取引所からデータを簡単に取得し、分析することが可能です。

以下のコードは、実際の取引所から暗号通貨の価格データを取得し、そのデータを分析するために必要な変更を加えたものです。

import ccxt
import pandas as pd
from scipy.stats import entropy
import numpy as np

# 暗号通貨の価格データを取得する関数
def fetch_crypto_data(exchange_id, symbol, timeframe, since, limit):
    exchange_class = getattr(ccxt, exchange_id)
    exchange = exchange_class({'rateLimit': 2000, 'enableRateLimit': True})
    # ISO8601形式の日付に変換
    since = exchange.parse8601(since)
    # OHLCVデータの取得
    ohlcv = exchange.fetch_ohlcv(symbol, timeframe, since, limit)
    data = pd.DataFrame(ohlcv, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume'])
    data['timestamp'] = pd.to_datetime(data['timestamp'], unit='ms')
    data.set_index('timestamp', inplace=True)
    return data

# バイナリ複雑性-エントロピー平面(BiCEP)を計算する関数
def calculate_bicep(data):
    data['binary'] = (data['close'].diff() > 0).astype(int)
    p_data = data['binary'].value_counts(normalize=True)
    entropy_value = entropy(p_data, base=2)
    complexity = entropy_value * (1 - entropy_value)
    return entropy_value, complexity

# 非効率スコアIを計算する関数
def calculate_inefficiency_score(entropy, complexity, ideal_entropy=1, ideal_complexity=0):
    inefficiency = np.sqrt((complexity - ideal_complexity)**2 + (entropy - ideal_entropy)**2)
    return inefficiency

# メイン処理
exchange_id = 'binance'
symbol = 'BTC/USDT'
timeframe = '1d'
since = '2021-01-01T00:00:00Z'
limit = 500

data = fetch_crypto_data(exchange_id, symbol, timeframe, since, limit)
entropy_value, complexity = calculate_bicep(data)
inefficiency_score = calculate_inefficiency_score(entropy_value, complexity)

print(f"Entropy: {entropy_value:.4f}, Complexity: {complexity:.4f}, Inefficiency Score: {inefficiency_score:.4f}")

コードの説明

  • APIを使用してデータを取得fetch_crypto_data 関数は、指定された取引所から特定のシンボルのOHLCVデータを取得します。ccxt ライブラリを利用して、簡単に多様な取引所からデータを取得できます。
  • データ分析:取得したデータに対して、価格の日次変動を基にバイナリ列を生成し、そのバイナリデータからエントロピーと複雑性を計算します。
  • 非効率スコアの計算:計算されたエントロピーと複雑性を基に、市場の非効率性を数値化します。

このコードは、実際の取引所データを用いた研究や、自動取引システムの開発において直接活用することができます。

おまけ:ccxtを使わないで書く

CCXTを使用せずに暗号通貨の価格データを取得する別の方法は、特定の取引所が提供するAPIを直接利用することです。多くの取引所が独自のAPIを提供しており、これを使ってデータを取得することが可能です。ここでは、BinanceのAPIを例に、Pythonで直接HTTPリクエストを送ってデータを取得する方法を示します。このためには、requests ライブラリを使用します。

以下のコードは、Binance APIを直接呼び出して暗号通貨の価格データを取得し、そのデータを分析する方法を示しています。

import requests
import pandas as pd
from scipy.stats import entropy
import numpy as np

# 暗号通貨の価格データを取得する関数
def fetch_crypto_data(symbol, interval, limit):
    url = f'https://api.binance.com/api/v3/klines'
    params = {
        'symbol': symbol,
        'interval': interval,
        'limit': limit
    }
    response = requests.get(url, params=params)
    data = response.json()
    df = pd.DataFrame(data, columns=['open_time', 'open', 'high', 'low', 'close', 'volume', 'close_time', 'quote_asset_volume', 'number_of_trades', 'taker_buy_base_asset_volume', 'taker_buy_quote_asset_volume', 'ignore'])
    df['close'] = df['close'].astype(float)
    df['open_time'] = pd.to_datetime(df['open_time'], unit='ms')
    df.set_index('open_time', inplace=True)
    return df

# バイナリ複雑性-エントロピー平面(BiCEP)を計算する関数
def calculate_bicep(data):
    data['binary'] = (data['close'].diff() > 0).astype(int)
    p_data = data['binary'].value_counts(normalize=True)
    entropy_value = entropy(p_data, base=2)
    complexity = entropy_value * (1 - entropy_value)
    return entropy_value, complexity

# 非効率スコアIを計算する関数
def calculate_inefficiency_score(entropy, complexity, ideal_entropy=1, ideal_complexity=0):
    inefficiency = np.sqrt((complexity - ideal_complexity)**2 + (entropy - ideal_entropy)**2)
    return inefficiency

# メイン処理
symbol = 'BTCUSDT'
interval = '1d'
limit = 500

data = fetch_crypto_data(symbol, interval, limit)
entropy_value, complexity = calculate_bicep(data)
inefficiency_score = calculate_inefficiency_score(entropy_value, complexity)

print(f"Entropy: {entropy_value:.4f}, Complexity: {complexity:.4f}, Inefficiency Score: {inefficiency_score:.4f}")

コードの説明

  • データ取得fetch_crypto_data 関数は、Binanceの公開APIエンドポイントにHTTP GETリクエストを送信して価格データを取得します。取得したデータはJSON形式で返され、Pandas DataFrameに変換されます。
  • データ分析と非効率スコア計算:この部分はCCXTを使う場合と同様に、取得したデータから日次の価格変動を分析し、非効率スコアを計算します。

この方法は、特定の取引所に依存しますが、CCXTのように多くの取引所に一括で対応するライブラリを使わない場合の一例として参考になります。

上記のコードの優位性

直接取引所のAPIを使用してデータを取得する方法には、CCXTライブラリを使用する方法と比較していくつかの優位性があります。ここではその主な利点を挙げてみましょう:

1. APIのカスタマイズと柔軟性

取引所のAPIを直接利用することで、APIが提供する全ての機能やデータを最大限に活用できます。CCXTなどの統合ライブラリでは、サポートされている機能が限られている場合があり、特定の詳細なデータや特殊なAPIエンドポイントへのアクセスが制限されることがあります。直接APIを使うことで、APIの提供する全てのパラメータを細かく調整し、必要なデータを正確に取得できるようになります。

2. 依存性と更新の管理

APIを直接使用する場合、外部ライブラリに依存しないため、そのライブラリが更新されることによる影響を受けにくくなります。CCXTのようなライブラリは頻繁に更新されることがあり、突然の非互換性やバグが導入されるリスクがあります。直接APIを使用すれば、取引所のAPI仕様にのみ依存するため、このようなリスクを抑えることができます。

3. パフォーマンス

外部ライブラリを介さず直接APIにアクセスすることで、処理のオーバーヘッドを減らすことが可能です。特に大量のデータを頻繁に取得する場合、中間ライブラリを介することなく直接APIを叩く方が効率的で、レスポンスタイムの短縮が期待できます。

4. エラーハンドリングとデバッグ

APIからの直接的なレスポンスを利用することで、エラーが発生した際の原因究明が容易になる場合があります。ライブラリを介すると、時にエラーメッセージが抽象化されたり、重要な情報が省略されたりすることがあります。直接APIを叩く場合、エラーの内容を取引所から直接得られるため、問題解決がスムーズに進むことがあります。

5. セキュリティ

APIキーの管理がライブラリを介さずに行えるため、セキュリティの観点から直接管理したほうが望ましい場合があります。特に金融関連のデータアクセスにおいては、セキュリティは非常に重要です。自分でコントロールすることで、セキュリティのリスクを把握しやすくなります。

これらの利点は、特にカスタムトレーディングソリューションや特定のニーズに特化したアプリケーションを開発する際に、重要な要素となります。ただし、これらの利点を享受するためには、API仕様の理解やHTTP通信の実装に関する知識が必要になります。また、複数の取引所に対応する場合は、それぞれのAPIの違いを管理する必要があるため、その点には注意が必要です。

まとめ

最近は論文ベースで1日1bot作っています。

論文から得た知見を即座にbotに落とし込むのは、開発アイデアを広げるための良い訓練にもなりますね。

今後もこの調子でbot開発の状況を発信していきます。

-Bot