この記事では、Bybitの現物取引のAPIの使い方を、実際に動くPythonのコードを載せて説明します。デリバティブ取引はこの記事では扱いません。
Bybitの現物取引では、証拠金(マージン)取引ができます。
つまり、現物取引でレバレッジ取引が行えます。
この記事では、レバレッジあり・なしの現物取引のAPIの使い方を、Pythonのサンプルコードをお見せしながらご紹介します。

今はレバレッジ2倍から10倍まで可能です。


Bybitの証拠金取引(マージン取引)の説明を載せておきます。
Bybitの証拠金取引とは、現物取引でレバレッジ取引するための機能です。証拠金取引では、現物アカウントの資産を担保として利用することができます。Bybitから追加資金を借り入れることで、より大きな現物ポジションの保有、あるいは現物での空売り(ショート)ができるようになります。
Bybitマージン取引のご案内 (現物)

前提知識
APIで取引するので、前提となる情報を共有させてください。
すでにAPIを使ったことがある方はスルーしてください。
BybitのAPI仕様書
APIのパラメータはこの記事ではあまり触れないので、詳細はこちらをご覧ください。
Pythonのimportモジュール
モジュールは以下を使います。
import requests import json import time from datetime import datetime import hmac import hashlib import urllib.parse
Bybitの現物取引の手数料
手数料には3つの種類があります。
https://www.bybit.com/ja-JP/help-center/article/Spot-Margin-Trading-Fees-Explained
- 現物取引手数料
- レバレッジなし・ありのどちらでも現物取引を行った場合に発生する。
- 利息
- レバレッジありの現物取引を行った場合に発生する。
- 資金の借入れが成功すると直ちに利息が発生する。注文が約定する・しないに関わらず利息が発生する。
- 利息は手動返済したり、ポジションが強制決済されるとき、現物アカウントからのみ控除される。
- 証拠金取引で負う利息は時間単位で発生する。短時間でも1時間とみなされる。
- 強制決済手数料
- 強制決済が行われた場合に発生する。
それぞれの手数料の計算方法は以下となります。
現物取引手数料
取引手数料 = 約定注文数量 × 現物取引手数料率
Bybitに口座開設したばかりのときは、非VIP会員になります。
非VIP会員は現物取引するときに0.1%の取引手数料を支払うことになります。
https://www.bybit.com/ja-JP/help-center/article/Trading-Fee-Structure
出典:Bybit
利息
利息 = 借入額 × 日次利息率/24 × 時間
それぞれのコインの利息は以下のサイトに載っています。
https://www.bybit.com/en/announcement-info/fullstock-leverage-uta/
1時間の利息はAPIで取得できます。
使用するAPIは”Get VIP Margin Data”になります。
https://bybit-exchange.github.io/docs/v5/spot-margin-uta/vip-margin
ご自身のVIPレベルと知りたいコインを設定して、APIを呼んでみてください。
endPoint = 'https://api.bybit.com'
path = '/v5/spot-margin-trade/data'
url = endPoint + path
params = {
'vipLevel': 'No VIP',
'currency': 'USDT',
}
response = requests.get(url, params=params)
res = response.json()
print(json.dumps(res, indent=4))
VIP0(非VIP会員)のUSDTの1時間の利息率は0.0000071388540000でした。
{
"retCode": 0,
"retMsg": "success",
"result": {
"vipCoinList": [
{
"list": [
{
"borrowable": true,
"collateralRatio": "1",
"currency": "USDT",
"hourlyBorrowRate": "0.0000071388540000",
"liquidationOrder": "1",
"marginCollateral": true,
"maxBorrowingAmount": "5500000"
}
],
"vipLevel": "No VIP"
}
]
}
}
VIP0(非VIP会員)のBTC(ビットコイン)の1時間の利息率は0.0000017278920000でした。
{
"retCode": 0,
"retMsg": "success",
"result": {
"vipCoinList": [
{
"list": [
{
"borrowable": true,
"collateralRatio": "0.98",
"currency": "BTC",
"hourlyBorrowRate": "0.0000017278920000",
"liquidationOrder": "2",
"marginCollateral": true,
"maxBorrowingAmount": "100"
}
],
"vipLevel": "No VIP"
}
]
}
}
強制決済手数料
強制決済手数料 = 強制決済資産 × 強制決済手数料率
出典:Bybit
Bybitでの前準備
APIを使う前にBybitで以下をやっておく必要があります。
Bybitの口座と入金
APIで注文を実行するためには、入金できていないとエラーになります。
口座開設と入金を先に済ませましょう。
口座を開設されていない方は以下の記事をご覧ください。

