Python Binance API 教學 – 3. API 函數使用

文章提供: 核心引擎

幣安是否提供模擬帳戶?

在使用幣安API進行即時交易之前,可以選擇在幣安API測試網上測試您的Python交易腳本。

首先存取幣安測試網路網站,您可以在此處找到它:
https://testnet.binance.vision/

從那裡,即使您已經擁有 Binance.com 帳戶,您也必須創建一個帳戶。我們只看到了使用 GitHub 帳戶登錄的選項。

登錄后,您必須創建新的 API 金鑰。這些將與上一步中創建的密鑰分開,僅用於訪問您的模擬帳戶。

選擇用於生成 HMAC 金鑰的選項。在下一步中,輸入金鑰的描述性名稱。

按兩下「生成」後,您將進入顯示金鑰的螢幕。如果您離開此螢幕,您將無法再次訪問他們的金鑰,並且必須重新開始。

使用密鑰進行設置后,即時 API 中的所有終結點將與 Testnet API 中的終結點相同。唯一的區別是您必須使用不同的URL才能訪問測試網。

在撰寫本文時,我們在所有示例中使用的 python-binance 庫不支持測試網路。但是,我們將在下一步中討論解決方法。

請注意,測試網路帳戶通常會在每個月初被刪除。任何未平倉交易將被清除。有關 Spot 測試網路的更多詳細資訊,請參閱您建立金鑰的同一頁面。

如何使用幣安 API 檢索我的賬戶餘額?

現在,我們已經安裝了庫並獲取了 API 金鑰,現在是時候測試與 API 的連接了。我們將啟動一個用戶端,並查看詳細說明不同帳戶餘額的四個函數。

import os

from binance.client import Client

我們從進口開始。我們需要 python-binance 庫中的Client類以及os庫來檢索我們存儲為環境變數的 API 金鑰。

# init
api_key = os.environ.get('binance_api')
api_secret = os.environ.get('binance_secret')

接下來,我們將 API 金鑰和機密存儲到局部變數。

client = Client(api_key, api_secret)

最後,我們初始化用戶端並傳遞 API 金鑰和機密。我們都準備好在他的時間點開始訪問API。

不幸的是,python-binance庫不支援前面討論的演示環境。但是,我們能夠通過手動更改庫中的 API 終結點 URL 進行連接,如下所示:


client.API_URL = 'https://testnet.binance.vision/api'
或
client.API_URL = 'https://api.binance.com/api'

如果決定從演示 API 開始,請確保在初始化用戶端時傳遞測試網路 API 憑據,而不是即時 API 金鑰。

# get balances for all assets & some account information
print(client.get_account())

上述代碼將列印出平臺上每種可用貨幣的所有帳戶詳細資訊。它還將提供一些其他資訊,例如當前的傭金率以及您的帳戶是否啟用了保證金交易。

這可能有點太多了。如果我們只對BTC餘額感興趣,則可以使用另一個端點。

# get balance for a specific asset only (BTC)
print(client.get_asset_balance(asset='BTC'))

如果您正在追逐其他資產的餘額詳細資訊,只需將BTC與您所追求的資產切換出去即可。

# get balances for futures account
print(client.futures_account_balance())

期貨帳戶的賬戶餘額與主餘額是分開的,因此需要不同的端點。

同樣,保證金帳戶詳細資訊也是分開的。以下是您訪問保證金帳戶的方法。請注意,如果您尚未激活保證金帳戶,則會引發異常。

# get balances for margin account
print(client.get_margin_account())

如果您不熟悉保證金交易,您可以查看幣安指南:什麼是保證金交易以獲取更多詳細資訊,並查看幣安保證金交易指南以獲取設置說明。

如何檢索比特幣的最新價格?

有幾種方法可以獲得比特幣的最新價格。最簡單的一個涉及使用該函數。get_symbol_ticker

如果您追求其他資產,則可以在此處通過任何股票代碼,而不是BTCUSDT。

# get latest price from Binance API
btc_price = client.get_symbol_ticker(symbol="BTCUSDT")
# print full output (dictionary)
print(btc_price)

上面的代碼將列印出包含符號和價格的字典。下面是一個示例輸出 –

