程式

C++ 相對於 Python 的速度是否會使其成為一種更適用於剝頭皮套利機會的語言?

  • May 29, 2020

我正在使用 Bittrex 交易所 API 來 ping 市場,以調查 USD/BTC/LTC/USD 是否存在三角套利機會。請注意,我不是在交易,而是通過使用 API 為 3 個市場中的每一個收集買賣數據來綜合它們。我的測試民意調查也考慮了費用。我目前使用 API 的程式碼庫如下

import requests as rq 
import json 
from CONSTANTS import API_PUBLIC, API_SECRET
import time
import hmac 
import hashlib 

def arbitrage():

   nonce = time.time()

   #Defines the API call that gets the price data
   usd_btc_market = 'https://api.bittrex.com/api/v1.1/public/getticker?market=USD-BTC&apikey={0}&nonce={1}'.format(API_PUBLIC, nonce)
   btc_ltc_market = 'https://api.bittrex.com/api/v1.1/public/getticker?market=BTC-LTC&apikey={0}&nonce={1}'.format(API_PUBLIC, nonce)
   usd_ltc_market = 'https://api.bittrex.com/api/v1.1/public/getticker?market=USD-LTC&apikey={0}&nonce={1}'.format(API_PUBLIC, nonce)

   #Ensures connections are secured through hashing
   usd_btc_signature = hmac.new(API_SECRET.encode(), usd_btc_market.encode(), hashlib.sha512).hexdigest()
   btc_ltc_signature = hmac.new(API_SECRET.encode(), btc_ltc_market.encode(), hashlib.sha512).hexdigest()
   usd_ltc_signature = hmac.new(API_SECRET.encode(), usd_ltc_market.encode(), hashlib.sha512).hexdigest()

   #Conducts the hypothetical trades using the API bid/ask prices from each market. 
   #Assumes a starting capital value of $1
   btc_balance = (1 / json.loads(rq.get(usd_btc_market, headers = {'apisign': usd_btc_signature}).content.decode('utf-8'))['result']['Ask']) * 0.998
   ltc_balance = (btc_balance / json.loads(rq.get(btc_ltc_market, headers = {'apisign': btc_ltc_signature}).content.decode('utf-8'))['result']['Ask']) * 0.998
   usd_balance = (ltc_balance * json.loads(rq.get(usd_ltc_market, headers = {'apisign': usd_ltc_signature}).content.decode('utf-8'))['result']['Bid'])* 0.998

   print(usd_balance) 

while True:
   arbitrage()
   time.sleep(3) #Limited to 60 API calls per minute, ensures not too many calls are made

假設的交易結果似乎幾乎是有利可圖的。請注意,如果我們從 1 美元開始,那麼套利循環結束時的最終餘額如下(程式碼每 3 秒執行一次):

#Time span of over a 5 minute period
#Each arbitrage loop takes on average 0.48 seconds to run
0.9915490241394859
0.9915511459969782
0.9915511459969782
...
0.9901270999326443
0.9901250816417339
0.9901269101525229

我正在使用 Python 來執行這個機器人,但是我想知道是否可以通過切換到更快的語言(如 c++)來糾正“*如此接近但到目前為止”​​的難題?*根據這篇文章,c++ 至少比 python 快 10 倍。我的想法是,這種具有更快執行時間的語言能否克服每次 API 市場呼叫之間的微小時間增量?這可能是為什麼沒有找到這些機會的原因嗎,Python 只是放慢了利用稍縱即逝的套利機會的速度?或者,只是加密貨幣市場比我想像的更有效率,套利機會不會持續存在。期待聽到您的想法。

為了擴展其他人所說的,C++ 只會在您的機器上更快;它不會幫助您的交易對手。

通過 HTTP 輪詢是可以想像到的最慢的獲取數據的方式,但如果這就是 Bittrex 提供的全部,那麼也許需要一個替代場所。您實際上是在等待三秒鐘來對數據進行採樣;到那時,市場可能已經轉向更有效的價格。

理想情況下,您應該有一個帶有回調機制的開放式套接字。每當出現新報價時,場地應實時提醒您。然後,至少,您的機器的性能成為一個因素,因為您必須以足夠快的速度消耗數據才能跟上。

除此之外,還有另一個問題:光速。我假設您沒有與場地同處一地。事實上,如果您在 Internet 上執行,那麼您的延遲完全取決於您的連接。如果你需要 40 毫秒來獲取數據而你的競爭對手只需要 20 毫秒,那麼再多的程式碼也無法彌補這一點。比較難以衡量,幾乎無法控制。

引用自:https://quant.stackexchange.com/questions/53995