Loading ...

币圈量化交易萌新看过来--带你走近币圈量化(三)

Author: 小小梦, Created: 2021-05-06 11:20:04, Updated: 2021-06-08 14:36:24

币圈量化交易萌新看过来–带你走近币圈量化(三)

报错信息

前几篇文章我们已经了解过所谓程序化、量化交易就是一个脚本程序根据从交易所获取到的数据,经过一系列的计算、判断、触发做出一些操作,操作交易所账户进行交易。这些获取数据、操作账户的行为都是通过交易所API接口进行的。简单说就是脚本程序和交易所交互,既然是交互那么就肯定有正常的交互、异常的交互。当发生异常交互时接口便返回了异常信息。

当然市面上的程序化、量化交易系统,亦或自行开发的程序都会有各种各样的错误提示、报错信息。这些错误信息并非局限于交易所API接口的报错信息。还有诸如:程序运行时异常错误、配置错误、程序语法错误等。

在发明者量化交易平台上,错误信息也大概分为几个大类:

  • 策略语法错误 这类错误最常见,通常是因为萌新不熟悉编程,学习测试阶段代码编写有语法错误导致。例如:

    img

    代码少写了括号之类的字符。此类错误通常在编辑策略页面就能看到错误提示,并且策略也是运行不起来的(运行时会直接报错,如下图)。

    img 所以写完策略,在平台策略编辑页面习惯性的搂一眼,看看有没有红色小XX,有就肯定是有明显错误了。

  • 策略程序BUG导致的运行时程序异常 程序存在BUG,在程序运行时,触发异常会导致程序异常停止,显示此类报错信息。

    img

    img

    此类错误都会导致程序异常,程序会停止运行。

  • 配置、设置不当导致的错误

    在FMZ平台,交易对统一定义为X_Y这样的格式,X代表交易币的名称,Y代表计价币的名称(期货币本位合约交易对的计价币通常用USD表示,在前几篇文章中有介绍)。例如BTC_USDT,如果我胡乱写交易对,写成BTC-USDT

    img

    在FMZ平台回测系统中报错:

    img

    实盘中报错:

    img

    再者,萌新经常遇到的一种错误:

    https://www.fmz.comimg

    此类错误是由于修改了FMZ平台账号的密码,导致配置的交易所对象中的API KEY失效(用户的API KEY都是在浏览器端加密后配置在FMZ平台),策略无法启动,进而报错。

  • 接口调用报错

    接口调用报错是在运行策略时经常遇到的,往期文章中我们学习、了解到FMZ平台上的接口分为产生网络请求的接口不产生网络请求的接口。接口报错不会导致策略程序停止,通常是由于接口调用异常,返回了错误数据,然后策略没有做容错,使用了错误数据引发的程序异常错误导致程序停止(容错的概念在前几篇文章中有提及)。

    这里列举几个产生网络请求的接口报错信息:

    • 网络超时

      img

      萌新们经常遇到的报错信息之一,原因是使用了国内网络的设备(自己的电脑或者国内的服务器)。由于大部分交易所都被墙,所以国内网络基本上很多交易所都访问不到,访问接口都会报超时。(前几篇文章中有提及)

    • http 429 错误

      https://www.fmz.comimg

      经典报错信息之一,原因是调用交易所接口过于频繁,超过交易所限制的频率。(前几篇文章中有提及) 有的萌新同学可能会说,我多申请几个交易所的API KEY或者我多申请几个交易所账号不就行了。我们需要知道,交易所限制接口访问频率通常是基于IP地址的,简单说就是只要在一个IP地址发送的请求全部统计在这个IP地址上,超过了限制这个IP再发送请求交易所服务器就拒绝访问了。

    • 交易所接口业务层面的报错

      上面讲的timeout、429这些是网络层面的错误。交易所接口业务层面发生问题也会报错,例如我要获取现货行情,但是我设置了一个不存在的交易对。我在FMZ平台的调试工具里测试,调试工具是个很方便的测试工具,非常适合实盘测试函数调用、获取数据等需求。

      img

      调试工具执行结果,调试工具执行和实盘执行并无区别。 img

      Huobi	错误	GetTicker: Invalid ticker: {"Info":{"err-code":"invalid-parameter","err-msg":"invalid symbol","status":"error","ts":1620872079355},"High":0,"Low":0,"Sell":0,"Buy":0,"Last":0,"Volume":0,"OpenInterest":0,"Time":0}
      

      这里的报错信息意思就是说交易对无效(从这里看出"err-msg":"invalid symbol")。 例如此类和业务相关的报错还有很多,比如设置杠杆时某些交易所不支持带小数部分的杠杆值,此时杠杆值如果带有小数部分也会导致接口调用报错。

    列举一个不产生网络请求的接口调用

    • 设置期货合约代码 有些接口仅仅是设置系统中的某些全局变量,不产生网络请求,例如:

      img

      但是参数传错,或者乱写也是会报错的。

      img

    但是不论哪种类型的错误,显示出的报错信息都是查找问题的关键信息,通常都能从报错信息中看出问题所在。可以使用翻译工具,翻译报错信息,提取关键信息。例如上例中的"err-msg":"invalid symbol",翻译:“err msg”:“无效符号”。大概就知道是交易对设置错了,因为通常都用英文symbol代表交易代码、交易对。 关于报错信息我们就简单探讨这些,对于常见问题有个帖子会持续收集用于查询:https://www.fmz.com/bbs-topic/1427