{'symbol': 'BTCUSDT', 'price': '9678.08000000'}

我們可以按如下方式訪問價格。

print(btc_price["price"])

在即時Python交易腳本中,我們可能需要我們正在交易的資產的最新價格資訊。幸運的是,有一個比不斷向API發出請求更好的解決方案。它涉及使用Binance WebSocket。

使用Binance WebSocket獲取最新的比特幣價格

Binance WebSocket要求我們只發送一次命令來打開流,然後隨著價格的更新,數據將自動流過。

from time import sleep

from binance import ThreadedWebsocketManager

我們需要導入 ThreadedSocketManager 來使用這個函數,以及來自 time 模組的 sleep 函數。

btc_price = {'error':False}

接下來,我們將創建一個字典,該字典將保存我們最新的價格數據,並讓我們知道websocket是否存在問題。

def btc_trade_history(msg):
    ''' define how to process incoming WebSocket messages '''
    if msg['e'] != 'error':
	print(msg['c'])
	btc_price['last'] = msg['c']
	btc_price['bid'] = msg['b']
	btc_price['last'] = msg['a']
	btc_price['error'] = False
    else:
        btc_price['error'] = True

然後,我們將創建一個函數,該函數將告訴套接字管理員在接收新數據時要執行的操作。

現在,我們只需將最後的收盤價列印到螢幕上。

我們還將一些專案存儲到我們之前創建的字典檔中。這允許我們在函數之外訪問數據,這就是您通常從主交易腳本訪問websocket數據的方式。

除了最新的價格,買入價和賣出價外,我們還內置了錯誤檢查功能。這將使我們知道Binance WebSocket是否存在錯誤,在這種情況下,我們將需要重新啟動它。

后一個涉及 websocket 的範例擴展了錯誤檢查部分。

您可能已經注意到幣安不使用完整的變數名稱。即收盤價在名為「c」而不是「收盤」的變數中來自websocket。幣安這樣做可能是為了將消息的整體大小保持在最小值,以提高通信速度。

如果您正在嘗試對新的websocket連接進行程式設計,但不確定變數代表什麼,請查看Binance API文件。它們詳細說明瞭 websocket 消息的每個元件的用途。

# init and start the WebSocket
bsm = ThreadedWebsocketManager()
bsm.start()

下一步是初始化套接字管理器。當我們這樣做時,庫將創建一個新的線程,我們已經在上面的代碼片段中啟動了該線程。

# subscribe to a stream
bsm.start_symbol_ticker_socket(callback=btc_trade_history, symbol='BTCUSDT')

我們將調用具有與我們之前討論的 API 函數類似的輸出的 it。start_symbol_ticker_socketget_symbol_ticker

我們需要通過一個符號,在本例中為BTCUSDT。我們還指定它在每次收到新消息時調用我們的自定義函數。btc_trade_history

如果您正在關注,如果您運行上述代碼,則應在螢幕上看到價格流。它看起來應該類似於幣安網頁上現貨交易部分下的「交易歷史」 框。

在即時Python交易腳本中,您將從函數外部的字典檔中訪問數據,而不是將數據列印到函數的螢幕中。

幣安有幾個websocket流,我們可以輕鬆添加更多。

bsm.start_symbol_ticker_socket(callback=btc_trade_history, symbol='ETHUSDT')

上面的代碼片段訂閱了ETHUSDT的股票代碼。我們將回調保留為btc_trade_history。這意味著當ETHUSDT的新消息到達時,它將由我們創建的相同btc_trade_history函數處理。

這隻是出於示例目的,以展示如何輕鬆添加更多流。如果需要,您可以選擇為其他流創建單獨的函數。

完成 WebSocket 後,請使用以下語法正確終止它:

# stop websocket
bsm.stop()

WebSocket可以提供各種數據。要獲取可用內容的完整視圖,請在 Python 終端中鍵入以下內容。

help(ThreadedWebsocketManager)

這將列出所有可用的不同方法,並提供有關返回數據的一些資訊。

下面是start_symbol_ticker_socket的範例:

如您所見,它提供了簡要說明,指向有關該函數的官方Binance文檔的連結,以及有關返回數據的一些詳細資訊。

這是找出返回最佳出價的另一種方法,除了檢查文檔。msg['b']

