見出し画像

メイカー手数料で本当に稼げるのか検証 ーGMOコイン編ー


いきなりですが、みなさんメイカー手数料はご存知でしょうか?
メイカーとは、取引板に指値を出すことで新たに注文を並べ、市場に流動性を提供する取引参加者のことを指します。
メイカー手数料とは、メイカーが出した注文が約定した時に発生する手数料のことを言います。
取引所によっては、この手数料をマイナスで設定しています。
つまり、手数料を取引所から受け取ることができるのです。
手数料を主な収益として見込むことができるのか、というテーマで検証してみます。

はじめに


まずなぜこの記事を書くに至ったかを説明すると、仮想通貨のメイカー手数料の記事があまりなかったため、情報として残そうと思ったからです。
あとは、Google検索のサジェストに「メイカー手数料で稼ぐ」という文言があり、あっさり釣られて検証してしまったので、供養する意味合いもあります。
さて、早速「メイカー手数料で稼げるのか否か」の中身に移ろうかと思いますが、本記事は結構文量が多いので、はじめに結論を書いておきます。

稼げません。

はい。検証の結果、望ましい結果を得ることはできませんでした。要するにメイカー手数料に対して、明確なエッジを見出すことができなかったということです。ただし、私の検証に穴があり、誤った結論に行き着いている可能性もございますので、その際はぜひコメントなどでご指摘いただけますと幸いです。


説明


この章は、今回のロジックを理解するのに必要な前提的な説明を行います。
メイカー手数料周りをすでに理解している方は、飛ばしていただいて結構です。

メイカー/テイカー
板注文の約定に際して、メイカーの他にテイカーが存在します。テイカーとは、メイカーが出した板注文に対して発注する相手側の取引参加者のことを指します。メイカーが流動性を提供する(Makeする)のに対して、テイカーは流動性を受け取ります(Takeする)。

手数料
メイカー手数料の他に、テイカー手数料も存在します。市場から流動性を奪う行為をしているので、基本的に手数料はプラスになり、約定のたびに支払うことになります。また、この手数料がかかるのは現物取引のみがほとんどです。レバレッジ取引などは、この類の手数料はかかりません。

手数料の計算式
ベタですが、メイカー手数料 = 売買代金 × 手数料率 で計算されます。ここで何が言いたいかというと、手数料でスケールするためには売買代金をある程度掛ける必要があるということです。少額ロットにして価格変動リスクを抑えた分だけ、獲得できる手数料は目減りしていくというトレードオフの関係になります。

取引所
メイカー/テイカー手数料を設定している取引所は限られています。海外の有名どころではBitMEXやbitbankなどがあります。国内ではGMOコインが筆頭です。今回はGMOコインで検証します。別の機会に、BitMEXも検証してみたいと思います。

取引通貨
GMOコインの例を用いて説明します。ビットコインとアルトコインを扱っていますが、通貨ごとに手数料が異なります。メイカー手数料は-0.01%と-0.03%の2パターンがあります。純粋なメイカー戦略では、1回の売買で往復分(上記の2倍)の手数料を獲得できます。今回は、手数料メインのため-0.03%のアルトコイン、加えて取引出来高の観点から、ビットコインキャッシュ(BCH)を中心に検証します。各通貨の詳細は以下の公式サイトにあります。

Post-Only
今回のバックテスト検証では用いませんが、実運用時に重要な概念を紹介します。メイカー手数料を狙うため、当然ながら全て指値注文で発注しますが、場合によってはメイカーではなくテイカーとして扱われてしまうケースがあります。指値距離が小さすぎたり、注文が全部約定しないケースなどです。その際に、Post-Onlyというオプションを執行することで、確実にメイカーとしての注文を実行することができます。

