Python {Article155}

ようこそ「Python」へ...

仮想通貨BOTの基本:Market Cap Top 10をPlotly Expressで視覚化しよう

本記事では仮想通貨のBOTを作成するための基本知識として、 仮想通貨のMarket Cap(時価総額)を調べる方法を解説します。 一般に仮想通貨のトレードを行うときは、「時価総額(Market Cat)」、「取引量(Volume)」、 「プロジェクトの実用性と将来性」、「コミュニティと開発チーム」、「技術的な分析 (Technical Analysis)」、 「ファンダメンタルズ分析 (Fundamental Analysis)」などを調べてどの仮想通貨にするかを選択します。

これらの項目の中でもっとも優先されるのが「時価総額」です。 なぜなら、高い時価総額を持つ仮想通貨は安定性と流動性が高いためです。

ここでは、「CoinGecko API」を使用して仮想通貨のMarket Capデータを取得します。 そして、取得したデータをPlotly Expressの「sunburnst()」メソッドでグラフを作成(視覚化)して分析します。

本シリーズでは、MicrosoftのVisual Studio Code(VS Code)を使用します。 説明文の左側に図の画像が表示されていますが縮小されています。 画像を拡大するにはマウスを画像上に移動してクリックします。 画像が拡大表示されます。拡大された画像を閉じるには右上の[X]をクリックします。 画像の任意の場所をクリックして閉じることもできます。

【免責事項】
当記事や当サイトの情報を参考に仮想通貨のBOT(自動トレードプログラム)を動かす場合は、すべて自己責任でお願いいたします。 当サイトの情報を参考にして発生したいかなる損害も責任を負いません。
click image to zoom!
図A
click image to zoom!
図B
click image to zoom!
図C


