《跟我学习AI量化投资》通过chatgpt利用ccxt获取比特币行情数据
CCXT是一个开源的数字货币交易框架,它封装了全世界绝大多数的交易所API. 我们通过登录chatgpt,使用gpt编写代码,获取数字货币的行情数据。
比如:利用ccxt从OKY交易所获取比特币行情数据
获取结果如下,以后进行分析,如何运行起来。

后面所有的交易命令都可以通过会话的方式获取。这样,不需要学习代码也可以从事数字货币交易了。
安装ccxt框架
在windows或者linux上安装ccxt,安装命令如下:
pip install ccxt -i https://pypi.tuna.tsinghua.edu.cn/simple
OKX申请keys使用
登录OKX界面,在打开个人头像,选择API申请,申请界面如下:
然后选择申请v5 api,进入如下的申请界面。自定义用户名和密码,进行校验,选择交易功能,得到keys. 得到结果后,最好密码和kyes的信息保存起来,不能让他人套用,带来损失。
通过ccxt登录OKX交易所
首先连接到OKX,输入你的keys,代码如下:
import ccxt
exchange = ccxt.okex({
apiKey: 66e9e88-******f6688,
secret: 888888********88,
password: 66*****,
timeout: 30000,
enableRateLimit: True,
})
这里我们只需要关心几个问题:
1)import ccxt其实就是导入ccxt
2)exchange就是初始化一个交易所,其他交易的连接方式如下:
如果我们是使用OKEx交易所,那就是exchange = ccxt.okex()
如果是使用币安交易所:exchange = ccxt.binance()
如果是使用火币交易所:exchange = huobipro()3)比如OKY交易所初始化的信息里:
apiKey就是我门在交易所申请的api的api key,字符串格式
secret就是secret key,字符串格式
password是OKEx交易所才有的passphrase,其他交易所不需要填这个。字符串格式。
获取OKY交易所数字币的行情
在OKY交易所,获取orderbook盘口深度数据,第一个参数symbol填上交易对名称,第二个参数limit是指定获取多少档深度数据。比如我们需要获取比特币的行情,核心代码如下。
orderbook = exchange.fetch_order_book(symbol="BTC/USDT", limit=5).1)获取获取"BTC/USDT"交易对信息
获取"BTC/USDT"交易对数据的完整代码如下:
#获取最新价格数据
ticker = exchange.fetch_ticker(symbol="BTC/USDT")
print("ticker:", ticker)
#如果要从ticker数据中取出最新的价格,可以通过字典的键去查找它的值,因为返回的数据是字典格式:
last = ticker["last"]
print("最新价:", last)
对应的ticker数据如下:
ticker: {symbol: BTC/USDT,
timestamp: 1679799979804,
datetime: 2023-03-26T03:06:19.804Z,
high: 27792.8,
low: 27152.8,
bid: 27580.2,
bidVolume: 0.00505202,
ask: 27580.3,
askVolume: 0.47133495,
vwap: 27485.798501895166,
open: 27610.8, close: 27580.2,
last: 27580.2,
previousClose: None,
change: -30.6,
percentage: -0.110826198444087,
average: 27595.5,
baseVolume: 5531.43501174,
quoteVolume: 152035908.15901375,
info: {instType: SPOT, instId: BTC-USDT, last: 27580.2, lastSz: 0.003, askPx: 27580.3, askSz: 0.47133495, bidPx: 27580.2, bidSz: 0.00505202, open24h: 27610.8, high24h: 27792.8, low24h: 27152.8, volCcy24h: 152035908.159013755, vol24h: 5531.43501174, ts: 1679799979804, sodUtc0: 27461.8, sodUtc8: 27648.2}}
最新价: 27580.2
具体数据的结果描述如下:
行情的数据结构如下:
{
symbol: string symbol of the market (BTC/USD, ETH/BTC, ...)
info: { the original non-modified unparsed reply from exchange API },
timestamp: int (64-bit Unix Timestamp in milliseconds since Epoch 1 Jan 1970)
datetime: ISO8601 datetime string with milliseconds
high: float, // highest price
low: float, // lowest price
bid: float, // current best bid (buy) price
bidVolume: float, // current best bid (buy) amount (may be missing or undefined)
ask: float, // current best ask (sell) price
askVolume: float, // current best ask (sell) amount (may be missing or undefined)
vwap: float, // volume weighed average price
open: float, // opening price
close: float, // price of last trade (closing price for current period)
last: float, // same as `close`, duplicated for convenience
previousClose: float, // closing price for the previous period
change: float, // absolute change, `last - open`
percentage: float, // relative change, `(change/open) * 100`
average: float, // average price, `(last + open) / 2`
baseVolume: float, // volume of base currency traded for last 24 hours
quoteVolume: float, // volume of quote currency traded for last 24 hours
}
# 定义交易对
symbol = BTC/USDT
# 获取最近 30 条 K 线数据
klines = exchange.fetch_ohlcv(symbol, 1d, limit=30)
# 打印 K 线数据
for kline in klines:
print(kline)
BTC/USDT最近30天的行情结果如下:
[1677283200000, 23190.2, 23217.8, 22729.4, 23157.2, 5019.02857511]
[1677369600000, 23157.3, 23686.7, 23060.7, 23557.4, 4810.44032196]
[1677456000000, 23552.7, 23891.2, 23101.0, 23491.2, 8356.24149089]
[1677542400000, 23491.2, 23600.0, 23025.5, 23136.0, 4699.05977688]
[1677628800000, 23143.1, 24009.0, 23009.7, 23632.4, 8356.38724014]
[1677715200000, 23632.0, 23792.7, 23181.5, 23466.0, 5511.18257716]
[1677801600000, 23465.9, 23472.9, 21898.0, 22354.5, 17156.07482816]
[1677888000000, 22354.4, 22403.8, 22164.5, 22349.7, 2958.65794217]
[1677974400000, 22349.6, 22666.4, 22185.5, 22427.6, 4206.5210596]
[1678060800000, 22427.6, 22598.0, 22261.3, 22409.2, 5956.77362899]
[1678147200000, 22409.2, 22553.3, 21934.6, 22201.5, 8308.24100926]
[1678233600000, 22201.5, 22287.0, 21570.6, 21706.7, 9010.30149603]
[1678320000000, 21706.8, 21830.0, 20037.0, 20367.2, 20102.01680472]
[1678406400000, 20364.8, 20368.3, 19529.7, 20152.6, 29477.43802602]
[1678492800000, 20152.6, 20688.9, 19769.1, 20454.7, 21906.21116802]
[1678579200000, 20454.7, 22160.0, 20263.2, 21995.2, 16535.95439772]
[1678665600000, 21995.3, 24509.3, 21820.7, 24116.0, 40397.27101346]
[1678752000000, 24116.1, 26424.2, 23957.5, 24676.0, 46895.47498368]
[1678838400000, 24675.2, 25227.1, 23873.0, 24279.9, 26008.82676517]
[1678924800000, 24279.9, 25179.5, 24125.2, 25005.4, 18077.41143903]
[1679011200000, 25002.1, 27768.1, 24894.0, 27395.6, 30760.02435145]
[1679097600000, 27394.5, 27713.8, 26565.5, 26905.0, 15656.15234983]
[1679184000000, 26905.0, 28400.3, 26825.6, 27966.6, 14606.18949344]
[1679270400000, 27966.3, 28490.0, 27133.4, 27718.5, 15769.72184277]
[1679356800000, 27716.5, 28448.8, 27300.1, 28108.8, 12272.48235288]
[1679443200000, 28104.4, 28890.0, 26603.6, 27249.6, 23810.37051319]
[1679529600000, 27249.7, 28775.4, 27114.3, 28293.7, 18433.35854101]
[1679616000000, 28295.2, 28375.0, 26976.8, 27452.4, 17120.42253367]
[1679702400000, 27452.4, 27792.8, 27152.8, 27462.4, 5694.75630012]
[1679788800000, 27461.8, 27648.0, 27413.3, 27586.0, 487.75706743]
3)获取账号内数字币资产
# 获取数字币资产
balance = exchange.fetch_balance()
print("balance:", balance)
返回的信息是字典格式,资产数据如下:
balance: {info: {code: 0, data: [{adjEq: , details: [{availBal: 0.45275651, availEq: 0.45275651, cashBal: 0.45275651, ccy: TON, crossLiab: , disEq: 0.47403606597, eq: 0.45275651, eqUsd: 0.94807213194, fixedBal: 0, frozenBal: 0, interest: , isoEq: 0, isoLiab: , isoUpl: 0, liab: , maxLoan: , mgnRatio: , notionalLever: 0, ordFrozen: 0, spotInUseAmt: , stgyEq: 0, twap: 0, uTime: 1652587802413,
。。。。。。}}
特别注意:
有些交易所可能不会返回完整的余额信息。许多交易所不会返回你的空账户或者未用的账户, 这种情况下在返回的余额结构中可能会缺少某些货币的信息。
4)下单交易
限价委托,symbol是币对名称,amount是下单数量,price是下单价格。限价委托就是以指定的价格挂单。
result =
exchange.create_limit_buy_order(symbol="BTC/USDT", amount=1, price=1)print("限价买入委托单结果:", result)
如上是去下一个限价买入订单,下单返回的结果是:
限价买入委托单结果:{info: {client_oid: , code: 0, error_code: 0, error_message: , message: , order_id: 6************, result: True}, id: 6885462671577088, clientOrderId: None, timestamp: None, datetime: None, lastTradeTimestamp: None, symbol: BTC/USDT, type: limit, timeInForce: None, postOnly: None, side: buy, price: None, stopPrice: None, average: None, cost: None, amount: None, filled: None, remaining: None, status: None, fee: None, trades: None}
其中有一个数据是order_id,就是这笔订单的订单编号,我们可以将它取出来:
order_id = result["info"]["order_id"]
# 得到这笔订单的编号是:6********
同样道理,创建限价卖出委托是:
result = exchange.create_limit_sell_order(symbol="BTC/USDT", amount=1, price=1)
print("限价卖出委托单结果:", result)
#市价委托 市价委托就是为了尽快成交,所以交易所会用当时有效的最优价格来完成你的市价单。
result =
exchange.create_market_buy_order(symbol="BTC/USDT", amount=1)print("市价买入委托单结果:", result)
result =
exchange.create_market_sell_order(symbol="BTC/USDT", amount=1)print("市价卖出委托单结果:", result)
#市价委托订单是不需要填价格这个参数的。5)查询指定订单
我们可以通过订单编号去查询一笔订单的状态:
order = exchange.fetch_order(id="6*******", symbol="BTC/USDT")print("order:", order)
我们这里查询了一下先前创建的那个限价订单,返回的订单信息是:
order: {info: {client_oid: , created_at: 2021-04-30T16:23:42.502Z, fee: , fee_currency: , filled_notional: 0, filled_size: 0, funds: , instrument_id: BTC-USDT, notional: , order_id: 6**********, order_type: 0, price: 1, price_avg: 0, product_id: BTC-USDT, rebate: , rebate_currency: , side: buy, size: 1, state: 0, status: open, timestamp: 2021-04-30T16:23:42.502Z, type: limit 。。。。}
其中有一些数据,当然,我们这个限价单并没有实际成交,所以有些数据是空值:
created_at: 订单创建时间
fee: 手续费用,按币种比如BTC计算的
fee_currency:按基础货币如USDT计算的手续费用
filled_size: 已成交数量
price: 委托价格
side: 订单方向
size: 订单数量
type: 订单是限价单还是市价单
price_avg: 成交均价
6)撤销未完成的订单
我们撤销一下之前创建的那个限价订单:
result = exchange.cancel_order(id="6************", symbol="BTC/USDT")
print("撤销指定订单结果:", result)
返回的结果是:
撤销指定订单结果:
{info: {client_oid: , code: 0, error_code: 0, error_message: , message: , order_id: 6**********, result: True}, id: 6************, clientOrderId: None, timestamp: None, datetime: None, lastTradeTimestamp: None, symbol: BTC/USDT, type: None, timeInForce: None, postOnly: None, side: None, price: None, stopPrice: None, average: None, cost: None, amount: None, filled: None, remaining: None, status: None, fee: None, trades: None}
我们可以看到,结果里有一个info信息,其他的方法返回的结果也是这样,这个其实是ccxt统一处理过的,在info这个字典之后的,其实是交易所返回的原始信息。
info这个字典里有一个信息是result,我们这里是True,说明撤销订单成功了。
如果这个订单已经成交,去撤销就会失败,那这个result就会是Fasle,与此同时,error_message里会包含具体的错误信息,就是说因为什么原因导致撤单失败的。
###############################
欢迎您阅读《跟我学习AI量化投资》的作品!
欢迎加微信进行交流,谢谢!