回测系统

回测系统也是一个量化工具中的重点,回测系统可以方便的测试策略原型,初步测试策略中潜在的BUG、逻辑问题等。对于回测系统需要理性看待。回测系统在一定程度上是可以反映出策略的一些问题的。

下面先简单的从FMZ支持的不同策略语言层面说明一下FMZ平台上的回测系统。(关于回测系统的一些介绍,前几篇文章中有所提及)

  • JavaScript

    浏览器端回测,使用的是本机硬件资源。

  • Python

    在托管者上回测,可以选择具体分配到哪一个托管者上(自己部署的托管者,FMZ平台的公共托管者都行)。鉴于FMZ平台上公共托管者负载较大,建议使用本机托管者回测(这样速度也会快些,公共托管者回测时,当任务较多超过负载,会取消一些回测任务,导致回测中断)。

  • C++

    和脚本语言不同,C++策略需要先编译然后执行。C++语言的策略会在FMZ平台(服务器)先编译(如果代码写的有问题,可能编译不通过,直接弹框报错提示)。编译通过后在FMZ平台上(服务器)回测。

  • 麦语言

    底层实现为JavaScript,回测时同样是在浏览器端回测。

  • 可视化

    底层实现为JavaScript,回测时同样是在浏览器端回测。

发明者量化交易平台的回测系统回测模式分为两种(这个不分策略语言,这个是回测设置,各种语言的策略回测都一样)。

img

关于回测系统的说明可以参看平台教程中的资料:

https://www.fmz.com/bbs-topic/4158#策略回测

  • 1、模拟级别回测 模拟级别回测简单通俗的说就是根据K线数据模拟生成逐个时间节点的价格数据。

    K线中一根柱子不是有高开低收么,构成了一个价格框架,在这个K线代表的时间范围内,价格都在这个价格框架内,所以只要生成的价格在这个K线高开低收框架范围内,这个模拟出来的价格就是合理的。
    

    就好比如图这样模拟: https://www.fmz.comimg 当然实际回测系统实现这个模拟的时候情况比图上略微复杂,这里不做深究,理解模拟级别回测机制即可。 知道了这个原理,就需要注意模拟级别回测的弊端了,虽然模拟级别回测速度很快(因为模拟生成的价格,并非真实的逐秒的价格一个个放出)。但是如果策略拟合了模拟的tick变动趋势就会让策略表现的非常优秀(但是实际情况中价格可能不是这种走势,虽然价格都在这个K线柱的框架内)。 这里用于生成模拟tick数据的K线叫做底层K线,这个K线的周期叫做底层K线周期,在策略设置页面如图设置:

    img 这里设置1分钟,意思就是使用周期为1分钟的K线数据作为生成模拟tick的数据源。

    还有一点就是对于高频策略,使用模拟级别回测显然不太合适。但是对于趋势策略,使用模拟级别回测还是能一定程度反映出策略的绩效的。

  • 2、实盘级别回测 说了模拟级别回测,我们再讲一下实盘级别回测。简单说实盘级别回测就是回测时真实的放出逐秒的价格数据。让策略回溯行情中每秒的价格。这种回测模式下可以回测一些交易频率高的策略,并且可以得到一定程度的参考价值。 缺点就是实盘级别回测数据量太大,无法较大时间范围的回测(通常时间范围不到1天)。可以通过关闭分笔数据,降低深度数据档位(成交逐笔数据,盘口深度数据在实盘级别回测中也有逐秒快照,所以实盘级别回测数据量庞大),来适当增大回测范围,如图:

    img

