量化交易中麦语言与MQL4的区别,哪个更有什么样的优势与缺点?

Q是一个数据语言,目前被限定为一个数据定义语言(DDL)。Q采用JSON/XML模式,其配备了一个专用的用于定义数据的类型系统,和一个称为“信息合约”的理论,用于程序和数据交换语言之间的互操作。Q语言是专为量化投资和程序化交易开发的动态编程语言,兼具C++语言的灵活性和EasyLanguage语言的易用性,支持证券、期货、上海黄金交易所、渤海商品交易所所有指。标的历史数据、实时行情、程序化交易;支持恒生、金仕达、顶点、金证、易盛、CTP、国外FIX等几乎所有的交易接口;同时还支持C++,C#、JAVA、MATLAB、R等多种语言的调用。

为量化投资和程序化交易开发

面向对象,可以自定义类;

以一行代表一条完整的语句;

以Tab缩进实现结构化控制,使得程序可读性更强;

是弱数据类型的编程语言,能够实现变量、参数类型的智能化处理。

一个完整的Q语言策略程序由两个可选择使用模块三个必需模块构成:

1.两个可选择使用的模块

“引用”模块:在此模块可以声明想要引用的外部函数或类。

“外部参数”模块:在此模块中可定义全局性的静态变量,一般把策略的参数定义在此模块中。

Init()模块:仅在策略准备时运行一次。在该模块中,用户可定义全局变量,并对其进行赋初值。

Start()模块:由实时行情或后验数据流驱动循环调用,引擎每接受到一个新的数据就运行一次。策略编写者的策略思想主要在该模块中实现。每次执行完成后,在Start()模块中定义的局部变量会被释放,但在Init()模块中定义的全局变量以及在“外部参数”模块中定义的参数会保留,进入下一次Start()循环。

UnInit()模块:为程序全部执行完成结束后调用,为系统默认调用,一般地用户不需要在此模块中编写代码。

在Q语言中,变量可分为一般编程语言通用的“常规变量”和程序化交易专用的“特殊变量”,以下就是两类变量以及其定义和使用方法做简要介绍。

在使用变量之前,需要对变量进行声明和赋予初值。Q语言是一种弱类型的程序语言,变量类型不需要特别进行声明,变量声明和赋予初值可同步进行,变量类型由所赋予的初值的数据类型决定。变量名称可采用大写字母(A-Z)、小写字母(a-z)、下划线(_)以及数字(0-9)等,但首字母不能为数字。变量名称的长度基本没有限制。

示例:变量声明和变量类型的确定

i=5将i声明为整数(int)型变量,并赋予初值5。

Price=[0.1]将Price声明为长度为1的双精度型的动态列表变量,并赋予初值0.1。

Price=[0.1]*10将Price声明为长度为10的双精度型的动态列表变量,并把数值中每个元素的初值设为0.1。

DateTime类型为系统定义的一种类型,可通过构造函数DateTime定义,包括下表所列出的一些属性和方法。

相关联的一些同类型的数据可以以列表的形式来组织。在Q语言中,用户可以定义各种列表结构,包括:整型、双精度型、字符(串)型以及布尔逻辑型等基本类型;也可以是Q语言定义的结构变量类型;还可以是用户自定义的数据类型。

Q语言简化了列表定义的方式,采用简洁的直接赋值的方式进行定义及初值的设定,形式如下所示:

其中,Listname表示列表名称,init_valueN为赋予每个列表元素的初值,Length为列表的长度(即列表包含元素的个数)。列表元素的类型由其初值的类型确定,“*Length”为可选;如果不设定,表示列表的长度为1。

CharArray = [‘A’,’B’]定义长度为2 的字符列表变量CharArray,并给元素分别赋予初值’A’和’B’。

列表的取值操作通过“[]”符号完成,如下表所示:

Listname[1:4]取出列表从第2个到第5个之间的所有值

Listname[-3:]取出列表从倒数第3个到倒数第1个的所有值

Listname[3:]取出列表从第4个到最后一个的所有值

Listname[:]取出列表的所有值编辑操作

适用于列表的其他操作如下表所示:

Q语言中,字典(Dictionary)是由键(Key)和值(Value)一一对应所形成的基本单元的集合。

同样地,Q语言简化了字典定义的方式,采用更加简洁的直接赋值的方式进行定义及初值的设定。形式如下:

其中,dictname为构造的字典的名称,keyN为键N的名称,为字符串,valueN为键N对应的值;键keyN和值valueN均可为任意的数据类型,其值分别由定义时给定的值的类型确定。在定义好字典类后,我们可以通过访问字典的键获得该键对应的值。

根据程序化交易的特点,在开发策略代码时,可以直接调用系统内置的特殊变量来简化编码,提高开发效率。