取扱データ
検証にあたりGMOコインのAPIを用いて、現物市場の価格データ(OHLCVデータ)を取得する必要があります。今回は15分足データを使います。
ただし、GMOコインの公式APIの仕様書を見れば分かる通り、ヒストリカルデータのOHLCVの取得には15分足の場合、1日間のデータしか取れないという制限が存在します。そのため、やや専門的になりますがwhile文を用いて一定期間のデータを取得する必要があります。
以下、APIからOHLCVデータを取得してファイルに保存するコード例を載せるので、行き詰まる場合は参考にどうぞ。一応引数を変えるだけで、1分足、BTC、などなど様々な価格データが取れるような設計になっています。

# ライブラリのインポート
import requests
import json
import datetime

# GMOコインAPIからOHLCVデータを取得する関数
def get_price_from_GMO(symbol, min):

    price = []
    params = {"periods" : min}
    start_date = datetime.date(2022, 1, 1)    # 開始日時の設定
    end_date = datetime.date(2022, 6, 30)     # 終了日時の設定
    total_date = end_date - start_date        # 期間日時の計算
    
    endPoint = 'https://api.coin.z.com/public'   # エンドポイントの設定
    
    Date = 0
    # 期間日時の間、ループで価格データを取得
    while Date < total_date.days + 1:
        
        start_date = start_date.strftime("%Y%m%d")   # APIの仕様に変形させる
        path = '/v1/klines?symbol={0}&interval={1}&date={2}'.format(symbol, min, start_date)   # パスの設定

        response = requests.get(endPoint + path)
        data = response.json()

        while True:
            for i in data["data"]:
                if i["volume"] is not None:   # 出来高が存在している場合のみ、ティック情報が存在する
                    price.append({"close_time" : int(i["openTime"])/1000,  # unix時間の調整
                                "close_time_dt" : datetime.datetime.fromtimestamp(int(i["openTime"])/1000).strftime('%Y/%m/%d %H:%M'),
                                "open_price" : float(i["open"]),
                                "high_price" : float(i["high"]),
                                "low_price" : float(i["low"]),
                                "close_price" : float(i["close"]),
                                "volume" : float(i["volume"])})
            else:
                break
        
        start_date = datetime.datetime.strptime(start_date, "%Y%m%d")
        start_date = start_date + datetime.timedelta(days=1)   # 形を戻して1日追加
        Date += 1
    
    return price


price = get_price_from_GMO('BCH', '15min')   # 関数の呼び出し、引数設定で様々なデータ取得可能
print("計{}件の価格データを取得しました".format(len(price)))

file = open("GMO_BCH_900.json", "w", encoding="utf-8")   #ファイルに書き込む
json.dump(price, file)

上記のファイルを呼び出すコードの一例も紹介します。

# GMOコインAPIを利用したデータファイルを参照する関数
def get_price_GMO_file(path, after, before):
    file = open(path, "r", encoding='utf-8')
    price = []
    data = json.load(file)
    for i in range(len(data)):
        price.append({"close_time" : data[i]["close_time"],
                    "close_time_dt" : data[i]["close_time_dt"],
                    "open_price" : data[i]["open_price"],
                    "high_price" : data[i]["high_price"],
                    "low_price" : data[i]["low_price"],
                    "close_price" : data[i]["close_price"],
                    "volume" : data[i]["volume"]})   
            
    return price[after*-1 : before*-1]

# 呼び出す場合、引数でファイル名を指定する
price = get_price_GMO_file("./GMO_BCH_900.json", 1000, 1)   # この場合、直近1000件のデータを取得


前提条件


検証期間:2022/01/01 〜 2022/06/30
仮想通貨シンボル:BCH/JPY
チャート情報:GMOコイン現物市場
使用足:15分足
トレード手法:順張り
注文管理:指値注文
指値距離:±1
ストップ(損切り):なし
初期資金:100万円
レバレッジ:1倍
1トレードあたり許容損失率:5%
スリッページ:なし
メイカー手数料:-0.03%