如何以CSV格式獲取比特幣的歷史價格數據?

我們將從幣安API請求歷史比特幣價格數據,然後概述將該數據保存到CSV檔的四個選項。

我們想要盡可能追溯的數據。幸運的是,庫中有一個函數,可以讓我們確定第一個可用的價格點。

# valid intervals - 1m, 3m, 5m, 15m, 30m, 1h, 2h, 4h, 6h, 8h, 12h, 1d, 3d, 1w, 1M

# get timestamp of earliest date data is available
timestamp = client._get_earliest_valid_timestamp('BTCUSDT', '1d')
print(timestamp)

在上面的代碼片段中,我們調用了該函數,並將BTCUSDT作為我們的交易品種,將 1d作為我們的時間幀。輸出將保存到變數中。._get_earliest_valid_timestamp

# request historical candle (or klines) data
bars = client.get_historical_klines('BTCUSDT', '1d', timestamp, limit=1000)

接下來,我們調用歷史數據。我們需要再次通過符號和變數。此外,還需要開始日期,為此我們使用了時間戳變數。

最後,預設情況下,此函數調用最後 500 個數據點。最大值為 1000,因此我們將限制增加到最大值。

在後台,此終端節點將在迴圈中連續查詢 API,一次收集 1000 個價位,直到返回從起點到今天的所有數據。

為了對 API”友善”,每三次調用後都會內置一個睡眠函數。因此,如果您從一開始就要查找1分鐘的數據,則可能需要一段時間。

幣安於2017年夏天開始運營,因此這可能是最早的價格點。

以下是根據幣安 API 文件返回的數據的定義。

現在我們有了日期,讓我們通過四個不同的選項將其保存到檔中。

# option 1 - save to file using json method
with open('btc_bars.json', 'w') as e:
    json.dump(bars, e)

第一個涉及使用 JSON 庫。這將維護數據的結構,即清單清單。如果你想保持這種結構,這就是要走的路。確保 .import json

# option 2 - save as CSV file using the csv writer library
with open('btc_bars.csv', 'w', newline='') as f:
	wr = csv.writer(f)
    for line in bars:
        wr.writerow(line)

第二種方法使用 csv 編寫器將清單另存為 CSV 檔。確保 .import csv

# option 3 - save as CSV file without using a library. 
with open('btc_bars2.csv', 'w') as d:
    for line in bars:
        d.write(f'{line[0]}, {line[1]}, {line[2]}, {line[3]}, {line[4]}\n')

第三個選項不使用任何庫。我們創建了一個 f 字串,它是 Python 3 及更高版本的本機函數。

這裡有更多的靈活性。我們利用了它,只保存了前五列:日期開盤關閉

或者,如果您不需要其他列,也可以將其刪除,如下所示:

# delete unwanted data - just keep date, open, high, low, close
for line in bars:
    del line[5:]

最後一個選項是利用熊貓的導出到CSV功能。如果您計劃將數據保存在數據幀中,則使用此選項是有意義的。

# option 4 - create a Pandas DataFrame and export to CSV
btc_df = pd.DataFrame(bars, columns=['date', 'open', 'high', 'low', 'close'])
btc_df.set_index('date', inplace=True)
print(btc_df.head())

我們已將數據傳遞到數據幀中並定義了列。由於我們刪除了一些不需要的列,因此只需要定義五個列。

這就是我們的數據幀在這一點上的樣子——

日期列已設置為索引,使其成為時間序列索引數據幀。這樣,以後可以更輕鬆地根據時間範圍進行操作。當我們將其另存為CSV時,它還會刪除額外的不需要的索引列。

最後,我們可以將數據幀導出為 CSV 檔。

# export DataFrame to csv
btc_df.to_csv('btc_bars3.csv')

2021年8月30日更新:幣安推出了一個新網站,該網站託管了現貨和期貨市場的歷史市場數據。

可以透過點選取在點號以點 –幣安資料收集

從那裡,選擇相關市場(現貨或期貨)。然後,您可以選擇資料的時間範圍。即每月或每天。

