- Published on
量化交易中的地理延迟测试
- Authors
- Name
- Lif
Lantency
延迟,对于高频交易/量化交易是非常重要的因素。
客户端是没有办法缩减线路延迟的,所以我们需要尽可能的将我们的服务器放在交易所的服务器旁边。
一般来说,交易所会给提供api但不会提供交易所服务器的位置和延迟信息。所以我们要做的就是在自己的服务器测试延迟。
RTT
round-trip delay(RTD)
或者round-trip time(RTT)
是指一个信号从发送到确认接收到该信号的时间。这个时间包括两个通信端点路径之间的传播时间。在计算机网络的上下文中,信号通常是数据包。RTT也被称为ping时间
,可以通过ping
命令确认。
这里我们使用rtt来测量延迟,因为实际上下单的话,也是应用的这个延迟。
通常的测试方法
通常可以通过请求的方式来测量请求所花的时间。 以CB交易所为例
# python version
# use coinbase exchange for exchange
import requests
from datetime import datetime
url = 'https://api.exchange.coinbase.com/products/USDT-GBP/'
headers = {"Accept": "application/json"}
start_time = datetime.now()
for i in range(10):
response = requests.get(url)
# if need
# print(response.json())
end_time = datetime.now()
print('rtt is ', (end_time - start_time) / 10)
# output: rtt is 0:00:00.444431
// Golang version
package main
import (
"fmt"
"io/ioutil"
"net/http"
"time"
)
func main() {
url := "https://api.exchange.coinbase.com/products/USDT-GBP/"
startTime := time.Now()
req, _ := http.NewRequest("GET", url, nil)
// here is err handle
req.Header.Add("Accept", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := ioutil.ReadAll(res.Body)
endTime := time.Now()
fmt.Println("res is ", endTime.Sub(startTime)/10)
// fmt.Println("res is ", Time.Since(startTime)/10) same sample
fmt.Println(res)
fmt.Println(string(body))
}
# output: res is 33.981093ms
ccxt
为了节省时间,可以用一些现有的轮子,比如Python中的ccxt库。
这是一个多语言的加密交易库,有写好的多个交易所的api。可以直接拿来使用,这样就不用每个交易所的api都看一遍,但是,还是有必要浏览一下的!
usage
pip install ccxt
我们主要使用cctx中的exchange.py里面的方法即可。
import ccxt
from datetime import datetime
# print(ccxt.exchanges) see all exchanges which cctx support
start_time = datetime.now()
exchange = ccxt.bitstamp() # cctx.kraken() cctx.binance() etc.....
for i in range(10):
exchange.fetch_ticker('BTC/USDT')
end_time = datetime.now()
print('rtt is :', (end_time - start_time)/10)