网站首页 > 币百科 >

虚拟货币怎么玩量化投资

2023-06-17 17:04:25 币百科 阅读 0

Bitget下载

注册下载Bitget下载,邀请好友,即有机会赢取 3,000 USDT

APP下载   官网注册

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

}

  1. 获取最近30天的交易数据

# 定义交易对

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量化投资》的作品!

欢迎加微信进行交流,谢谢!

相关内容

虚拟货币怎么玩量化投资文档下载.: PDF DOC TXT

猜你喜欢