資金を統合取引アカウントに振替
「資産」のところで、「資金調達」から「統合取引アカウント」へ資産の振替をしましょう。

統合取引アカウントで担保を有効化
USDTやUSDCはデフォルトで担保になっていますが、他のコインの場合は許可が必要となります。現物取引で証拠金取引(マージン取引)を行う場合は、以下のように担保として利用したいコインを有効化してください。

APIの使い方
実際に動作するコードをお見せしながら、APIの使用方法を説明します。
現物取引のステータス確認
現物取引のステータス確認APIは”Get Status And Leverage”です。
https://bybit-exchange.github.io/docs/v5/spot-margin-uta/status
endPoint = 'https://api.bybit.com'
path = '/v5/spot-margin-trade/state'
url = endPoint + path
timestamp = int(time.time() * 1000)
recv_window = '5000'
text = str(timestamp) + apiKey + recv_window
sign = hmac.new(secretKey.encode('utf-8'), text.encode('utf-8'), hashlib.sha256).hexdigest()
headers = {
'X-BAPI-API-KEY': apiKey,
'X-BAPI-TIMESTAMP': str(timestamp),
'X-BAPI-SIGN': sign,
'X-BAPI-RECV-WINDOW': recv_window,
}
response = requests.get(url, headers=headers)
res = response.json()
print(json.dumps(res, indent=4))
変数apiKeyとsecretKeyはご自身のものに置き換えてください。
こんなレスポンスが返ります。
レバレッジの倍数はサイトで設定している値が返ってきて、レバレッジ10倍となっています。
{
"retCode": 0,
"retMsg": "OK",
"result": {
"spotLeverage": "10",
"spotMarginMode": "1",
"effectiveLeverage": "1"
},
"retExtInfo": {},
"time": nnnnnnnnnnnnn
}
現物取引(レバレッジ1倍)
新規注文APIはPlace Order APIです。
レバレッジあり・なしの両方で使います。
https://bybit-exchange.github.io/docs/v5/order/create-order
レバレッジなしの売買のコードを見てみましょう。
買い注文
レバレッジなしの場合は、変数isLeverage=0にします。
BTCUSDTの買い注文をしてみます。
endPoint = 'https://api.bybit.com'
path = '/v5/order/create'
url = endPoint + path
params = {
'category': 'spot',
'symbol': 'BTCUSDT',
'isLeverage': 0,
'side': 'Buy',
'orderType': 'Limit',
'qty': 0.00005,
'price': 60000,
}
timestamp = int(time.time() * 1000)
recv_window = '5000'
text = str(timestamp) + apiKey + recv_window + urllib.parse.urlencode(params)
sign = hmac.new(secretKey.encode('utf-8'), text.encode('utf-8'), hashlib.sha256).hexdigest()
headers = {
'X-BAPI-API-KEY': apiKey,
'X-BAPI-TIMESTAMP': str(timestamp),
'X-BAPI-SIGN': sign,
'X-BAPI-RECV-WINDOW': recv_window,
}
response = requests.post(url, headers=headers, data=params)
res = response.json()
print(json.dumps(res, indent=4))
変数apiKeyとsecretKeyはご自身のものに置き換えてください。
私の統合取引アカウントは、現物取引で使えるUSDTがゼロなので、以下のレスポンスになります。
残高不足エラーです。
{
"retCode": 170131,
"retMsg": "Insufficient balance.",
"result": {},
"retExtInfo": {},
"time": nnnnnnnnnnnnn
}
売り注文
BTCUSDTの売り注文をしてみます。
レバレッジなしなので、変数isLeverage=0です。
endPoint = 'https://api.bybit.com'
path = '/v5/order/create'
url = endPoint + path
params = {
'category': 'spot',
'symbol': 'BTCUSDT',
'isLeverage': 0,
'side': 'Sell',
'orderType': 'Limit',
'qty': 0.00005,
'price': 72000,
}
timestamp = int(time.time() * 1000)
recv_window = '5000'
text = str(timestamp) + apiKey + recv_window + urllib.parse.urlencode(params)
sign = hmac.new(secretKey.encode('utf-8'), text.encode('utf-8'), hashlib.sha256).hexdigest()
headers = {
'X-BAPI-API-KEY': apiKey,
'X-BAPI-TIMESTAMP': str(timestamp),
'X-BAPI-SIGN': sign,
'X-BAPI-RECV-WINDOW': recv_window,
}
response = requests.post(url, headers=headers, data=params)
res = response.json()
print(json.dumps(res, indent=4))
レスポンスです。
BTCはいくらか持っているので、売り注文に成功しました。
{
"retCode": 0,
"retMsg": "OK",
"result": {
"orderId": "nnnnnnnnnnnnnnnnnnn",
"orderLinkId": "nnnnnnnnnnnnnnnnnnn"
},
"retExtInfo": {},
"time": nnnnnnnnnnnnn
}
orderId, orderLinkId, time の”n”の部分は数字が入ります。
現物取引(証拠金取引、レバレッジ10倍)
買い注文
私の統合取引アカウントのUSDT残高はゼロなので、レバレッジありの買い注文のサンプルコードは省略させていただきます。約定に関わらず、注文するだけで利息が発生するとなっていたので。
売り注文
レバレッジの倍数は現在設定されるものが設定されます。
新規注文APIでレバレッジ倍数を変更することはできません。

