人讲话的意思。经过长时间的熏陶和自我学习,我们竟然在不知不觉中学会了说话,也能听懂其他小朋友说话的意思。语言有很多种,包括中文、英文、法文等等,比如: 中文:世界你好 英文:Hello World 法文:Bonjour tout le monde
如果用编程语言,在电脑屏幕上显示"世界你好",就是这样的: C语言:puts(“世界你好”); Java语言:System.out.println(“世界你好”); Python语言:print(“世界你好”) 可以看到计算机语言拥有自己特定的规则,而且语言还有很多中,而这些语言规则就是我们今天需要为大家讲解的编程语言分类,在每一种分类中我们只需要记住最基础常用的规则,就能够利用这些编程语言和电脑沟通,让电脑按照我们的指令运行相应的策略。
为了便于大家参考对比,挑选适合自己的量化交易编程语言,我们将最常用的六种编程语言做一个归类说明,它们分别是Python、Matlab/R、C++、Java/C#、EasyLanguage以及可视化语言(如下图)。 图3-1 编程语言评价
我们从功能范围、运行速度、可扩展性、学习难度分别为它们评分。分值在1~5之间,比如在功能范围上得了5分,就意味着功能强大,1分就意味着功能较少。(如上图)可视化语言和EasyLanguage语言简单易学,非常合新手;Python功能强大扩展能力强,适合开发比较复杂的交易策略;C++交易速度更快,更适合高频交易者。
但是对于每个编程语言的评测,主要是针对量化交易领域中的应用,并且带有个人的主观成分。也欢迎在之后的评论区拍砖,或提出你的观点讨论。接下来,我们就开始一个个地介绍这些编程语言。
可视化编程由来已久,并不是新鲜事物。这种“所见即所得”的编程思想,搭载着各种控件模块,仅仅以拖拽的方式,就可以构建代码逻辑,完成交易策略设计,过程很像搭积木一样。 图3-2 可视化编程语言界面
如上图,同样的程序,在发明者量化交易平台可视化编程中只需要几行代码就搞定。这极大的降低了编程门槛,尤其针对那些完全不懂编程的交易者,这是非常棒的操作体验。
由于该可视化语言实现策略底层是转为C++的,所以对程序运行速度的影响不大。但是功能和可扩展性较弱,不能开发过于复杂、过于精细化的交易策略。
所谓的EasyLanguage语言,指的是部分商业化量化交易软件独有的编程语言。尽管这些语言也有部分面向对象特性,但在应用中主要还是采用脚本形式。在语法上面,也非常接近我们的自然语言,对于量化交易初学者来说,使用EasyLanguage作为入门是个比较好的选择。比如:发明者量化交易平台中的麦语言。
这种脚本语言在它特定的软件中做策略回测和实盘是没有问题的,但是在扩展方面,往往是有限的,比如策略开发者不能调用外部API。而且在运行速度上,这种脚本语言都是在它自己的虚拟机上运行,性能优化不如Java/C#,速度较慢。
在Stackoverflow上,最近几年主流的编程语言访问量基本没有太大的变动,只有Python是一路呈上升趋势。Python可用于网站开发、机器学习、深度学习、数据分析等,因其灵活性和开放性已经成为了最通用的语言。量化投资领域也是如此,目前国内的量化平台,多以Python为主。
Python的基本数据结构列表和字典,功能非常强大,基本上能够满足数据表示的需求。如果需要更加快捷、功能更全面的数据结构,推荐适用NumPy和SciPy,这两个库基本上称为Python科学计算的标准库了。
对金融工程而言,更有针对性的库是Pandas,具有Series和DataFrame两个数据结构,非常适合于处理时间序列。
在速度方面,Python处于中游的位置,比C++慢一些,比EasyLanguage语言快一些,主要因为Python是一种动态语言,在纯Python语言运行时速度一般般。但是可以用Cython把部分功能静态优化,就能接近C++的速度。
作为胶水语言,在扩展性能方面,Python是当之无愧的第一名,除了可以广泛的对接其他语言外,而且扩展API的设计非常易用。就学习难度方面,Python语法简单,代码可读性高,容易入门。
接着是Matlab和R语言,这两种语言主要定位于数据分析,语言作者在语法上为科学运算做了很多设计,其特点是天生支持量化交易运算。但是应用范围比较有限,一般多用于数据分析和策略回测。对于交易系统和策略算法开发,其易用性和稳定性较差些。
另外,它们的运行速度和扩展能力也相对较差,因为Matlab和R语言是在独有的语言虚拟机上运行。从性能上看,它们的虚拟机要比Java和C#差很多。但由于它们的语法更接近于数学表达公式,学起来也相对容易一些。
C++是一种通用程序设计语言,支持多重编程模式,例如过程化程序设计、数据抽象、面向对象程序设计、泛型程序设计和设计模式等。用C++语言可以实现所有你想实现的功能,但是这么强大的语言有个最大的缺点就是学习难度非常高,比如模板、指针、内存泄露等等。
目前,C++仍然是大容量,高频率交易的首选编程语言,原因很简单,因为C++语言特点更容易接近计算机底层,是开发处理大量数据的高性能回测和执行系统的最有效工具。
Java/C#都是在虚拟机上运行的静态语言,与C++相比,没有数组越界、没有coredump、抛出的异常能精准的定位到出错代码的位置、自带垃圾自动回收机制、不用担心内存泄露等等。所以在语法的学习难度上,它们也比C++更加容易。在运行速度方面,由于它们的虚拟机都自带运行时编译的JIT功能,所以速度仅次于C++。
但是在功能方面,无法实现像C++那样,对交易系统底层进行优化。在扩展性能方面,相对于C++会弱一些,因为它们的扩展是需要经过C这个桥梁的,而这两种语言本身就是在虚拟机上运行,所以在扩展功能模块的时候,就需要多穿越一层墙才能实现。
不过,话说回来,量化的编程语言不重要,重要的是想法。发明者量化的麦语言和可视化语言作为量化入门的敲门砖是完全没有问题的,入门之后的提高,则是需要不断结合不同的市场状况进行尝试探索,可谓思路决定出路,眼界决定境界。
“设计你的策略,交易你的思想。”从这个角度讲,量化交易的核心仍是交易思想。作为一名量化交易者,不仅需要掌握策略编写平台的基本语法和函数,更需要在实战中体会交易理念。量化只是体现不同交易理念的工具和载体而已。
1、Python语言作为量化交易都有哪些优势? 2、试着用发明者的麦语言写几个常用的API?
相信有了以上关于编程语言的介绍,你心里一定知道该怎么选择了吧,那么接下来几个章节,我们将按照编程语言的分类,有针对性的学习量化交易策略开发。
什么是麦语言?所谓的麦语言就是从早期的股票技术指标延伸出来的一套程序化函数库。把算法封装到一个个函数里,用户只需要像拼“积木式”一样调用一行行函数,实现策略逻辑。
它采用"小语法,大函数"的构建模式,大幅提高编写效率,其他语言100多句的策略,用麦语言一般10几句就可以编出来。配合发明者量化工具的金融统计函数库和数据结构,同样也能支持部分复杂的交易逻辑。
为了帮助大家快速理解本节的重点知识,在介绍发明者量化麦语言快速入门之前,先对本节名词概念有个初步了解。我们还是用长期50日均线和短期10日均线作为基本的案例,回顾一下上一章节讲过的完整策略案例:
多头开仓:如果当前没有仓位,并且收盘价大于短期均线,并且收盘价大于长期均线,并且短期均线大于长期均线,并且长期均线是上升的。
空头开仓:如果当前没有仓位,并且收盘价小于短期均线,并且收盘价小于长期均线,并且短期均线小于长期均线,并且长期均线是下降的。
多头平仓:如果当前持有多单,并且收盘价小于长期均线,或者短期均线小于长期均线,或者长期均线是下降的。
空头平仓:如果当前持有空单,并且收盘价大于长期均线,或者短期均线大于长期均线,或者长期均线是上升的。
如果用麦语言代码编写出来,就是这样的: 图3-3 麦语言完整范例
要想编写一个完整的量化交易策略,通常需要:数据获取、数据计算、逻辑计算、下单买卖等几个步骤。如上图所示,在整个代码中,只用到了一个获取基础数据的API,就是第一行和第二行中的“CLOSE”;然后第一行至第9行则是数据计算部分;最后第十一行至第十四行是逻辑计算和下单部分。
注意看,紫色的代码是变量;在第一行至第九行中,绿色的“:=”是赋值符,赋值符右边的数据计算完毕后赋值给赋值符左边的变量;橘色的代码就是API,比如在第一行中,调用MA(均线)需要传入两个参数,传入参数你可以理解为设置,也就是在调用MA的时候,需要设置MA的类型;玫红色的“AND”、“OR”是逻辑运算符,主要用来连接多个逻辑计算等等。有了以上的基础知识概念,下面我们就开始学习详细的麦语言基础。
基础数据(开盘价、最高价、最低价、收盘价、成交量)是量化交易中不可或缺的一部分,在策略中获取最新的基础数据,只需要调用发明者量化工具的API就可以了。如果要获取历史的基础数据,可以使用“REF”,如:REF(CLOSE,1)就是获取昨天的收盘价。
变量是可以变的数,变量的名字可以理解为代号,其命名支持持汉字、字母、数字、划线格式命名,但长度需控制在31字符内。变量名称不能相互重复,不能与参数名重复,不能与函数名(API)重复,每个语句应该以分号结束。想要在编写后,加入自己的语言注释,在结尾处用“//”表示。需在半角输入法的大写状态下进行编写。如下图所示: 图3-4 麦语言数据类型
变量赋值就是把赋值符右边的数值给左边的变量,赋值符一共有4种,可以控制数值是否显示在图表上,以及定义显示的位置。下图绿色的字体就是赋值符啦,分别是“:”、“:=”、“^^”、“…”,图中代码注释部分,详细解释了它们的含义。 图3-5 麦语言变量赋值
在麦语言中,有多种数据类型,其中最常用的是数值类型、字符串类型、布尔类型。数值类型就是数字,包括整数、小数、正负数等,如:1、2、3、1.1234、2.23456……;字符串类型你可以理解为文字,中文、英文、数字都可以是字符串,如:‘发明者量化’、‘CLOSEPRICE’、‘6000’,字符串类型必须用英文分号包裹;布尔类型是最简单的,它只有2个值“是”和“否”,如:用1代表true表示“是”,0代表false表示“否”。
关系运算符,顾名思义是用来比较两个值的关系的运算符。分别为等于、大于、小于、大于等于、小于等于、不等于,如下图: 图3-6 麦语言运算符
逻辑运算可以把单独的布尔类型语句连接成一个整体,最常用的是“AND”(并且)和“OR”(或)。假设有两个布尔类型值,分别是“收盘价大于开盘价”和“收盘价大于均线”,我们可以将它们组成一个布尔值,比如:“收盘价大于开盘价并且(AND)收盘价大于均线”,“收盘价大于开盘价或者(OR)收盘价大于均线”。 图3-7 麦语言逻辑运算
大家注意: “AND”是所有条件都为“是”的时候,最终条件才为“是”; “OR”是所有条件中,只要有任何一个条件为“是”,最终条件就为“是”。 “AND”可以写成“&&”,“OR”可以写成“||”。
常用的麦语言的算数运算符(“+”、“-”、“*”、“/”)和小学学习的数学没有任何区别,如下图: 图3-8 麦语言算数运算
如果有一个100*(10-1)/(10+5)表达式,程序是先计算哪一步?中学数学告诉我们:①如果是同一级运算,一般按从左往右依次进行计算。②如果既有加减、又有乘除法,先算乘除法、再算加减。③如果有括号,先算括号里面的。④如果符合运算定律,可以利用运算定律进行简算。麦语言的优先级也是如此,如下图: 图3-9 麦语言算数运算优先级
在发明者量化工具的麦语言中,程序策略执行一共有2种模式,即:收盘价模式和实时价模式。收盘价模式指当前K线信号成立,在下根K线开始的时候立即执行下单交易。实时价模式指的当前K线信号成立,就立即执行下单交易。
如果是日内策略,尾盘需要平仓时,就需要用到“TIME”时间函数。该函数在秒周期以上,日周期以下,显示为四位数的形式,即:HHMM(1450——14点50分)。注意:使用TIME函数作为尾盘平仓的条件,建议开仓条件也要做相应的时间限制。如下图: 图3-10 麦语言时间函数
图3-11 麦语言模型分类
麦语言中的模型分类一共有两种,即:非过滤模型和过滤模型。这个其实很好理解:非过滤模型允许连续出现开仓信号或平仓信号,可以实现加仓和减仓功能。过滤模型不允许连续出现开仓或平仓信号,也就是当开仓信号出现后,之后的开仓信号会被过滤掉,直到出现平仓信号,非过滤模型出信号的顺序是:开-平-开-平-开…
以上就是麦语言快速入门的内容,学习后就可以编程量化交易策略啦。如果需要编写更加复杂的策略,可以参考发明者量化工具麦语言API文档,或者直接咨询官方客服代写量化交易策略。
日内交易也是一种交易模式,这种方式不留仓过夜,所以受市场波动率风险较低,一旦出现不利行情,可以及时进行调整。学习了本节麦语言入门,下节我们将带大家手把手编写一个可行的日内量化交易策略。
1、试着用发明者量化工具写下麦语言获取基础数据的API。 2、变量赋值在图表中一共有哪些显示方式?
在上一篇中,我们从麦语言的简介、基础语法、模型执行方式、模型分类等方面为大家讲解实现交易策略的前提部分,本篇我们将继续上篇内容,从常用的策略模块、技术指标,一步一步帮助大家实现一个可行的日内量化交易策略。
想想一下,你是怎么用乐高积木碎片拼一个机器人的?你总不可能从上到下或者从下到上,一块一块拼起来。稍微有点常识的人都知道,应该把头、手臂、腿、翅膀等等,各自拼起来,然后再组合成一个完整的机器人。写程序也是一样的,把所需要的功能都写成一个个策略模块,然后再把一个个策略模块,组合成一个完整的量化交易策略。下面我就先列举些常用的策略模块:
阶段涨幅就是计算当根K线收盘价与前N个周期收盘价的差值的百分比。比如:计算最近10根K线阶段涨幅是多少,用代码可以写成: 图3-12 麦语言阶段涨幅
再创新高就是计算当根K线是否大于N个周期以来的最高价。比如:计算当根K线是否大于最近10根K线中的最高价,用代码可以写成: 图3-13 麦语言再创新高
放量上攻可以理解为价格上扬,成交量剧增。比如:如果当根K线的收盘价是前第10根K线的收盘价的1.5倍,即10天内涨了50%;成交量超过最近10根K线平均值的5倍。用代码可以写成: 图3-14 麦语言放量上攻
窄幅整理就是指近一段时期价格维持在一定幅度之内。比如:如果10个周期内的最高价与以10个周期内的最低价的差值,除以当根K线的收盘价,小于0.05左右。用代码可以写成: 图3-15 麦语言窄幅整理
均线多头排列分为多头排列和空头排列,K线在5—10—20—30—60均线下支撑排列向上为多头排列,多头排列就是市场趋势是强势上升势。用代码可以写成: 图3-16 麦语言均线多头排列
要获取前期高点,以及这个高点所在的位置,可以直接通过发明者量化工具的API直接获取。用代码可以这样写: 图3-17 麦语言前期高点
跳空缺口就是两条K线的最高低价出现不衔接的情况,由两条K线组成,跳空缺口是日后支撑和压力点的参考价位。当一个跳空缺口出现时,可以假设一个沿着原来跳空方向上的趋势的加速已经开始了。用代码可以这样写: 图3-18 麦语言跳空缺口
图3-19 移动平均线图
站在统计学的角度看,均线就是每天价格的算术平均,它是一条带有趋势性的价格轨迹。均线系统是大多分析者常用的技术工具,从技术角度看是影响技术分析者心理价位因素的,思维买卖的决策因素,是技术分析者的良好的参考工具,发明者量化工具支持多种不同类型的均线,如下图: 图3-20 麦语言各种指标计算
图3-21 BOLL通道图
BOLL又称布林带指标,也是利用统计学原理,先根据N日移动平均线计算出中轨,再根据标准差,计算出上轨和下轨。当BOLL通道由宽变窄,说明价格逐渐向均值回归。当BOLL通道由窄变宽,意味着行情开始发生变化,如果价格上穿上轨,表明买力增强,如果价格下穿下轨,表明卖力增强。
在所有的技术指标中,BOLL的计算方法是最复杂之一,其中引进了统计学中的标准差概念,涉及到中轨线(MB)、上轨线(UP)和下轨线(DN)的计算。其计算方法如下: 图3-22 麦语言布林带计算
图3-23 MACD指标
MACD指标是运用快速(短期)和慢速(长期)移动平均线及其聚合与分离的征兆,加以双重平滑运算。而根据移动平均线原理发展出来的MACD,一则去除了移动平均线频繁发出假信号的缺陷,二则保留了移动平均线的效果,因此,MACD指标具有均线趋势性、稳重性、安定性等特点,是用来研判买卖股票的时机,预测股票价格涨跌的技术分析指标 。其计算方法如下:
图3-24 麦语言MACD指标
以上就是在开发量化交易策略中较常用的策略模块,当然其实远不止这些,通过以上的模块例子,也可以动手实现几个你在主观交易中最常用到的交易模块,方法都是通用个的。接下来,我们就开始编写一个可行的日内量化交易策略。
在外汇现货市场,曾经广为流传一种突破交易策略,它就是HANS123策略,它以其简洁的开盘后N根K线的高低点突破,作为交易信号触发的评判标准。这也是一种入场较早的交易模式。
在开盘30分钟后准备入场; 上轨=开盘后30分钟高点; 下轨=开盘后30分钟低点; 当价格突破上轨,买入开仓; 当价格跌穿下轨,卖出开仓。 日内交易策略,收盘前平仓;
图3-25 麦语言策略代码
以上我们学习了策略模块的概念,以及通过几个常用的策略模块案例,熟悉发明者量化工具的编程方法,可以说学好编写策略模块,提高编程逻辑思维,是进阶量化交易的关键一步。最后我们又用发明者量化工具实现了,在外汇现货交易中常用的交易策略。
也许会有小伙伴感到困惑,密密麻麻的代码看不懂。别急,这些我们都已经替你想到了,在发明者量化工具中,还有一种编程语言,更适合小小白的用户使用,它就是可视化编程,顾名思义就是所见即所得,一起期待吧!
1、试着动手实现几个你在主观交易中最常用到的交易模块。 2、试着用发明者量化工具中的麦语言实现KDJ指标算法。
很多主观交易者对量化交易感兴趣,刚开始信心满满,等学完传统编程语言的基础语法、数据运算、数据结构、逻辑控制等等,看着即冗长又复杂的代码后,往往又望而却步,或者浅尝辄止,这时可视化编程语言可能更适合带你入门。
为了帮助大家快速理解本节的重点知识,在介绍发明者量化可视化编程语言快速入门之前,先看下用可视化语言写出来的策略是什么样的?以及对本节名词概念有个初步了解。我们以最简单的收盘价大于50周期均线做多,反之收盘价小于50周期均线做空为例:
多头开仓:如果当前没有仓位,并且收盘价大于50周期均线。 空头开仓:如果当前没有仓位,并且收盘价小于50周期均线。 多头平仓:如果当前持有多单,并且收盘价小于50周期均线。 空头平仓:如果当前持有空单,并且收盘价大于50周期均线。
如果用可视化语言把上面的策略编写出来,就是这样的(如下图): 图3-26 可视化语言界面
如上图所示,整个策略设计流程就是:设置行情品种、获取K线数组、获取上根K线的50周期均值、获取上根K线的收盘价、获取持仓数组、判断持仓状态、判断收盘价是否大于或小于均线、执行开仓或平仓。
这里需要注意“数组”这个概念,数组对于每一门编程语言来说都是重要的数据结构之一。数组就像容器一样,里面可以存放一系列的值。比如:调用获取K线数组的API,它返回的结果是这样的: 图3-27 K线数组
上图中的代码就是一个K线数组,该数组一共有3个数据,分别是上上根K线的数据、上根K线的数据、当根K线的数据。假如我们把这个数组赋值给一个变量“arr”,如果想要获取这个数组中,最后一个数据(当根K线的数据)可以这样写(如下图第4、5行): 图3-28 数组的引用
大家直接用第二种(第5行)的写法,因为现实中K线数据有成百上千根,而且新的K线是不断增加的。所以可以先获取数组的长度,“arr.length”的意思是获取该数组的长度,再减去“1”,就是最新K线的数据。如果想要获取上根K线的数据,就减去“2”。
细心的你可能会发现,这些数据都用“{}”包括起来,看英文名就大概知道里面对应的分别是:时间、开盘价、最高价、最低价、收盘价、成交量。如果想要获取上根K线的收盘价,直接在后面加上“.”再加上所需要的值就可以了,参照下图第8~10行。 图3-29 数组的引用
有了以上的概念,让我们先用Java语言写一个输出“hello, world”的程序,来感受一下传统编程,如下图: 图3-30
仅仅只是输出一个“hello world!”字符串的程序,就写了5行代码。相信大多数初学者,只认识括号中的英文单词“hello, world”,其他更是无从下手。所以,比起手足无措,以可视化编程为入门,不失为更好的选择。
可视化编程由来已久,并不是新鲜事物。这种“所见即所得”的编程思想,搭载着各种控件模块,仅仅以拖拽的方式,就可以构建代码逻辑,完成交易策略设计,过程很像搭积木一样。 图3-31
如上图,同样的程序,在blockly可视化编程中只需要一行代码就搞定。这极大的降低了编程门槛,尤其针对那些完全不懂编程的交易者,这是非常棒的操作体验。
blockly可不是一个编程玩具,它是实诚的编辑器,而不是那种伪装成编辑器的操作系统,支持许多编程的基本元素,如:变量、函数、数组,及易于扩展自定义的块,你可以用它完成复杂的编程任务。在设计上十分符合unix哲学:Do one thing。
发明者量化的可视化编程,也正是借着Google发布的 blockly可视化工具来实现的。在设计上与麻省理大学推出的Scratch类似,真正的零门槛(如下图)。 图3-32
在发明者量化的可视化编程界面,内置上百种常用交易模块,后续会有更多的交易模块加入,来支持交易者的新思想和新应用,这些将由开发者共同开发和维护。
虽然语法简单,但又不失性能。几乎可以满足大多数简单的量化交易策略开发。无论是在功能、速度上,不输于Python、JavaScript等常规编程语言。未来将会支持逻辑复杂的金融应用。
图3-33
图3-34
图3-35
以上我们从一个完整的可视化策略开始,到可视化语言的简介以及特点,最后介绍如何在发明者量化工具上使用可视化语言,以及用写了一个“hello world”的例子。不过需要提醒大家的是,作为量化交易入门,可视化编程是一个很好的敲门砖,但是目前在发明者量化工具上,只开放了有限的API接口,对于量化交易来说,最好是把它当作帮助你理清策略逻辑的辅助工具。
可视化编程与高级编程语言基础没什么区别,甚至有些地方是通用的,学会了可视化编程也就离学会高级编程更进一步。下节我们将深入可视化编程进阶学习,包括如何在发明者量化工具上用可视化语言编写常用的量化交易模块,以及如何开发一个完整的日内交易策略。
1、在发明者量化可视化编程界面,使用API并理解他们的意思。 2、用可视化语言获取最新的开盘价,并把它输出到日志中。
上篇内容我们学习了可视化编程语言的简介和特点、“hello world”例子,以及在发明者量化交易工具中策略编写等方面,为大家讲解实现交易策略的前提部分。本篇我们继续接上篇,从常用的策略模块和技术指标开始,再到策略逻辑,一步一步帮助大家实现一个完整的日内交易策略。
阶段涨幅就是计算当根K线收盘价与前N个周期收盘价的差值的百分比。比如:计算最近10根K线阶段涨幅是多少,用代码可以写成: 图3-36
以上代码可以发现,计算机执行的方式是需要一个完整的逻辑循环,比如要计算最近10根K线阶段涨幅,需要拆分为以下几个步骤: 首先计算机要明确知道你要交易什么品种,比如上图案例为甲醇,那么设置合约代码为:“MA888”。设置完合约代码,就可以获取该合约的K线数据了。
有了K线数据,就可以从这些K线数据中,获取任何一根K线的详细数据。 要统计阶段涨幅,就必须先获取2根K线收盘价,比如:上根K线收盘价和前面第11根K线的收盘价。
最后再根据这2根K线收盘价,计算出阶段涨幅比率。以下每一个策略都有这样的逻辑循环和条件属性规定的特征,看懂了这个逻辑,可视化编程也就会变得容易的多。
放量上攻可以理解为价格上扬,成交量剧增。比如:如果当根K线的收盘价是前第10根K线的收盘价的1.5倍,即10天内涨了50%;成交量超过最近10根K线平均值的5倍。用代码可以写成: 图3-37
跳空缺口就是两条K线的最高低价出现不衔接的情况,由两条K线组成,跳空缺口是日后支撑和压力点的参考价位。当一个跳空缺口出现时,可以假设一个沿着原来跳空方向上的趋势的加速已经开始了。用代码可以这样写: 图3-38
站在统计学的角度看,均线就是每天价格的算术平均,它是一条带有趋势性的价格轨迹。均线系统是大多分析者常用的技术工具,从技术角度看是影响技术分析者心理价位因素的,思维买卖的决策因素,是技术分析者的良好的参考工具,发明者量化工具支持多种不同类型的均线,如下图: 图3-39
MACD指标是运用快速(短期)和慢速(长期)移动平均线及其聚合与分离的征兆,加以双重平滑运算。而根据移动平均线原理发展出来的MACD,一则去除了移动平均线频繁发出假信号的缺陷,二则保留了移动平均线的效果,因此,MACD指标具有均线趋势性、稳重性、安定性等特点,是用来研判买卖股票的时机,预测股票价格涨跌的技术分析指标 。其计算方法如下: 图3-40
KDJ指标综合了动量观念、强弱指标及移动平均线的优点,用来度量股价脱离价格正常范围的变异程度。考虑的不仅是收盘价,而且有近期的最高价和最低价,这避免了仅考虑收盘价而忽视真正波动幅度的弱点。其计算方法如下: 图3-41
沃伦 · 巴菲特的导师本杰明 · 格雷厄姆曾经在《聪明的投资者》一书中,曾经提到过一种股票债券动态平衡的交易模式。
这种交易模式非常简单: 把手中 50% 的资金投资于股票基金,剩下 50% 投资于债券基金。即股票和债券两者各占一半。
根据固定间隔时间或市场变化进行一次资产再平衡,使股票资产和债券资产的比例恢复到初始的 1:1。这就是整个策略的全部逻辑,包含了什么时候买卖,以及买卖多少。够简单吧!
在这个方法中,债券基金的波动率其实很小,远远低于股票波动率,所以债券在这里被当做『 参照锚 』,也就是说,用债券来衡量股票究竟是涨得太多了,还是涨得太少了。
如果,股票价格上涨,会使得股票的市值大于债券的市值,当两者市值比率超过设定的阈值时,则对总仓位进行重新调整,卖出股票,并且买入债券,使股债市值比例恢复至初始的 1:1。
反之,股票价格下跌,会使得股票的市值小于债券的市值,当两者市值比率超过设定的阈值时,则对总仓位进行重新调整,买入股票,并且卖出债券,使股债市值比例恢复至初始的 1:1。
就这样,在动态平衡股票和债券之间的比例,就够享受到股票成长的果实,并且减少了资产波动率。作为价值投资的先驱,格雷厄姆为我们提供了一个很好的思路。
按照当前的 BTC 的价值,账户余额保留¥5000 现金和 0.1个 BTC,即现金和BTC 市值的初始比例是 1:1。
如果 BTC 的价格上涨至¥6000,即 BTC 市值大于账户余额,并且其之间的差超过设定的阈值,就卖掉(6000-5000)/6000/2个币。说明 BTC 升值了,把钱兑换回来。
如果 BTC 的价格下跌至¥4000,即 BTC市值小于账户余额,并且其之间的差超过设定的阈值,就买入(5000-4000)/4000/2个币。说明 BTC 贬值了,把 BTC 买回来。
就这样,不管 BTC 是升值还是贬值,始终动态保持账户余额和 BTC 的市值相等。如果 BTC 贬值了就买一些,等再涨回来,就再卖一些,就好像天平一样。
买入条件:如果当前持仓市值减去当前可用余额小于负当前可用余额5%,就开仓买入。 卖出条件:如果当前持仓市值减去当前可用余额大于当前可用余额的5%,就平仓卖出。
我们把交易策略的4个前提必要条件加以计算,并分别赋值给各自变量。以可视化编程,代码块是这样的。如下图 图3-42
需要注意的是,币总市值也就是当前持仓币数的总市值,其计算方法就是,当前持仓总币数乘以当前的最新价格。资产差也就是币总市值减去当前的可用余额。
前提必要条件赋值完成后,就需要写交易逻辑了。这个也没有想象中那么复杂。无非就是把上述的策略逻辑,用代码块的形式表现出来。
即如果资产差小于负可用余额的5%就买入,如果资产差大于可用余额的5%就卖出。如下图: 图3-43
整个策略似乎已经写完,但是要知道,程序是从上到下执行的,执行完之后就停止了。但是我们的交易策略并不是把交易条件执行一次就行,而是循环往复的重复执行。
也就是说,程序需要不断的检查策略条件是否已经达成,如果是就执行买卖,否则就一直检查下去。这个时候就需要用到另一个循环语句,如下图: 图3-44
可视化策略跟其他编程语言写的策略没什么本质区别,同样支持多种周期、做种精度的历史数据测试,当然也支持国内外商品期货和数字货币实盘交易。以下是该策略的回测信息: 图3-45
至此,一个完整的交易策略才算完成。为了照顾伸手党,本篇策略已经分享到策略广场中,可以直接复制研究。
一万小时定律始终存在,但是对于零基础的交易者来说,不可能花一万个小时再入行。所以你必须有一把梯子,而对于零编程基础的交易者来说,发明者量化的可视化编程就是一把快速入门的梯子。
利用可视化编程,你无需记住语法和方法名称,只需简单地浏览功能模块,从中找到你想要的即可。发明者量化的初衷也在于此,意在帮助更多的量化初学者降低准入门槛,提高量化兴趣,人人都可能成为量化交易者!
不过,话说回来,可视化编程作为量化入门的敲门砖是完全没有问题的,但也有自己的局限性,比如不能开发过于复杂、过于精细化的交易策略。但这并不影响你迈出量化交易的第一步!
从量化交易的专业性来说,无论是麦语言还是可视化语言,都只是进入量化交易世界的过渡语言。它们的语言特点,也就决定了在量化交易策略开发中的局限性,一些复杂的策略不太可能实现出来。所以下节我们将带你学习JavaScript,它是一门正式的高级编程语言,也是你进阶高级量化交易的必经之路。
1、试着用可视化语言实现布林带指标。 2、试着用本节的交易模块,完成一个交易策略。
作为未来一名量化交易新星,你不可能只学习一门简单的语言就够了。发明者量化工具的麦语言和可视化语言,虽然能带你入门,但由于它们的语言特性,在策略开发中有很多局限性。所以,要想在量化交易中有立足之地,你必须学会一门正式的编程语言。
相比于可视化语言,JavaScript语言有更强的性能和执行效率。并且在策略开发方面,JavaScript语言要比可视化语言灵活许多,比如:你想开发一个套利策略,那么用可视化语言是不行的,因为它有限的模块,不支持类似套利的策略策略,而JavaScript语言就能轻松胜任。
另外,JavaScript语言比可视化语言更加简洁和优雅,比如:可视化语言10行代码,用JavaScript可能5行就能写出来。从某些方面看,可视化语言仅仅是JavaScript的文字版,其代码的执行方式和逻辑与JavaScript几乎是一样的。如果你学会了可视化语言,那么学习JavaScript将是非常轻松的。
JavaScript是一门正式的高级编程语言。它既适合当作学习编程的入门语言,也适合当作日常开发的工作语言。它是目前最有希望、前途最光明的计算机语言之一,至今在浏览器端都有不可撼动的霸主地位。虽然它是作为开发Web 页面而出名的,但是它也被用到了很多非浏览器环境中,例如:服务器、PC端、移动端等,当然它还可以做量化交易!
为了帮助大家快速理解本节的重点知识,在介绍发明者量化JavaScript语言快速入门之前,先对本节名词概念有个初步了解。我们就用最简单的双均线策略为例:
多头开仓:如果当前没有仓位,并且5周期均线大于20周期均线。 空头开仓:如果当前没有仓位,并且5周期均线小于20周期均线。 多头平仓:如果当前持有多单,并且5周期均线小于20周期均线。 空头平仓:如果当前持有空单,并且5周期均线大于20周期均线。
如果用JavaScript语言代码编写出来,就是这样的: 图4-1
上图中的代码就是用JavaScript语言写的一个完整的量化交易策略。可以实盘运行,并且自动下单交易。从代码量上看,该语言比可视化语言更简单些。整个策略的设计流程是:设置行情品种、获取K线数据、获取持仓信息、计算交易逻辑、下单买卖。
JavaScript中的一切(变量、函数名和操作符)都区分大小写,也就是说变量名test和变量名Test是两个不同的变量。标识符(变量、函数、属性、函数参数的名字)的第一个字符必须是字母、下划线(_)、美元符($),后面的字符还可以是数字,如下图所示: 图4-2
注释包括单行注释和块级注释。单行注释以两个斜杠开头,块注释以一个斜杠和一个星号(/)开头,以一个星号和一个斜杠(/)结尾,如下图所示: 图4-3
每个语句都有一个分号结尾;虽然这不是必须的,但我们建议任何时候都不要省略它。加上分号,在某些情况下可以增加代码的性能,如下图所示: 图4-4
变量可以保存任何类型的数据,创建变量的时候要使用var操作符,后面跟变量名。定义变量的时候同时还可以设置变量的值。一旦变量创建后,再次设置变量的值,就不用使用var操作符,如下图所示: 图4-5
JavaScript一共有5种数据类型,分别是:未定义(Undefined)、对象为空(Null)、布尔值(Boolean)、数字(Number)、字符串(String),如下图所示: 图4-6
Undefined只有一个值,即特殊的“undefined”,它代表一个还没有设置的值。比如我们只定义一个变量,不给这个变量设置值,那么该变量的值就是“undefined”。
Null只有一个值,即特殊的“null”,它代表一个被设置为空的值。比如我们先创建一个变量,然后把变量的值设置为“null”,那么反问该变量返回的值就是“null”。
Boolean有两个值,即“true”和“false”,“true”代表真,“false”代表假。需要注意的是,“true”和“false”都是小写。
Number也就是数字类型,包括:正数、负数、整数、小数等等。除此之外“NaN”也是一个特殊的数字,它专门表示未返回数值的情况,比如:1除以0,返回“NaN”。
String你可以理解为文字,包含中文和英文,可以通过单引号或双引号来构造字符串。比如:“fmz”或者‘发明者量化’等。
对象你可以理解为一个存放各种数据的容器,容器中属性和值都是对应的。可以通过new操作符先把这个容器创建出来。并且可以给创建后的对象添加属性和方法,如下图所示: 图4-7
数组也是一个存放各种数据的容器,只不过容器中的元素是从左往右有序排列的,第一位的元素是0,第二位的元素是1,以此类推。另外JavaScript的数组可以存放任何数据类型,如下图所示: 图4-8
JavaScript中的函数跟我们中学学的函数没有本质的区别,你可以理解为传进去什么,通过函数的计算,输出什么,如下图所示: 图4-9
JavaScript有多种运算符,即算术运算符、比较运算符、逻辑运算符。其中算术运算符就是加减乘除的数学运算,比较运算符可以比较两个值是否小于或者小于,逻辑运算符主要有:逻辑与、逻辑或、逻辑非。如下图所示: 图4-10 需要注意的是:“&&”是逻辑与,代表“并且”的意思。“||”是逻辑或,代表“或者”的意思。“!”是逻辑非,代表“否”的意思: “&&”是所有条件都为“true”的时候,最终条件才为“true”; “||”是所有条件中,只要有任何一个条件为“true”,最终条件就为“true”。
如果有一个100*(10-1)/(10+5)表达式,程序是先计算哪一步?中学数学告诉我们:①如果是同一级运算,一般按从左往右依次进行计算。②如果既有加减、又有乘除法,先算乘除法、再算加减。③如果有括号,先算括号里面的。④如果符合运算定律,可以利用运算定律进行简算。JavaScript语言的优先级也是如此,如下图: 图4-11
通常在写代码时,您总是需要为不同的决定来执行不同的动作。您可以在代码中使用条件语句来完成该任务。 在 JavaScript 中,我们可使用以下条件语句: if 语句 - 只有当指定条件为 true 时,使用该语句来执行代码 if…else 语句 - 当条件为 true 时执行代码,当条件为 false 时执行其他代码 if…else if…else 语句- 使用该语句来选择多个代码块之一来执行 switch 语句 - 使用该语句来选择多个代码块之一来执行
只有当指定条件为 true 时,该语句才会执行代码。请使用小写的 if。使用大写字母(IF)会生成 JavaScript 错误!如下图所示: 图4-12#
当条件为 true 时执行代码,当条件为 false 时执行其他代码,如下图所示: 图4-13
有时候我们需要获取最近几天的K线数据,就需要从K线数组中,根据K线数据的位置依次获取,那么使用for循环是很方便的,如下图所示: 图4-14
我们都知道行情是在不断变化的,如果你想获取最新的K线数组,就得不断的去一遍又一遍地运行相同的代码,那么使用whilex循环,只要指定条件为true,循环就可以一直获取最新的K线数组。 图4-15
循环是有前提条件的,只有这个前提条件为“true”的时候,循环才会开始重复的做某些事,直到这个前提条件为“false”的时候,循环才会结束。但是break语句可以在循环执行的过程中立刻跳出循环;continue 语句可以中断某一次循环,然后继续下一次循环。如下图所示: 图4-16
return语句会终止函数的执行并返回函数的值。return语句只能出现在函数体内,出现在代码中的其他任何地方都会造成语法错误! 图4-17
在发明者量化工具中,如果用JavaScript语言编写策略将会非常方便,官方内置了一套标准策略框架,如下图所示: 图4-18
如上图中的代码,这是一个标准的策略框架,除了可以更改“商品期货品种代码”外,其他都是固定的格式,使用框架编写策略的最大好处是,你只需要编写策略逻辑就行了,其他的行情获取、下单处理等等一系列问题,都由框架处理。这样可以是你专注于策略开发。
以上就是JavaScript语言快速入门的内容,学习后就可以编程量化交易策略啦。如果需要编写更加复杂的策略,可以参考发明者量化工具JavaScript语言API文档。
日内交易也是一种交易模式,这种方式不留仓过夜,所以受市场波动率风险较低,一旦出现不利行情,可以及时进行调整。学习了本节JavaScript语言入门,下节我们将带大家手把手编写一个可行的日内量化交易策略。
1、试着用发明者量化工具中的JavaScript语言获取历史K线数据。 2、试着写下本节开头的策略代码,并写上注释。
在上一篇中,我们从JavaScript语言的简介、基础语法、CTA策略框架等方面为大家讲解实现交易策略的前提部分,本篇我们将继续上篇内容,从常用的策略模块、技术指标,一步一步帮助大家实现一个可行的日内量化交易策略。
布林带也称为布林通道,英文简称BOLL。它是最常用的技术指标之一,由约翰·包宁杰(John Bollinger)在1980年代发明。理论上,价格总是围绕着价值在一定范围内上下波动,布林带正是根据这个理论基础,又引入了“价格通道”的概念。
其计算方式是利用统计学原理,先计算一段时间价格的“标准差”,再由均线加/减2倍的标准差,求出价格的“信赖区间”。其基本的型态是由三条轨道线组成的带状通道(中轨、上轨、下轨)。中轨为价格的平均成本,上轨和下轨分别代表价格的压力线和支撑线。
由于采用了标准差的概念,使得布林通道的宽度会根据近期价格的波动而做出动态调整。波动小,布林通道会变窄;波动大,布林通道会变宽。当BOLL通道由宽变窄,说明价格逐渐向均值回归。当BOLL通道由窄变宽,意味着行情开始发生变化,如果价格上穿上轨,表明买力增强,如果价格下穿下轨,表明卖力增强。
在所有的技术指标中,布林带的计算方法是最复杂之一,其中引进了统计学中的标准差概念,涉及到中轨线(MB)、上轨线(UP)和下轨线(DN)的计算。其计算方法如下:
中轨 = N时间段的简单移动平均线 上轨 = 中轨 + K × N时间段的标准差 下轨 = 中轨 − K × N时间段的标准差 图4-19
布林线的使用方法有很多,可以单独使用,也可以和其他指标结合在一起使用。 本节教程我们将采用布林线一种最简单的使用方法。即:当价格自下而上突破上轨,即突破上方压力线时,我们认为多方力量正在走强,一波上涨行情已经形成,买入开仓信号产生;
Hailhydra2 好文章啊!
悟空量化 mark