开箱即用的数字货币期权量化交易工具

断了今生、忘了曾经 提交于 2020-02-27 20:10:38

1、数字货币期权量化、程序化交易

最近有不少交易所都陆续开启了数字货币期权这个衍生品的交易功能,和传统期权类似,期权交易和期货交易等相结合,可以组合出不少交易策略,交易方法。虽然市面上有不少开源的量化交易工具,不过这些工具动辄需要了解框架底层,熟悉编写框架的编程语言或者需要自己手动进行复杂的调试,配置,修改。对于程序化交易、量化交易入门的新手实在不是很方便。大量的本应该专注于交易策略,交易思路的时间都被投入到了程序调试,编程语言学习中了。

发明者量化(FMZ.COM)在早期架构设计时,就考虑了各种金融衍生品量化、程序化交易的支持,非常快捷的接入了期权交易。期权交易基本上和期货交易类似,甚至更加简单。并且没有增加新接口,熟悉使用FMZ的用户不会增加其它学习成本,只用把期权合约当做期货合约一样设置,就可以对期权合约进行行情获取,下单、撤单、查询持仓等操作。

2、直接使用原生编程语言访问Deribit交易所

我们就以Deribit交易所期权合约为例,比如我们要获取当前某个期权合约的指数价格。

用Go语言实现:

package main 

import "net/http"
import "io/ioutil"
import "fmt"
import "encoding/json"



func main() {
    // 获取行情, 访问接口:https://www.deribit.com/api/v2/public/ticker?instrument_name=BTC-27DEC19-7250-P

    resp, err := http.Get("https://www.deribit.com/api/v2/public/ticker?instrument_name=BTC-27DEC19-7250-P")
    if err != nil {
        panic(err)
    }

    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        panic(err)
    }

    ret := string(body)
    fmt.Println("这只是字符串数据ticker:", ret)
    fmt.Println("需要转换为JSON格式") 

    type js struct {
        data interface{}
    }

    ticker := new(js)

    json.Unmarshal([]byte(ret), &ticker.data)

    fmt.Println("ticker:", ticker) 
    fmt.Println("ticker 中的标记价格数据index_price:", ticker.data.(map[string]interface{})["result"].(map[string]interface{})["index_price"])
}

可以看到只为了获取这个数据,写了N多一堆代码。

3、使用发明者量化交易平台封装的接口

我们使用FMZ简单两句就搞定了。

function main() {
    exchange.IO("base", "https://test.deribit.com")   # 切换为 交易所提供的模拟盘
    exchange.SetContractType("BTC-3JAN20-7250-P")     # 设置期权合约
    var ticker = exchange.GetTicker()                 # 获取期权行情
    Log(ticker.Info.result.index_price)               # 打印需要的数据,观察
}

可以看到,短短几行代码,就很简单的获取到了需要的数据。

这仅仅是访问了交易所的非签名的公共API接口,如果访问签名的私有接口会更加复杂。

每个接口还要做一大堆的签名、参数等处理:

strBody := ""
strQuery := ""
ts := toString(time.Now().UnixNano() / 1e6)
nonce := toString(time.Now().UnixNano() / 1e6)
uri := resource
if httpMethod == "GET" {
    strQuery = encodeParams(params, false)
    uri = fmt.Sprintf("%s?%s", resource, strQuery)
} else if httpMethod == "POST" {
    if len(raw) > 0 && len(raw[0]) > 0 {
        strBody = raw[0]
    } else {
        strBody = json_encode(params)
    }
}

strRequestDate := fmt.Sprintf("%s\n%s\n%s\n", httpMethod, uri, strBody)
strToSign := fmt.Sprintf("%s\n%s\n%s", ts, nonce, strRequestDate)
h := hmac.New(sha256.New, []byte(p.secretKey))
h.Write([]byte(strToSign))
strSign := hex.EncodeToString(h.Sum(nil))

req := Request{
    Method:  httpMethod,
    Uri:     fmt.Sprintf("%s%s", p.apiBase, uri),
    Timeout: p.timeout,
    Body:    strBody,
}

4、更加复杂的需求、功能

不仅如此,如果用到需要并发、异步获取行情,下单操作,又要用到处理异步的代码库,需要编写更加复杂的异步处理逻辑,一个不留神还可能造成锁死等逻辑设计问题。如果再需要用到图表显示,接着要学习一大堆库的使用,即使是一个有编程基础的量化交易者,也需要一定时间学习。不过使用发明者量化就简单的多了,因为这些功能都已经封装好了,设计的调用接口都非常简单易用。可以用很少的代码实现各种需求的功能。

function main(){
    exchange.IO("base", "https://test.deribit.com")
    exchange.SetContractType("BTC-27DEC19-7250-P")
    while(1){
        var records = exchange.GetRecords()
        Log(records)
        $.PlotRecords(records, "K")
        Sleep(1000)
    }
}

使用平台提供的模板库「画线类库」,很简单的就可以实现画出K线图表:

还有更多的功能可以探索开发!

5、后记

如果直接用类似上面的go语言(或者python等等)实现,可能新同学,直接就被劝退了 >_<
对于Deribit期权操作的范例策略详见:https://www.fmz.com/strategy/179475

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!