发明者量化交易平台回测系统的数据来源是何处呢?回测系统默认使用的是FMZ平台的数据中心的数据,FMZ平台数据中心自动收集设定好的各个交易所各个币种的行情数据,提供给平台上的回测系统。

  • 1、默认使用FMZ数据中心的数据 前几篇文章中有提及:https://www.fmz.com/bbs-topic/6857#量化交易平台 平台提供的回测数据只支持有限的交易对(全市场、全币种回测数据是一个天文数字,全部都收集不现实,平台收集了主流交易所、主流币种的行情数据)。

  • 2、使用自定义数据源数据 可以使用回测页面的选项设置自定义数据源,简单说就是如果你自己有某个交易所的数据,可以根据FMZ平台的格式要求,提供给FMZ平台的回测系统,用于回测。

    img

    关于自定义数据源FMZ API文档中也有一些说明: https://www.fmz.com/api#自定义数据源

    FMZ文库中也有一些方案: img

    有兴趣的萌新们可以研究参考。

学习、测试、思考

做程序化、量化交易离不开学习测试思考。 思考问题这个并不能凭空思考,那样是低效的。解决问题、思考问题最行之有效的就是查找资料、然后动手试下思考分析,问题如果没解决请往复以上动作。

但是通常萌新遇到问题,就会感觉:

“哎呀~程序化、量化、写策略太难了”。 “看了半天,还是懵懵的!” “没入门到想放弃!” …

在FMZ平台上入门其实很简单,首先要善于查找资料。发明者量化交易平台策略广场、社区、文库中有不少资料可以查阅。

img

然后就是动手能力,使用回测系统、调试工具可以很方便的测试,这里并不是说要测试一个完整的策略。其实你如果是完全0基础,甚至你可以在FMZ量化的回测系统上学习JavaScript程序基础。

这个是我经常学习JS的教程网站:https://www.runoob.com/js/js-loop-for.html 不仅限于JS,各种IT知识这里都能查询、学习。 比如我JS的正则表达式不知道怎么用,怎么办? 当然先查阅资料,然后动手试下咯~

我看到这样一个例子: img 我想测试下,甚至就可以用FMZ平台的回测系统测试学习。

回测系统上随便设置一个交易所 img

测试以下代码:

function IsEmail(str) {
    var reg=/^\w+@[a-zA-Z0-9]{2,10}(?:\.[a-z]{2,4}){1,3}$/;
    return reg.test(str);
}

function main() {
    var strEmailAddress1 = "13512345678"
    Log(strEmailAddress1, " 是邮件地址么 ? ", " 回答:", IsEmail(strEmailAddress1))
    
    var strEmailAddress2 = "123456789@qq.com"
    Log(strEmailAddress2, " 是邮件地址么 ? ", " 回答:", IsEmail(strEmailAddress2))
}

img

看~多好的一个学习工具! 比如我想学习JavaScript语言的循环逻辑怎么写,动手试下:

按数组中的顺序,循环打印一个数组变量中的各个元素:

function main() {
    var arr = [{coinName: "BTC", price: 10000}, {coinName: "LTC", price: 100}, {coinName: "ETH", price: 2000}, {coinName: "ETC", price: 500}]
    for (var i = 0 ; i < arr.length ; i++) {
        Log(arr[i])
    }
}

img

瞬间是不是感觉学习有动力了呢! 其实在FMZ上,完全可以边看JavaScript教程,边在回测系统上动手学习JavaScript基础。JavaScript语法掌握的差不多了,进入下一个阶段需要实际使用交易所接口获取数据测试了,还可以使用FMZ平台的调试工具进行真实的接口测试。

然后就是多思考,举一反三,测试验证,对比分析等。这样学习入门就非常快了。


More