此時,您可以選擇要處理的數據類型。常見的數據類型包括:

  • aggTrades – 聚合成10秒區塊的逐筆報價數據
  • klines – 也稱為蠟燭或柱線。此數據具有 OHLC 格式(開盤、最高價、最低價、收盤價)
  • 交易– 所有交易的記錄。也稱為逐筆報價數據
市場數據可從幣安下載

數據採用 ZIP 格式。解壓縮后,它將採用CSV格式。

該網站是批量下載市場數據的好方法。幣安創建它是為了試圖阻止使用API下載大量數據。這樣,API 就可以優先用於其他用途,例如發送訂單。

如果您確實使用 API 批量下載歷史數據,您可能會注意到這需要很長時間。這是因為幣安限制了這些類型的 API 請求。

此外,python-binance 庫在某些市場數據請求(如價格變動數據)中實現延遲,以確保您不會因過載 API 而意外收到 API 禁令。

我應該交易期貨還是現貨?有什麼區別?

在期貨市場,您可以輸入合約以在以後購買加密貨幣。這意味著如果您進行交易,則不會獲得實際擁有權。

事實上,大多數期貨交易者從不持有擁有權。交易期貨主要用於投機目的,即使它是出於其他原因而設計的。

交易期貨的主要優點是您可以做空您不擁有的資產。這在套利和對沖策略中很有用。

期貨交易的另一個方面是它是在保證金上完成的。這意味著您只需要投入一部分交易價值,就可以使用槓桿。

幣安有一個單獨的選擇權,可以以保證金交易現貨市場。但是,您可以做空的金額有相當低的限制,並且利息(借貸成本)遠高於交易期貨。

由於各種持有成本,期貨價格通常與主要市場不同,或者稱為現貨價格。然而,價格通常會在期貨合約到期日收斂。

與幣安一起,交易期貨的一大優勢是交易費用比現貨低得多。因此,交易期貨市場有很多原因。

以下是您可能不想交易期貨的幾個原因:

  • 您計劃交易許多不同的加密貨幣,可能相互對立 – 幣安目前的期貨產品目前僅限於流行的USDT對。
  • 你想擁有加密貨幣,也許可以將其存儲在離線錢包中。

幣安 API 使用不同的終端節點進行期貨交易。但是,如果你使用的是 python-binance 庫,則這些終結點已在庫中配置。

此外,庫內的期貨功能已被適當標記,以將其與現貨市場區分開來。

例如,如果您正在交易現貨,您可以使用以下函數來訪問您的未結訂單:

client.get_open_orders

如果您正在交易期貨,您將使用:

client.futures_get_open_orders





Python 區塊鏈

Python Binance API 教學 – 4. 技術指標分析

如何獲取 SMA 等技術指標? 我們已經討論了如何將 DataFrame 輸出為 CSV 檔。你可以用 Python Pandas 做更多的事情,計算移動平均線就是其中之一。 下面是一個示例: import btalib import pandas as pd # load DataFrame btc_df = pd.read_csv('btc_bars3.csv', index_col=0) btc_df.set_index('date', inplace=True) btc_df.index =...

Python Binance API 教學 – 2. 開戶及安裝

Python Binance API 坊間有數個第三方函式庫可以使用,最受歡迎的是 python-binance 另一個流行的庫是 CCXT。該庫支援一百多種不同的交換,並提供許多不同的程式設計語言。 第三個可能鮮為人知的選項是 Binance Connector,它應該是官方推出的庫,因為它託管在Binance的Github頁面。幣安 API 文件中還有一個建議和指向它的連結。但它的格式似乎經常更新,而且學習曲線陡峭,因為沒有大量文檔或例子可供學習。...

PYTHON Binance API 教學 – 1. 介紹

什麼是 Binance API? Binance API 是獲取幣安數據的方法。我們可以運用電腦語言例如 Python 連接到 Binance API 獲取數據。有了它,您可以編寫程式自動擷取數據,並自訂你的條件策略,自動化執行交易。 使用 Binance API 的好處 Binance 幣安在加密貨幣 (Crypto) 交易方面已成為市場領導者。根據 coinmarketcap.com,目前它在比特幣交易量中排名第一,在許多其他貨幣中排名很高。 手續費也非常有低廉,您很難找到另一個費用更低的交易所。...

PYTHON 自動化數據擷取講座
富途 OPEN API 程式交易講座