随着区块链资产量化交易的发展,越来越多的区块链资产交易者认识到了量化交易这个工具。 但是作为这个圈子的萌新成员,对于很多概念甚是迷惑。被各种名词、软件、信息等弄的晕头转向。本篇就带你一起认识、熟悉常见的概念,从多方面了解区块链资产量化交易中的各种有用的信息。 本篇先概括基本概念,然后对应这些基本概念在FMZ量化交易平台上举例说明。
首先我们要认识交易所这个概念,我们需要交易手中的区块链资产进行投机、投资等需要在交易所进行。目前交易所有很多,资深的、新兴的、规模大的、规模小的。对于在哪个交易所进行程序化、量化交易这些需要根据方方面面的信息自行筛选。
交易所账号 交易所账号,就是在这个交易所注册开设的账户。区块链资产可以存储到这个账户中进行交易。有些交易所主账户下又可以创建、设置子账户方便资产分开进行交易、投机。每个交易所的子账户申请创建、机制、使用等方面各不相同,需要具体到交易所网站上查询这些信息。或者咨询交易所客服。
在交易所网站用账户登录后,通常可以看到区块链资产可存放的地方分为多个“账户”(这里是逻辑上的账户,并非交易所账户)。通常分为钱包账户,币币交易账户,理财账户、合约交易账户 等。具体可能每个交易所有差别。通常冲入区块链资产(币)之后,是在某个账户下的(可能是在钱包账户,或者直接到币币交易账户)。所以充值后要检查下资产到哪里了,需要划转时划转(比如需要在期货交易时)。
交易所系统的API接口
很多没有用过这个交易所功能的同学可能就问了:“什么是API接口”。
API接口就是交易所系统给出的可以允许程序操作的接口。简单说就是交易所给出了一个通道允许(实盘脚本)程序去在交易所系统(交易所网站上某个交易对盘面,这里自行脑补)中下单、撤单、查单、查账户资产、查持仓等操作。
交易所API分为多种类型的接口,通常有REST
协议接口、WebSocket
协议接口。很少的交易所也提供FIX
协议接口。这些只做了解,我们用的最多的还是REST
协议的接口,这些接口文档通常都可以在交易所官网最下部有API字样的链接中找到。有时候查询一些接口报错信息,还是需要到这些文档中查看的。每家交易所的API系统都各不相同,差异化比较大,对于具体问题就要具体查看文档。如果你不是一个策略开发者,那么这些内容可以仅作为了解。
账号的API KEY
账号API KEY这个就必须认真了解清楚了,因为这个东西关乎你的交易所中存放的区块链资产安全。
上面说了API接口是通道,那么API KEY这个就可以理解为通道的通行证。因为有了访问通道,不能什么程序都允许访问,那样就很危险了。所以需要验证,而API KEY就是用来验证身份的。所以API KEY关乎你的资产安全,必须妥善保管。
通常交易所的API KEY是在交易所页面右上角,账户管理页面创建的(也可能有交易所放在网页的别的地方,找下有“API”关键字的链接点击进去找下)。API KEY为两串字符串,第一串字符串通常叫做access key
,第二串通常叫做secret key
。也有交易所的API KEY还具有其他信息,例如OKEX V5和V3接口还有一个PassPhrase
,也是一个字符串(需要自己设置的字符串,用于加强安全验证)。
API KEY设置时通常还需要设置这个API KEY的权限,一般有“交易”、“提币”等权限,要根据API KEY的用途具体设置,提币权限需要谨慎使用。除了权限,API KEY还可以设置IP地址白名单,如果使用这个IP地址白名单之外的IP(IP地址概念不了解的可以百度搜索)访问接口,会被拒绝访问(也就是IP白名单之外的网络无法访问到或者操作你的账户)。
交易所对象 交易所对象这个概念是在发明者量化交易平台(FMZ.COM)上的概念。简单说,指的是对交易所接口的封装形成的一个对象。 这个对象在FMZ策略代码中就是exchange,调用exchange.GetTicker这个函数,实际就是调用了访问交易所行情数据的接口。 具体参看FMZ API文档: https://www.fmz.com/api#exchange 一个交易所可能有期货板块、现货板块。由于在FMZ上定义期货交易所对象和现货交易所对象是不同类型的交易所对象,是区分开的(期货交易所对象比现货交易所对象多了几个函数,例如设置杠杆函数、查询持仓函数等,具体查询文档)。 所以举例币安交易所,你可能在FMZ上配置的时候会看到: 火币也有2个。
如果策略要操作的是期货交易所对象,就添加期货的,如果要操作现货的就添加现货的。为什么这样设计,是由于交易所可能期货现货的接口完全不同,甚至接口基地址都不同,所以分别封装。
在FMZ平台上,exchange就是一个交易所对象,就代表一个交易所账户,具体说明参看:https://www.fmz.com/api#exchanges
这里所说的交易市场就是指具体的交易盘面(脑补某个交易页面),通常交易所有多个板块。例如:币币交易,币币杠杆交易,合约交易等。
交易对 我们通常说的“交易对”简单理解就是我们买卖的东西,例如我们去市场上买白菜。那么 “白菜_钱” 就是一个交易对了(下划线_来分割)买家付钱得白菜,卖价付白菜得钱。到交易所具体的交易对例如:BTC_USDT,我们在这个交易对买入操作,指的就是付出USDT得到BTC。卖出操作就是付出BTC得到USDT。 以BTC_USDT为例子,通常我们称BTC为交易币种,USDT为计价币种。
现货
币币交易,币币杠杆交易,归类于现货交易。现货交易只用明确交易对就可以描述是在哪个市场上交易。
以FMZ量化交易平台上使用为例,如果要做BTC兑USDT的交易对。交易币是BTC,计价币是USDT。
我们用FMZ平台的函数exchange.SetCurrency("BTC_USDT")
就切换当前交易对为:BTC_USDT
了。
对于SetCurrency
不明白的可以看:https://www.fmz.com/api#exchange.setcurrency...
对于exchange
不明白的可以看:https://www.fmz.com/api#exchange
合约(期货、期权)
和现货交易区别较大的就是合约交易了。目前交易所合约都分为币本位合约
、USDT本位合约
,对于程序化交易、量化交易不仅要确定交易对、还要确定合约。比如要做的是BTC这个币种,那么BTC这个币种合约有很多,有季度合约(每个季度到期交割)、当周合约(每周5到期交割)、永续合约(不交割)等。那如果只用一个交易对标识,具体是做那种合约呢?所以就还需要具体的合约代码来描述确定。
这样以来我们描述在哪个合约市场交易,就需要描述说明是什么币种(交易对),是什么合约(合约代码)。
币本位合约
以币为保证金的合约(比如BTC币本位合约,用BTC作为保证金,收益也是BTC),收益也是币。通常币本位合约的交易对的计价币用USD表示(不用深究,大部分交易所都是这个表示)。所以交易对为BTC_USD,合约为季度合约。就表示我们在说的交易市场是BTC的币本位季度合约
市场。
在FMZ量化交易平台上,exchange.SetCurrency("BTC_USD")
设置交易对,然后exchange.SetContractType("quarter")
设置季度合约。这样当前的交易品种就是BTC的币本位季度合约
了。
USDT本位合约
以USDT作为保证金的合约(比如BTC的USDT本位合约,用USDT作为保证金,收益也是USDT),收益也是USDT。通常USDT本位合约的交易对的计价币用USDT表示。所以交易对为BTC_USDT,合约为永续合约。就表示我们在说的交易市场是BTC的USDT本位永续合约
市场。
在FMZ量化交易平台上,exchange.SetCurrency("BTC_USDT")
设置交易对,然后exchange.SetContractType("swap")
设置永续合约。这样当前的交易品种就是BTC的USDT本位永续合约
了。
订单 订单具体指的什么? 订单就是我们在交易所买卖时,向交易所提交的单子。订单分为市价单、限价单、条件单等等。一个订单的最基本属性有:订单标的物(简单说就是买卖什么东西),订单数量(买卖多少),订单价格(以什么价格买卖)。如果下一个订单不管多少钱,只确定买卖数量,确定买卖什么,那么这样的订单就叫做市价单。当然还有条件单(止损单、冰山委托单等)什么的,具体和交易所相关,有些交易所提供,有些交易所不提供,具体可以到交易所API文档查询。
现货 现货的订单市价单通常需要注意买单,现货的市价单买单的下单量不是币数而是金额。因为市价单不确定价格,只能通过金额来确定买多少。市价单卖单的数量是币数,因为即使不确定价格,但是卖出多少币是可以确定的。
合约 合约的下单量比较特殊,通常为合约张数,交易所的合约下单接口基本上都是合约张数,没有以币数为下单量的接口。币安的USDT本位BTC永续合约可以以0.01的数量这样下单BTC永续合约,但是也并不是币数,同样也是合约张数,只不过一张合约恰好是一个BTC。 通常来说,不论市价单、限价单下单量均为合约张数。
什么是taker、maker订单? taker订单就是提供流动性的订单,简单来说就是当前盘口买一价格是10,卖一价格是11,这个时候我挂一个买入价格为9的买入订单,或者挂一个卖出价格为12的卖出订单,这个时候我就给盘面上的深度提供了一个订单,我的这个订单就是maker。还是这个例子,如果我下了一个价格为11的买入订单,这个时候我的这个订单就会和盘面上卖一价格为11的订单成交,这个时候我从盘面上拿走了一个订单,这个时候我下的这个买入订单就是taker订单。
举个例子,在发明者量化交易平台上封装的下单函数exchange.Sell
、exchange.Buy
封装的是普通的限价单、市价单接口。下单时订单归为taker还是maker,具体要看下单价格和当时的盘口,要看我们的这个订单是提供了流动性,还是减少了流动性。
在发明者量化交易平台上价格传入-1,就是下市价单,注意现货的市价单买单的下单量是金额,那么市价单肯定就是减少流动性,肯定就是一个taker订单。
交易所条件单委托
很多交易所也支持条件订单,比如冰山委托
、止损单
, 止盈单
, post_only:只做maker单
,fok:全部成交或立即取消
,ioc:立即成交并取消剩余
等。
这些订单在发明者量化交易平台上可以用exchange.IO
函数直接访问交易所下单接口指定要设置的参数(指定下那种条件订单)去下单。对于exchange.IO
函数使用可以参看FMZ API文档:https://www.fmz.com/api#exchange.io...
量化交易平台可以看做是一个量化交易工具,可能是一个线上软件系统,可能是一个网站,可能是一个本地可执行程序,甚至可能是一个GITHUB上的开源项目。简单来说你可以把它看做是一个做量化交易的工具。
FMZ量化交易平台 发明者量化交易平台是一个线上的分布式的系统,平台初识、教程可以参考:https://www.fmz.com/bbs-topic/4145
量化交易平台的回测系统 什么是回测系统? 简单说,回测系统就是让某个交易品种的历史数据再回放一遍,回放的时候让某个策略至于其中,得到这个策略在模拟历史数据回放时的交易表现。所以说回测系统仅仅是个沙盒环境(脑补小盆友玩的沙堆,可以创造各种事物,但是仅仅是模型而已,和真实的事物无关),那么回测系统是不可能有真实交易所的任何功能的。
发明者量化交易平台回测系统:
名称 | 类型 | 说明 |
---|---|---|
Bitfinex | 现货交易所对象 | 支持有限的交易对例如:BTC_USD,ETH_USD,LTC_USD等,注意交易对计价币为USD是美元计价 |
币安 | 现货交易所对象 | 支持有限的交易对例如:BTC_USDT,ETH_USDT,ETH_BTC,LTC_BTC等 |
OKEX | 现货交易所对象 | 支持有限的交易对例如:BTC_USDT,ETH_USDT,ETH_BTC,LTC_BTC等 |
火币 | 现货交易所对象 | 支持有限的交易对例如:BTC_USDT,ETH_USDT,ETH_BTC,LTC_BTC等 |
OKEX期货 | 期货交易所对象 | 支持有限的交易对例如:BTC_USD,ETH_USD等,交易对计价币为USD,设置具体合约代码(参看exchange.SetContractType函数)后,合约为币本位合约 |
HuobiDM | 期货交易所对象 | HuobiDM即为火币期货(火币合约),支持有限的交易对例如:BTC_USD,ETH_USD等,交易对计价币为USD,设置具体合约代码(参看exchange.SetContractType函数)后,合约为币本位合约 |
BitMEX | 期货交易所对象 | 交易对为:XBT_USD,设置具体合约代码(参看exchange.SetContractType函数)后,合约为币本位合约 |
币安期货 | 期货交易所对象 | 支持有限的交易对例如:BTC_USDT,ETH_USDT等,交易对计价币为USDT,设置具体合约代码(参看exchange.SetContractType函数)后,合约为USDT本位合约 |
Deribit期权 | 期权交易所对象 | 交易对为:BTC_USD,ETH_USD,设置具体合约代码(参看exchange.SetContractType函数)后,合约为币本位合约 |
量化交易平台的API KEY
交易所有API接口,同样量化交易平台也有API接口。以FMZ量化交易平台为例,FMZ的API接口叫做扩展API
。可以程序化操作FMZ平台的一些功能。例如批量创建实盘、批量启动实盘、批量修改实盘配置等,具体可以参看:https://www.fmz.com/api#fmz平台扩展api
扩展API还可以用来做一些有趣的事情,例如使用发明者量化交易平台扩展API实现TradingView报警信号交易
说了那么多,那具体是什么在自动化控制我的交易所账户进行交易买卖呢? 这就是程序化交易、量化交易的具体体现了–程序化交易脚本。这些实盘程序可以用各种语言编写,例如FMZ量化交易平台上就支持用JavaScript、Python、C++语言编写实盘交易策略。这些脚本程序通过交易所的API接口对某个账户进行买卖等各种操作。
程序化交易脚本运行所在的设备
实盘脚本程序必须有设备载体(简单说就是实盘必须要有它运行的地方)。币圈做量化交易通常是把实盘程序部署到香港阿里云服务器上(当然你也可以用其它地方的,其它运营商的服务器)。鉴于目前很多交易所都需要海外网络访问,所以用国内的服务器运行很多交易所API接口是访问不到的。一般来说接口访问不通就会报错timeout
。
在FMZ量化通常可以用香港阿里云服务器部署自己的软件程序(发明者量化交易平台的实盘的载体软件叫做【托管者】,量化交易实盘是基于托管者软件运行的)。
脚本语言的选择 编程语言太多了,基本都可以用来写实盘脚本程序。 这里我们还会以FMZ量化交易平台为例子了解各种语言的优势。在FMZ量化我们可以用以下编程语言编写策略(机器人脚本程序)
JavaScript 简单易用,对设备环境依赖几乎没有,支持ES6标准。策略程序执行速度仅次于C++策略。(推荐FMZ量化交易初学者)
Python 一定程度依赖设备环境,可以安装各种库,扩展性强。(推荐对于FMZ平台比较熟悉、对于Python比较熟悉的同学)
C++
策略执行速度最快,效率最高,使用难度较大。
玩转了,其它感觉so easy!
。
麦语言 FMZ支持的麦语言仅仅是最基础的指令。
可视化模块拼接策略 可视化方式创建策略,仅仅用于兴趣提升,认识程序逻辑。用于创建一些简单逻辑尚可,策略稍微一复杂就不合适用这种方式设计策略了,因为难以维护、扩展,更难以设计复杂的逻辑。
fangliang 这系列文章入门不错
lizhulili 早点看到你这个,我都不用花半个月去自己找资料,自己摸索。
wqy 通俗易懂!感谢教学!
singweal 感谢分享!
singweal 感谢分享!
wqy 期待系列的后续~
发明者量化-小小梦 感谢支持~