报错信息

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

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

1、策略语法错误

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

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

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

2、策略程序BUG导致的运行时程序异常

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

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

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

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

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

实盘中报错:

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

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

4、接口调用报错

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

(1)、网络超时

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

(2)、http 429 错误

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

(3)、交易所接口业务层面的报错

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

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

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")。
例如此类和业务相关的报错还有很多,比如设置杠杆时某些交易所不支持带小数部分的杠杆值,此时杠杆值如果带有小数部分也会导致接口调用报错。

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

设置期货合约代码

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

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

但是不论哪种类型的错误,显示出的报错信息都是查找问题的关键信息,通常都能从报错信息中看出问题所在。可以使用翻译工具,翻译报错信息,提取关键信息。例如上例中的"err-msg":"invalid symbol",翻译:“err msg”:“无效符号”。大概就知道是交易对设置错了,因为通常都用英文symbol代表交易代码、交易对。

回测系统

回测系统也是一个量化工具中的重点,回测系统可以方便的测试策略原型,初步测试策略中潜在的BUG、逻辑问题等。对于回测系统需要理性看待。回测系统在一定程度上是可以反映出策略的一些问题的。下面先简单的从FMZ支持的不同策略语言层面说明一下FMZ平台上的回测系统。(关于回测系统的一些介绍,前几篇文章中有所提及)

JavaScript

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

Python

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

C++

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

麦语言

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

可视化

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

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

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

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

就好比如图这样模拟:

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

这里设置1分钟,意思就是使用周期为1分钟的K线数据作为生成模拟tick的数据源。还有一点就是对于高频策略,使用模拟级别回测显然不太合适。但是对于趋势策略,使用模拟级别回测还是能一定程度反映出策略的绩效的。

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

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

1、默认使用FMZ数据中心的数据
前几篇文章中有提及平台提供的回测数据只支持有限的交易对(全市场、全币种回测数据是一个天文数字,全部都收集不现实,平台收集了主流交易所、主流币种的行情数据)。

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

学习、测试、思考

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

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

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

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

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

我看到这样一个例子:

我想测试下,甚至就可以用FMZ平台的回测系统测试学习。

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

测试以下代码:

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))
}

看~多好的一个学习工具!比如我想学习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])
    }
}

瞬间是不是感觉学习有动力了呢!其实在FMZ上,完全可以边看JavaScript教程,边在回测系统上动手学习JavaScript基础。JavaScript语法掌握的差不多了,进入下一个阶段需要实际使用交易所接口获取数据测试了,还可以使用FMZ平台的调试工具进行真实的接口测试。然后就是多思考,举一反三,测试验证,对比分析等。这样学习入门就非常快了。

版权声明:本文为fmz-quant原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/fmz-quant/p/15062088.html