現物取引のため、レバレッジ倍率は1倍です。
取引回数を増やす目的で、短期的な15分足を採用しています。
同様の理由で、指値距離は非常に近く設定しています。Post-Onlyでの説明の通り、実運用時には使えないことと、あくまで実験的な数値設定であることに注意して下さい。
本番環境に近づけるため、ロット管理には出来高の条件設定を加えています。出来高に関しては結果に重要な影響を及ぼしうるので、考察にて詳述しています。
また、手数料収益の絶対額を増やすため、売買ロットを意図的に制限するリスク管理は行いません。


戦略


いくつかのシンプルなトレード戦略を考えてバックテストを回すことで、メイカー手数料に統計的エッジが存在するか確認してみます。
今回は高頻度マーケットメイク戦略、通称"mmbot"のロジックでは検証しません。考察で述べる理由ももちろんありますが、筆者の技術レベルが追いついていないためです。今後精進します。
そのため、以下の戦略はあくまで一例に過ぎないので、参考程度に見て下さい。


1.  手数料最重視パターン


今回はメイカー手数料で稼ぐと銘打っているので、まずはなるべくトレード回数を増やして、手数料の収益重視の構築を考えます。
その上でのシグナルサインは以下の通り設定します。

エントリーサイン:常に発生
エグジットサイン:常に発生

トレード回数を最大化することで、メイカー手数料に極振りします。
バックテストに関しては、以下の記事のコードを使用しています。

結果は以下の通りです。

--------------------------
テスト期間:
開始時点 : 2022/01/01 06:00
終了時点 : 2022/07/01 05:30
12471件のローソク足データで検証
--------------------------
バックテストの結果
--------------------------
総合の成績
--------------------------
全トレード数      :  1371回
勝率            :  16.4%
平均リターン      :  -0.51%
平均保有期間      :  1.7足分
損切りの回数      :  0回

最大の勝ちトレード :  21613円
最大の負けトレード :  -54277円
最大ドローダウン   :  -1000739円/-100.0%
最大連敗回数      :  21回
利益合計         :  132008円
損失合計         :  -1131880円
最終損益         :  -999872円

初期資金         :  1000000円
最終資金         :  128円
運用成績         :  0.01%
手数料合計       :  60942円
-----------------------------------
各成績指標
-----------------------------------
CAGR(年間成長率)     :  -98.8%
MARレシオ           :  -1.0
シャープレシオ        :  -0.67
プロフィットファクター :  0.12
損益レシオ           :  0.39
資産曲線の推移

見ての通り、散々な結果に終わりました。
複利運用のため、完全にゼロにはならないものの、1ヶ月と持ちませんでした。
トレードでの損失が大きすぎて、メイカー手数料での利益がほとんど機能していません。
なぜ、これほど圧倒的な損失を被ってしまうのかは、後半の考察にて自分なりの考えを記しています。


2.  トレード利益重視パターン


手数料だけを考えて、参入/退出シグナルを全く考慮しない場合は、上記の通り多大な損失を残す結果になりました。
では、トレードでの損益を考慮し、シグナルサインの条件を絞った場合を検証してみましょう。

エントリーサイン:常に発生
エグジットサイン:終値がエントリー時の価格*0.9997を上回る

エントリー時の価格*0.9997とは、メイカー手数料の-0.03%を加味した上での利確ラインを指します。
また、一定期間シグナル条件が満たされない場合の含み損の拡大を止めるため、時限ストップも設定しておきます。

エグジットサイン2:ポジション保有から400足経過(100時間相当)

それではバックテストの結果を見てみましょう。

--------------------------
テスト期間:
開始時点 : 2022/01/01 06:00
終了時点 : 2022/07/01 05:30
12471件のローソク足データで検証
--------------------------
バックテストの結果
--------------------------
総合の成績
--------------------------
全トレード数      :  221回
勝率            :  90.0%
平均リターン      :  -0.85%
平均保有期間      :  53.4足分
損切りの回数      :  0回