レバレッジ倍数はSet Levarage APIで設定できます。
https://bybit-exchange.github.io/docs/v5/spot-margin-uta/set-leverage
レバレッジあり・なしの違いは変数isLeverageで判断されます。
レバレッジありなので、isLeverage=1を設定します。
endPoint = 'https://api.bybit.com'
path = '/v5/order/create'
url = endPoint + path
params = {
'category': 'spot',
'symbol': 'BTCUSDT',
'isLeverage': 1,
'side': 'Sell',
'orderType': 'Limit',
'qty': 0.00005,
'price': 72000,
}
timestamp = int(time.time() * 1000)
recv_window = '5000'
text = str(timestamp) + apiKey + recv_window + urllib.parse.urlencode(params)
sign = hmac.new(secretKey.encode('utf-8'), text.encode('utf-8'), hashlib.sha256).hexdigest()
headers = {
'X-BAPI-API-KEY': apiKey,
'X-BAPI-TIMESTAMP': str(timestamp),
'X-BAPI-SIGN': sign,
'X-BAPI-RECV-WINDOW': recv_window,
}
response = requests.post(url, headers=headers, data=params)
res = response.json()
print(json.dumps(res, indent=4))
レスポンスは成功の場合、レバレッジあり・なしで変わりません。
{
"retCode": 0,
"retMsg": "OK",
"result": {
"orderId": "nnnnnnnnnnnnnnnnnnn",
"orderLinkId": "nnnnnnnnnnnnnnnnnnn"
},
"retExtInfo": {},
"time": nnnnnnnnnnnnn
}
取引画面上では、レバレッジあり・なしの違いは以下のように見えます。
下が先に注文したレバレッジなしの注文です。
上が後に注文したレバレッジありの注文です。
商品の表記が変わるだけでした。

借り入れ状況の確認
統合取引アカウントの右上Menuの「借入履歴」を見ると、借入明細と借入履歴を見ることができます。

エラー例
注文サイズが少なすぎるエラー
Bybitの現物取引の最小注文数量は以下で言及されています。
Bybitでは、注文ごとに最小・最大の注文数量及び価額を設定しています。たとえば、BTC/USDTの註文ごとの最小注文値は1USDTより小さくすることはできず、注文ごとの最大注文値は 2,000,000 USDT を超えることはできません。
Bybit 現物取引ルール
BTCUSDTの場合、注文価格 ✕ 注文数量の値が1USDT以上でないと以下のエラーになります。(※レバレッジなしの現物取引の場合)
{
"retCode": 170136,
"retMsg": "Order quantity exceeded lower limit.",
"result": {},
"retExtInfo": {},
"time": nnnnnnnnnnnnn
}
コインの残高が不足しているエラー
例えば、USDTの資産がゼロの場合に、BTCUSDTのペアで買い注文すると以下のエラーになります。(※レバレッジなしの現物取引の場合)
{
"retCode": 170131,
"retMsg": "Insufficient balance.",
"result": {},
"retExtInfo": {},
"time": nnnnnnnnnnnnn
}
コインの担保有効化ができていないエラー
取引で使うコインを担保として有効にできていない場合は、このエラーになります。
{
"retCode": 170037,
"retMsg": "BTC has not opened collateral settings.",
"result": {},
"retExtInfo": {},
"time": nnnnnnnnnnnnn
}
統合取引アカウントの資産残高の画面で以下をお確かめください。