持仓相关变量:变量名称释义

Pos.MarketPosition持仓状态。可取三种值,1,-1,0。如果多头持仓>空头持仓,该值为1;若多头持仓

Bar.Count当前Bar的全局索引。按照从左到右的顺序,全局第一根Bar的索引值为1,第二根Bar的索引值为2,以此类推。

以下两种写法是一致的:

Bar.CountIntra当前Bar在当前交易日的索引。按照从左到右的顺序,当前Bar所在交易日的第一根Bar的索引值为1,第二根Bar的索引值为2,以此类推。

Bar.CountDay当前的日Bar的索引。按照从左到右的顺序,第一根日Bar的索引值为1,第二根Bar的索引值为2,以此类推。

以下两种写法是一致的:

以下两种写法是一致的:

例如,系统日期为2013年8月1日,则Sys.Date = 资金相关变量:变量名称释义

Cap.Margin可用保证金品种相关变量:变量名称释义

BarList获取Bar数据序列信息。序号0为最新Bar。返回值为一个BarInfo类型的变量,参见BarInfo。

以下两种写法是一致的:

在“外部参数”模块中可定义全局性的静态变量,一般在整个代码中仅仅对其调用,不再进行修改,所以策略的参数可以很便利的使用“外部参数”进行定义。

Q语言提供了一些在策略开发中常用的枚举类型,各种类型的名称、取值、含义及使用范例如下表所示:

类型名称值注释使用范例

结构型的数据变量将一组相关的信息变量组织为一个单一的变量实体,其中各个信息变量的数据类型既可以是基本的数据类型,也可以是自定义的数据类型。Q语言定义了两类结构变量类型BarInfo和TickInfo,分别记录行情数据Tick数据信息和Bar数据信息,如表3和表4所示。其中,Tick数据信息是行情的最精确单位,是交易时间的最小颗粒;我国期货市场是500 毫秒推送一个Tick,股票市场是5~6 秒推送一个Tick。在一定时间段内的Tick 序列就构成了一根K 线,在Q语言中单根K线就称为一个Bar。

和枚举类型一样,除系统自带的结构变量类型之外,Q语言还不开放开发者自定义的结构类型变量。用户可以采用字典、类的方法实现结构变量的定义。

TickInfo结构类型属性介绍:

属性名称属性类型属性注释

BarInfo结构类型属性介绍:

属性名称属性类型属性注释

Q语言按照模块结构来组织程序,一个完整的模块包括函数、类、控制结构等,模块之间可以是并列关系,也可以是包含关系。

变量的作用域是指变量在各模块中的使用范围。按照作用域的范围,Q语言中变量可分为全局变量(global)和局部变量(local)。在量邦天语中

全局变量的声明在“Init()”中完成,在此模块中声明的变量自动默认为全局变量;每轮“Start()”模块运行时它都存在并一直保留至程序结束,期间可以对其进行操作。

在“Start()”模块内部声明的变量都是局部变量,作用域仅限于当轮运行的“Start()”模块;在当轮“Start()”模块运行过程中,局部变量必须先声明之后才可调用。

第1~13行构成了一个比较完整的Q语言程序。

第1~5行定义了程序的Init()模块,初始化模块。

第6~11行定义了程序的Start()模块,循环主体模块。

第7行定义了一个局部变量:addval (double型),该局部变量的作用域仅局限于当轮运行的“Start()”模块中。

第9行也定义了一个局部变量temp,特别注意:即使一个局部变量是在“Start()”模块的子模块内被定义的,它的作用域仍然是整个当轮运行的“Start()”模块,所以temp可以在if语句之外(语句10)中被调用(即便它是在if语句内被定义的)。

第12~13行定义了程序的UnInit()模块,结束化模块。

程序员转量化交易,其实是一件挺顺理成章的事,就在上周,有一位网友来我的店里拜访我,其实他来的目的也特别简单,他想向我佐证一下,职业量化交易这一条路,他可以做下去吗,以及其它一些细枝末节的问题。

他以前是某日系合资企业的程序工程师,程序背景是C++与python,天然的爱好股票市场,爱好做交易,后来投入越来越多,必竟前些年程序员的收入是出了名的高,加上行情应景,顺了些时日,有了些底气后,就越玩越大。现在也已经是一种疯狂痴迷的状态,

交谈间了解到,对他来说,似乎只有转型或兼职从事量化交易,从事量化程序模型的开发,才能将他前些年已经熟练掌握的知识更加灵活的运用起来,不至于将这些知识慢慢荒废,烂在大脑里。正好他呆在公司空闲的时间特别多,现在也是一个职业倦怠期,有空就可以划水,他是属于公司的老油条那种,还有一定的权力,但对于炒股这个爱好,很烦恼的事情就是,很想抽身职业化的去做,却又担心不确定的市场会给自己带来输不起的惨痛的教训。