最大の勝ちトレード :  22199円
最大の負けトレード :  -250727円
最大ドローダウン   :  -904790円/-89.6%
最大連敗回数      :  3回
利益合計         :  338757円
損失合計         :  -1232237円
最終損益         :  -893480円

初期資金         :  1000000円
最終資金         :  106520円
運用成績         :  10.65%
手数料合計       :  33187円
-----------------------------------
各成績指標
-----------------------------------
CAGR(年間成長率)     :  -66.86%
MARレシオ           :  -1.0
シャープレシオ        :  -0.2
プロフィットファクター :  0.27
損益レシオ           :  0.03

先程より結果は向上しましたが、期待値がマイナスであることには変わり無いようです。
資産曲線を見れば、特に期間後半での急落が顕著に見えます。
仮想通貨市場全体が下げ局面を迎えている中で、エグジット条件を達成する前に含み損が拡大し、大きな負けが頻出しているようです。


3.  さらに条件を厳しくするパターン


ポジションを取る上でさらに条件を厳しくするために、エントリーサインにも手を入れてみましょう。
基本的にメイカー戦略が得意とする相場は、トレンド相場ではなく、レンジ相場にあります。
そのため、エントリー時にレンジ相場を判断するために、ボラティリティが一定以下の場合のみトレードに参入することにします。ボラティリティは平均化の意味でもATRを用います。少し面倒ですが、ATRの標準偏差を求めて基準値とすることで、統計学的な工夫を持たせます。(参考値:対象全期間における14期間ATRの平均値は156.67、標準偏差は77.41でした)
エグジット時は、レンジ相場を脱したと判断した場合をシグナル発生条件とします。
あくまで手数料メインなので、それ以外での制限はかけずに一定のトレード回数を担保します。

エントリーサイン:ATRが-1σ以下
エグジットサイン:ATRが-1σ以上
エグジットサイン2:ポジション保有から400足経過(100時間相当)

統計量を新たに作成した上での結果は以下の通りです。

--------------------------
テスト期間:
開始時点 : 2022/01/01 06:00
終了時点 : 2022/07/01 05:30
12471件のローソク足データで検証
--------------------------
バックテストの結果
--------------------------
総合の成績
--------------------------
全トレード数      :  81回
勝率            :  24.7%
平均リターン      :  -0.86%
平均保有期間      :  13.0足分
損切りの回数      :  0回

最大の勝ちトレード :  13984円
最大の負けトレード :  -43744円
最大ドローダウン   :  -231792円/-23.3%
最大連敗回数      :  12回
利益合計         :  55580円
損失合計         :  -291931円
最終損益         :  -236351円

初期資金         :  1000000円
最終資金         :  763649円
運用成績         :  76.36%
手数料合計       :  8931円
-----------------------------------
各成績指標
-----------------------------------
CAGR(年間成長率)     :  -12.45%
MARレシオ           :  -1.01
シャープレシオ        :  -0.55
プロフィットファクター :  0.19
損益レシオ           :  0.81

エントリー条件を絞ることで、先程よりも不利な条件での約定は少なくなりましたが、それでも完全なレンジ相場の絞り込みには至っていないようです。
また、トレード回数を絞ったことから、獲得手数料がわずかなものになってしまっており、やはり当初の目的であったメイカー手数料を収益として見込むには難しいようです。


考察


なぜメイカー手数料を重視した戦略ではうまくいかなかったのでしょうか。
私が考えるに、理由は大きく2つあると思います。

・流動性が低すぎる
・指値の約定条件が不利すぎる(同値撤退ができない)


流動性が低すぎる


最大の理由はこれだと思います。流動性が低い、すなわちBCH現物市場でのトレード量が小さいのです。
ある任意の期間(例えば最終日6/30)の15分ごとの出来高(volume)を記録した配列とその推移を見てみましょう。