仮想通貨BOTの基本:Market Cap Top 10をPlotly Expressで視覚化しよう

  1. CoinGeckoのAPIを使用して仮想通貨のMarket Capデータを取得する関数を作成する

    ここでは、CoinGeckoのAPIを使用して仮想通貨のMarket Capデータを取得する関数「get_top_n_crypto_market_cap()」を作成します。 この関数の引数には「top、currency」を指定します。

    たとえば、上位10位までの仮想通貨を取得するときは「top=10」を指定します。 「currency」には、時価総額(Market Cap)の通貨を指定します。 米ドルなら「usd」、日本円なら「jpy」を指定します。

    この関数では、API経由で取得したデータ(JSON形式)をPandasのDataFrameに格納して返します。 DataFrameは列「id, symbol, name, market_cap, current_price, total_volume」から構成されています。 また、DataFrameには、仮想通貨がMarket Capの昇順に格納されています。

    リスト1:
    
    import requests
    import numpy as np
    import pandas as pd
    import plotly.io as pio
    import plotly.express as px
    import plotly.graph_objects as go
    
    
    #########################################################################
    def get_top_n_crypto_market_cap(top: 20, currency='usd') -> pd.DataFrame:
        global data
        
        # CoinGecko API endpoint for top 100 coins by market cap
        url = 'https://api.coingecko.com/api/v3/coins/markets'
        
        # Parameters for the API request
        params = {
            'vs_currency': currency,
            'order': 'market_cap_desc',
            'per_page': top,    # 'per_page': 20  (default value set in function definition)
            'page': 1,
            'sparkline': 'false'
        }
        
        # Sending a request to the API
        response = requests.get(url, params=params)
        
        # Converting the response to JSON
        data = response.json()
    
        # Creating a list of dictionaries with the relevant data
        
        crypto_data = []
        
        for item in data:
            crypto_data.append({
                'id': item['id'],
                'symbol': item['symbol'],
                'name': item['name'],
                'market_cap': item['market_cap'],
                'current_price': item['current_price'],
                'total_volume': item['total_volume']
            })
        
        # Creating a pandas dataframe from the list of dictionaries
        df = pd.DataFrame(crypto_data)
        
        return df
    

    click image to zoom!
    図1-1
    図1-1では、json形式のデータ(data)を表示しています。 ここでは、VS Codeの「インタラクティブ・ウィンドウ」から「data」を入力して表示しています。 「data」には、仮想通貨のさまざまなデータが格納されていますが、 ここでは、「id, symbol, name, market_cap, current_price, total_volume」を抽出してDataFrameに格納しています。


    click image to zoom!
    図1-2
    図1-2では、DataFrameに格納されて内容を表示しています。 DataFrameは、列「id, symbol, name, market_cap, current_price, total_volume」から構成されています。 ここでは、「get_top_n_crypto_market_cap()」の引数に「top=5」を指定しているので上位5までの仮想通貨が表示されています。


  2. 仮想通貨のMarket Cap Top 10のデータを取得する

    ここでは、関数「get_top_n_crypto_market_cap()」を呼び出して、上位10位までの仮想通貨のデータを取得しています。 また、DataFrameに格納されているシンボル「symbol」を「小文字」から「大文字」に変換しています。 さらに、仮想通貨の時価総額(Market Cap)を「ビリオン(10億)」単位に変換して読みやすくしています。

    「1e9」 は10の9乗、すなわち10億を表します。 この操作によって、時価総額の値がビリオン単位になります。

    リスト2:
    
    ####################
    ### Main
    ####################
    
    # 0: Get top n crypto market cap data
    
    top = 10
    currency = 'usd'
    df = get_top_n_crypto_market_cap(top, currency)
    
    # Convert symbol values to uppercase
    df['symbol'] = df['symbol'].str.upper()
    
    # Convert market cap values to billions for better readability
    df['market_cap'] = df['market_cap'] / 1e9
    

    click image to zoom!
    図2-1
    図2-1では、「get_top_n_crypto_market_cap()」関数で取得したDataFrameの構造と内容を表示しています。 列「symbol」は大文字に変換されています。 また時価総額(market_cap)は、「10億」単位になっています。


  3. Plotly Expressのsunburst()メソッドで仮想通貨のMarket Cap Top 10を視覚化する

    ここでは、前出のデータ(df)を元にPlotly Expressの「sunburst()」メソッドでグラフを作成しています。 ここでは、デフォルトの設定でグラフを作成しています。 後述するステップでこのグラフをカスタマイズします。

    リスト3:
    
    # 1: Draw sunburst() with default mode
    
    fig = px.sunburst(df, 
                path=['name','symbol'],
                values='market_cap',            
                hover_name='name',
                color='market_cap',
                height=700,
                labels=dict(market_cap='Market Cap', id='Crypto', symbol='Symbol'),            
                title=f"Top {top} Crypto Market Cap ({currency.upper()} Billion)")
    
    fig.show()
    
    

    click image to zoom!
    図3-1
    図3-1には、DataFrameに格納されている仮想通貨の時価総額がグラフに表示されています。 このグラフから時価総額の順位が「BTC, ETH, USDT,..」の順になっていることが分かります。


  4. Plotly Expressのsunburst()メソッドをカスタマイズする

    ここでは、前出のグラフをカスタマイズして見やすくしています。 カスタマイズの内容は、図の解説で説明します。

    リスト4:
    
    # 2: Add custom color scale and apply dark theme
    
    # Custom color scale
    custom_colorscale = [
        [0.0, 'rgb(165,0,38)'],
        [0.1111111111111111, 'rgb(215,48,39)'],
        [0.2222222222222222, 'rgb(244,109,67)'],
        [0.3333333333333333, 'rgb(253,174,97)'],
        [0.4444444444444444, 'rgb(254,224,144)'],
        [0.5555555555555556, 'rgb(224,243,248)'],
        [0.6666666666666666, 'rgb(171,217,233)'],
        [0.7777777777777778, 'rgb(116,173,209)'],
        [0.8888888888888888, 'rgb(69,117,180)'],
        [1.0, 'rgb(49,54,149)']
    ]
    
    fig = px.sunburst(df, 
                path=['name','symbol'],
                values='market_cap',            
                hover_name='name',
                color='market_cap',
                height=700,
                labels=dict(market_cap='Market Cap', id='Crypto', symbol='Symbol'),            
                title=f"Top {top} Crypto Market Cap ({currency.upper()} Billion)",
                color_continuous_scale=custom_colorscale)   # Apply the custom color scale 
    
    # Update the text color and font name of labels
    fig.update_traces(textfont=dict(color='white', family='Arial', size=18))  # Change 'white' and 'Arial' to your preferences
    
    # Updating layout to dark theme
    fig.update_layout(
        template='plotly_dark',
        title_font_size=24,
        title_font_color='white',   
        paper_bgcolor='black',
        plot_bgcolor='black'
    )
    
    fig.show()
    

    click image to zoom!
    図4-1
    「fig.update_layout()」では、Plotly Expressのテーマを「ダークモード」に設定しています。 「fig.update_traces()」では、ラベルの色、フォント、フォントサイズ」を設定してカスタマイズしています。

    また、Plotly Expressの「sunburst()」メソッドの引数には、 「color_continuous_scale=custom_colorscale」を追加してカスタム・カラー・スケールを適用しています。


    click image to zoom!
    図4-2
    図4-2には、マウスを「BTC」上にホバリングして「ラベル」情報を表示しています。


    click image to zoom!
    図4-3
    図4-3では、前出の図4-2から「SOL」をクリックして仮想通貨「Solana」を拡大表示しています。


  5. この記事で紹介している全てのソースコードを掲載

    ここでは、本記事で解説している全てのコードを掲載しています。 コード内にコメント「#%%」が挿入されていますが、 これはセル単位でコードを実行するときに必要になります。 コードをセル単位で実行するには、セル(「#%%」で囲まれた部分」)を選択して[Ctrl + Enter]で実行します。 すると、VS Codeの右側の「インタラクティブ・ウィンドウ」に実行結果が表示されます。

    「インタラクティブ・ウィンドウ」からは、Pythonのコードを入力して[Shift + Enter」で実行させることもできます。

    リスト5:
    
    # Article155-00:
    #%%
    import requests
    # import json
    # import urllib.request
    import numpy as np
    # import math
    import pandas as pd
    import plotly.io as pio
    import plotly.express as px
    import plotly.graph_objects as go
    
    comment_out = True
    
    #########################################################################
    def get_top_n_crypto_market_cap(top: 20, currency='usd') -> pd.DataFrame:
        global data
        
        # CoinGecko API endpoint for top 100 coins by market cap
        url = 'https://api.coingecko.com/api/v3/coins/markets'
        
        # Parameters for the API request
        params = {
            'vs_currency': currency,
            'order': 'market_cap_desc',
            'per_page': top,    # 'per_page': 20  (default value set in function definition)
            'page': 1,
            'sparkline': 'false'
        }
        
        # Sending a request to the API
        response = requests.get(url, params=params)
        
        # Converting the response to JSON
        data = response.json()
    
        # Creating a list of dictionaries with the relevant data
        
        crypto_data = []
        
        for item in data:
            crypto_data.append({
                'id': item['id'],
                'symbol': item['symbol'],
                'name': item['name'],
                'market_cap': item['market_cap'],
                'current_price': item['current_price'],
                'total_volume': item['total_volume']
            })
        
        # Creating a pandas dataframe from the list of dictionaries
        df = pd.DataFrame(crypto_data)
        
        return df
    
    ####################
    ### Main
    ####################
    
    # 0: Get top n crypto market cap data
    
    top = 10
    currency = 'usd'
    df = get_top_n_crypto_market_cap(top, currency)
    
    # Convert symbol values to uppercase
    df['symbol'] = df['symbol'].str.upper()
    
    # Convert market cap values to billions for better readability
    df['market_cap'] = df['market_cap'] / 1e9
    
    
    #%%
    
    # 1: Draw sunburst() with default mode
    
    fig = px.sunburst(df, 
                path=['name','symbol'],
                values='market_cap',            
                hover_name='name',
                color='market_cap',
                height=700,
                labels=dict(market_cap='Market Cap', id='Crypto', symbol='Symbol'),            
                title=f"Top {top} Crypto Market Cap ({currency.upper()} Billion)")
    
    fig.show()
    
    
    #%%
    
    # 2: Add custom color scale and apply dark theme
    
    # Custom color scale
    custom_colorscale = [
        [0.0, 'rgb(165,0,38)'],
        [0.1111111111111111, 'rgb(215,48,39)'],
        [0.2222222222222222, 'rgb(244,109,67)'],
        [0.3333333333333333, 'rgb(253,174,97)'],
        [0.4444444444444444, 'rgb(254,224,144)'],
        [0.5555555555555556, 'rgb(224,243,248)'],
        [0.6666666666666666, 'rgb(171,217,233)'],
        [0.7777777777777778, 'rgb(116,173,209)'],
        [0.8888888888888888, 'rgb(69,117,180)'],
        [1.0, 'rgb(49,54,149)']
    ]
    
    fig = px.sunburst(df, 
                path=['name','symbol'],
                values='market_cap',            
                hover_name='name',
                color='market_cap',
                height=700,
                labels=dict(market_cap='Market Cap', id='Crypto', symbol='Symbol'),            
                title=f"Top {top} Crypto Market Cap ({currency.upper()} Billion)",
                color_continuous_scale=custom_colorscale)   # Apply the custom color scale 
    
    # Update the text color and font name of labels
    fig.update_traces(textfont=dict(color='white', family='Arial', size=18))  # Change 'white' and 'Arial' to your preferences
    
    # Updating layout to dark theme
    fig.update_layout(
        template='plotly_dark',
        title_font_size=24,
        title_font_color='white',   
        paper_bgcolor='black',
        plot_bgcolor='black'
    )
    
    fig.show()
    
    
    # %%