还有在公司单位里,一定是不适合打开电脑或者手机的炒股界面的,思来想去,唯有量化与程序化交易的方式,才能满足他的一些不定期看盘的可能,即不错过行情,又能平衡他现在对于工作以及交易兴趣的满足。

最重要的一点,程序化与量化交易的方式,天然适合理工出身的程序员。但凡程序员只要是搞过交易的,极大程度会在交易过程中,运用早已经根植于大脑深处的数理思维模式来进行系统化的证券交易,这一点与其它行业出身的人群一对比,他们是极易采用主观与情绪化的行为进行指导交易,因此程度员这个物种做交易,会与其它职业出身的人形成鲜明的反差。

在这个市场上想要生存下来的第一步,就是构建系统化的交易策略。构建交易策略一定是需要交易参与者拥有数理思维的。

因此,数理思维已经烂熟于心的程序员从事交易时,会有给力的先天优势,而我之前也反复有讲过,数理思维指导交易,或者用于量化交易建模,是会反反复复会运用到的技能。

在量化交易从业过程中,拥有一定程度的数理知识出身背景、从业经历这种是有加分的。另外,多年的程序语言知识的积累,对于量化交易模型的开发过程,又是如虎添翼。

所以这么说来,程序员转型做量化交易,在我看来,至少在先天优势性上,就已经打败了其它行业出身的人群。

但程序员转型做量化交易,也会有缺乏的知识点。

一是真实市场经验的部分,

这一部分是需要时间体验来获得的,别无他法,真实的市场,并不会按照你研究并设计的程序模型线性运行,极度无序,又看似有序。且不可描述。

人性的部分,也是最难的部分,部分知识上升到哲学层面。这一点上是所有普通与伟大交易员开始拉开距离的地方,

三是扎实的金融市场基础知识。

不要跳过任何一个基础的知识,因为你会在以后的过程中,因为跳过这些基础部分而花费巨大的代价。

量化交易的学习过程,绝对不是什么整天去研究什么新颖的策略类型,或者动辄几千上万行的代码写成的复杂逻辑架构。

而且需要在你学习的初期,将大量的时间用在我上面描述的三个部分上,

在这个完成了我说的三个知识部分的历练与学习之后,

最重要的就是开眼界了,我是推荐所有从事量化交易行业的朋友,应该走出去看一看,比如一些国内外知名量化机构或是一些职业交易员(量化交易员最好),多结交一些同个量化交易圈子的朋友,比如一些量化机构的基金经理、数据科学家、算法工程师等等。多与他们探讨一下,各个学术流派的做法。久而久之,在实战有效性上面,你会受益良多。至少会知道自己从事的研究方向,在这个满是顶级智商人群的行业里,是否具备一战的可能性。

如果是打算从程序员转行到金融机构从业,那么可能还是需要一些学历光环背景的,这一行业的人群比较爱面子,尤其是TOP排行前面那几家。但拥有光环的出身只决定了你的起点不低,也就是下限不低。上限的部分是需要你无数个日夜的浸淫,还有天赋与时运决定的。

简单来说量化机构从业就职的可能性,要么看你的学历知识背景是否足够强大,要么看你的历史经验是否足具说服力(比如曾经拥有管理大型资金的实战经历与证明资料)。

如果你拥有一些证书之类的,当然是最好不过的,现在圈里新人就业方向,也是比较看重这个的。但我们那个年代是不看重这个的,

今天这里讨论的是无经验的人群,打算转型从事量化交易或是就业相关量化机构,有什么加分的选项是一定要去学习的,因为机构招揽你,也就意味着打算培养你,是因为你值得被培培养,所以能力范围内,该学的知识一定要去学,该投入的还是要舍得投入,不论是精力还是金钱。

比如一些收费类型的量化交易相关知识培训的机构与课程,这种在我看来是比较具备说服力的,

有一个叫“CQF量化金融分析师证书”,这证书相关的系列课程里面,有一些知识是野生交易员最欠缺的部分,比如《定量风险与回报》,比如《金融数据科学》,以及机器学习方面的应用等等,有机会的话可以去试试。

话说量化交易员这一行当真的是越来越卷了,已经不再是以及动动手指头,看看K线图走势,用程序简单表达并自动化就可以纵横驰骋的年代了。

给大家准备了一些“量化入门的学习资料”,需要的朋友可以自行领取,希望对大家有帮助↓↓↓

扫码领取量化金融学习资料包

来源:转载自:CQF量化金融分析师(id:cqf_study),作者南山宽客,内容已获得作者授权使用,如有疑虑请后台联系处理。

我要回帖

更多关于 量化交易有什么优缺点 的文章

 

随机推荐