[20.196, 2.1, 30.338, 0.998, 3.5, 6.2, 1.397, 1.0, 4.0, 0.58, 1.56, 0.2, 2.13, 5.8, 18.94, 3.0, 0.012, 1.64, 4.2, 0.01, 4.704, 2.95, 25.139, 48.12, 1.5, 7.01, 10.05, 0.22, 0.26, 2.55, 0.11, 17.822, 17.686, 0.1, 13.362, 4.0, 1.0, 3.0, 7.09, 0.1, 1.05, 8.61, 0.23, 21.679, 134.329, 27.54, 51.37, 8.164, 5.038, 4.4, 17.2, 22.019, 2.0, 10.982, 63.96, 14.23, 2.08, 4.96, 4.0, 5.0, 23.6, 3.84, 3.65, 0.01, 0.04, 5.0, 4.037, 3.06, 0.32, 6.0, 29.437, 8.0, 1.5, 5.02, 10.296, 0.213, 1.6]

さて、気付かれたでしょうか。
そうです。全体的にvolumeが小さいのです。念のためですが、これはBTCではなくBCHです。しかも、全ての足で約定しているわけではありません。
BCHの6/30時点での価格はおよそ14,000円です。6/30で計測された15分足volumeの平均は10.25です。(約定分のみで計算)
つまり、毎足平均して14,000*10.25=143,500円相当分の約定が発生しているわけですが、仮にその約定の全てを抑えたとしても、その度に獲得できる手数料は1足あたり143,500*0.03%でたったの43.05円です。
ポジション保有の度に価格変動リスクに晒されていることを考慮すれば、どれだけ微々たるものかが分かるでしょう。

ちなみに現物市場における流動性の低さはBTCも例外でなく、GMOコインの場合は6/30時点での15分足volumeの平均値が2.98です。BTCの価格を275万円(6/30参考)とすれば、1足ごとにGMOコインの現物市場全体で発生する手数料は平均820円です。(BTCの場合、メイカー手数料を-0.01%で計算)

市場全体で発生する微々たる手数料に対して、メイカーたちが限られたパイの奪い合いをしている、とも取れるのです。
パイ自体の大きさがなければ、どれだけ優れた手法を用いたとしても、大きく稼ぐことはできません。

この時点で、「メイカー手数料で稼ぐ」という当初の目標は破綻している気がしますが、ここからさらに言えば、volumeが小さいということは、ひいては発生する約定数、トレード回数が少ないことを意味します。
このことは、二次的な悪影響を市場に与えます。これが、2番目の理由である約定条件の不利性に大きく関わってきます。


指値の約定条件が不利すぎる


トレード回数が極端に少ない場合の悪影響はどう表れるでしょうか。
6/30のBCHのOHLCVデータの一部を確認してみましょう。

[{'close_time': 1656515700.0,
  'close_time_dt': '2022/06/30 00:15',
  'high_price': 14500.0,
  'low_price': 14485.0,
  'open_price': 14500.0,
  'close_price': 14485.0,
  'volume': 20.196},
 {'close_time': 1656517500.0,
  'close_time_dt': '2022/06/30 00:45',
  'high_price': 14490.0,
  'low_price': 14470.0,
  'open_price': 14490.0,
  'close_price': 14470.0,
  'volume': 2.1},
 {'close_time': 1656519300.0,
  'close_time_dt': '2022/06/30 01:15',
  'high_price': 14470.0,
  'low_price': 14378.0,
  'open_price': 14470.0,
  'close_price': 14379.0,
  'volume': 30.338},
 {'close_time': 1656520200.0,
  'close_time_dt': '2022/06/30 01:30',
  'high_price': 14375.0,
  'low_price': 14340.0,
  'open_price': 14375.0,
  'close_price': 14340.0,
  'volume': 0.998},
 {'close_time': 1656522000.0,
  'close_time_dt': '2022/06/30 02:00',
  'high_price': 14340.0,
  'low_price': 14310.0,
  'open_price': 14339.0,
  'close_price': 14310.0,
  'volume': 3.5}]

違和感に気付いたでしょうか。
そうです、OHLCの価格形成が明らかに歪な値を刻んでいます。
これはグラフに描画すれば、よりはっきりと分かります。

6/30 12:00〜24:00のBCH価格の推移

トレード回数が極端に低い場合、このように価格データの粒度が非常に粗くなります。ひいては、手数料目的のためにトレードを繰り返すという投機目的の今回のスタンスに対して、不健全な価格形成を示してしまいます。

メイカー戦略における理想形とされる同値撤退ですが、この荒い値動きと限定された約定機会によって、不確実性が非常に高くなってしまいます。指値の約定条件が不利すぎる、とはつまり同値撤退が期待できないということです。

上記の条件を”短期的”と捉えるなら、”長期的”な約定条件も存在します。
順張り指値の場合は特性上、相場下落時に買いが通り、相場上昇時に売りが通るという性質があります。聞こえはいいですが、これは相場変化の”初期時点”です。

つまり、極端に言えば高値で掴んだ挙句、底値の反転で切られるということです。
この現象を強めている主な原因は、流動性の不足ではないかと考えられます。

市場参加者の不足により、期待される約定条件が望まれることなく、性質上の指値の不利性がより高まるものと思われます。
ちなみに、現物のため空売りができません。このことも上記の意味合いを強めていると思います。


局所的な要因


さらに、局所的なところに突っ込むと、2022年の仮想通貨市場は6月時点で下落相場が続いていました。単純に見れば、純粋な売買しかできない現物市場との相性が悪かった、という見方もできます。

現状として仮想通貨の価格形成においては、出来高などの理由から、現物市場ではなくデリバティブ市場が主導となっています。
デリバティブ市場での投機的な値動きに影響を受けた価格変動に追従する形で、現物市場でも適正価格に回帰する動きを見せますが、いかんせん流動性が低いため、相場急落時には売り圧力の強さが際立ち、底値での売買を余儀なくされるといった局所的な要因も大きかったような気がします。


結論


以上まとめると、メイカー手数料の期待値と、トレードに付随するリスクレベルが釣り合っていない、と言えます。
エッジを見出すことができず、統計的に見ても損をしてしまいます。
結果として、メイカー手数料では稼げないという結論になるわけです。

本戦略を改善するとすれば、上記の2つの要因のそれぞれについて、手数料期待値の向上とトレードリスクの低減が必要になるでしょう。

そのためには、まず市場の流動性の確保が必須になります。
現物における出来高が世界でも高水準のBitMEXなどに取引所を変更して検証する余地はあります。

流動性の十分な確保が前提ですが、使用する時間足の間隔を狭めることで、トレード回数を増やし、手数料の期待値を上げることができそうです。極端に言えば、秒足単位でのHFTが挙げられますが、筆者がまだ勉強不足なので、機会があれば後日記事にでもしたいと思います。

また、戦略自体の見直しも有効でしょう。メイカー戦略にさらに特化したストラテジーを組むことで、トレードリスクを抑えられる可能性が高まります。

以上の改善案については、時間があればまた検証してみようかと思います。


最後に


「メイカー手数料で本当に稼げるのか」の検証、いかがでしたでしょうか。
トレード如何によらず、手数料だけで稼げると思って、大層なネーミングを付けて意気揚々と検証を進めたら、現実はそんなに甘くはなかったです。

ただ、個人的には現物市場や出来高などの周辺知識があまり無かったので、今回の検証を通じて理解が深まった部分もあったので、いい勉強になったと思っています。

メイカー手数料を利用したトレード例について、少しでも参考になれば幸いです。

それでは、今回はここまでにします。
お読みいただきまして、ありがとうございました。



この記事が気に入ったらサポートをしてみませんか?