1
概述
在诸多从期货投资交易的公司中,基本面分析一直处于认知上的重要地位,但想要把对基本面的正确认识转换为对交易的成功执行,则需要很强的交易艺术,这二者之间的鸿沟如同千军万马过独木桥,能跨越的研究员终究是少数。
而量化交易的优势在于明确的交易执行,但在逻辑分析上却无法自圆其说,尤其是多数的量化模型都是对价量数据的一阶、二阶乃至N阶的变换,再怎么变换也依然是对价量数据的交易。就如同用土豆做菜,无论是炒酸辣土豆丝、醋溜土豆丝,还是蒸土豆、焖土豆,即使花样再多,也还是脱离不了土豆的范畴。而随着参与者的增加,类似策略的收益会显著下降。
在上述两种局面陷入僵局的情况下,基本面量化策略可以给期货行业打开新的大门,基于基本面的策略逻辑性强,而量化工具的加入又可以提供精准的买卖点支持。而基本面数据千千万,基于这些数据产生的高维数据更是不可胜数,这也让量化交易能够脱离简单的价量数据束缚,寻找到更有价值的策略蓝海。
基于上述目的,再加上本人IT和甲醇基本面研究的背景,我这两年开发出了多种基本面量化交易策略,也有一些心得体会,在此选择性地向大家做个汇报。
值得指出的是,我使用的基本面的数据有的来自于资讯机构,有的来自于研究员提供,但这些不同来源的数据已被集成在天风期货研究所自己使用的风云研究平台上,从而可以极大地方便我开展量化策略的开发。目前系统已经收集了上万个不同维度的基本面指标和5000万个基本面的数据点,其涵盖的分析维度之丰富远超想象。
下面我将以甲醇的库存数据为例,详细介绍基本面量化策略的开发过程。该策略定型于一年前,参数从未调整过,但即使如此,该策略在近一年(即样本外)依然取得了较好的成果,凸显出了基本面的力量。而更复杂的策略可以该策略为蓝本进行叠加开发。
2
基本面逻辑的设计
搞基本面量化有两种思路,一种是把基本面的思路清晰化、逻辑化、数量化,然后写成代码,塞入量化环境进行参数调优,从而获得基本面量化模型。
另一种思路是编写无监督学习模型,直接喂给系统成千上万个基本面的数据点,让系统自己去找规律,这其中可能会发现一些不为人知的机会,但黑箱式的机会却意味着很难从逻辑上去进行解释(或只能强行解释)。
对于研究员来讲,从前一种思路入手是比较可靠的思路。
下面我们先来看一下甲醇库存与价格的关系。如下图,左轴为库存,右轴为价格,从标出的浅蓝色线框上,可以明显看出,去库价格上行,累库价格下行。这在视觉上存在直观的对照关系,而逻辑上也存在较强的可行性。
因此我们可以编写出如下最简单的代码(即伪代码):
伪代码是一种代码逻辑,不能直接运行,但是能够帮助代码初学者理清思路。如果公司有IT开发团队,研究员可以利用伪代码与编程人员更好地进行交流。
了解了伪代码,我们返回头来看这个逻辑中的问题。从上面价格库存对比图上可以看出,市场多数时间的库存其实变化并不明显,可能只是两三万吨的扰动,这种扰动可能会导致市场产生错误的交易信号,而库存数据的小反弹和小回撤也可能会给出错误的信号。因此有必要对上述伪码进行修正,比如库存单期增加3万吨(这里的3万吨就可以是动态参数,可通过后期参数自动调优)或者连续两周增加才发出交易信号:
我们继续观察库存与价格,可以发现在下图的蓝圈处,低库存的情况下去做空经常容易被打脸,即使后续走势能够与库存带来的驱动一致,但这期间要承担的浮亏也是难以忍受。所以我们可以做一些信号过滤,或者是头寸管理,比如默认开单是50手,但低库存的空单只允许开5手。高库存的多单,也只允许开5手。这里的高和低,可以认为设置,也可以由计算机自行优化。而开多少手,也可以设置为参数,让系统自己去优化。当然了,头寸管理可以配置地更细一些。
新编写的伪码如下:
在此,一个带头寸管理的粗略基本面量化策略的原型就基本编写完成了。下面我们进入实战环节。
3
量化平台的选择
进入实战领域,首先面临的是量化平台的选择。当前市场上有诸多量化回测平台,比较方便入门的有开拓者、文华财经WH8,追求效率的有OpenQuant,基于python且代码简洁的有VNPY、quicklib,支持在线策略开发的有聚宽、点宽,甚至还有Matlab和Wind自带的量化工具万矿。
这些平台各有所长,没有绝对的NO.1。由于我们需要用自己的基本面数据做回测,这部分数据在Wind里也未见的全,再加上python代码编写的便利性,因此我们选择VNPY作为本文的回测平台。
VNPY的安装过程我们略过不提,大家可以参考github网站上的安装指南。目前系统版本已更新到2.0,但我个人使用VNPY较早,对应的版本号为1.5。1.5与2.0的版本差异较大,后文附上的代码不能直接使用,需要大家自己动手修改,或者也可以从github上下载1.5的版本。
4
编写量化策略的核心部分
选择好了平台之后,就需要按照平台的要求准备各类文档。
对于VNPY平台,需要准备的有如下文档:
1.基本面数据获取方法(类或文件)
2.获取到的基本面数据
3.交易标的(这里指期货合约)价量数据获取方法(类或文件)
4.获取到的交易标的价量数据
5.策略文件
1. 基本面数据获取方法
我们基本面的数据来自于自己的风云系统,需要编写指定的数据获取方法,告诉风云系统我需要哪个指标、什么维度、什么频率、开始时间、结束时间之类的信息,然后由风云系统给我返回数据。
这个方法一般会定义成【类】或者是【函数】,函数的意思跟我们数学中的函数有些像,比如A=F(x),其中F就是函数,x就是参数,A就是返回的结果。至于这个F是对x进行了方,还是开方,还是怎么样的数学变化,则是【函数】里面的内容了。
我们想要实现的目标是,甲醇库存数据表=F(甲醇港口库存,日度,2011-1-1,至今)。但如果我们想拿开工数据做回测,则甲醇开工数据表=F(甲醇全国开工率,日度,2011-1-1,至今)。这样通过定义函数,就避免了把整个方法重写一次。
该【函数】的写法因人而异,取决于我们基本面数据存在什么地方。比如说存在excel里面,那该方法就是去读excel,筛选对应的行和列,重组生成想要的数据。
我们的数据存储在风云系统中,是通过接口访问数据,所以文档中主要写的就是构造符合要求的接口请求,并把返回来的数据重组成想要的数据。部分代码如下。
2.获取到的基本面数据
获取到的基本面数据要存储在系统内,后续回测时用的到。
首先这类数据都是时间序列数据,其次这些数据可能跟盘面高开低收的数据一起作为策略的输入参与计算。为了便于后续的开发,因此建议将所有的数据都保存在类似如下表中:
其中基本面数据的开、高、低等属性可以为空。
|
时间
|
开
|
高
|
低
|
收
|
量
|
仓
|
MA01
|
2019-06-12
|
2010
|
2050
|
2000
|
2015
|
Xxxx
|
Xxxx
|
MA01
|
2019-06-13
|
2015
|
2045
|
2005
|
2010
|
Xxx
|
Xxxx
|
……
|
|
|
|
|
|
|
|
甲醇港口库存
|
2019-07-31
|
|
|
|
54.75
|
|
|
3.交易标的价量数据获取方法
交易标的的价量数据跟基本面数据类似,也是一个【函数】,但这个函数跟基本面数据函数可能是不是同一个,原因在于交易标的的价量数据可以包含盘口等信息,如果跟基本面数据用同一个函数可能显得比较臃肿,后期代码不便于调整,毕竟写代码强调高内聚低耦合的特征。
获取数据需要注意避免重复获取同一数据,否则会导致系统内出现重复的日期或重复数据,甚至是冲突的数据,从而使策略回测的可靠性大幅下降。
但也要注意的是,我们常常从Wind获取期货交易数据,但下午4:00前获取的数据有时会缺少最高价、最低价等信息,这就提示我们在数据获取方法中,要注意屏蔽有空值的数据,或者是用新的数据替换掉旧的冲突数据等。
4.交易标的价量数据
交易标的的价量数据获取到后也要存储在一张实体表中,方便回测使用。交易标的表中最好加入盘口信息,但如果不需要回测高频交易,也可以不加。
5.策略文件
策略文件的编写就是把我们之前的伪代码转换为系统能够运行的代码,是整个回测体系中的核心。VNPY提供了多个量化回测的策略模板,我们利用模板进行修改后,就可以生成自己的量化策略。本文最后给大家提供的也是这份策略文件。
模板本身的结构可以给大家简要介绍下
i. Class XXX #定义策略名
i. Init #初始化
i. onStart #启动策略时执行的操作
ii. onStop #停止策略时执行的操作
iii. tick #跳价变化时执行的操作(本文不考虑)
iv. Bar #K变化时执行的操作(划重点!)
v. Order #发送委托的操作
vi. Trade #成交回报的操作
其中最重要的就是Onbar操作,部分核心代码截图如下
5
策略的回测与调优
策略编写完成后,就可以塞入回测引擎,生成回测报告了。我们还可以根据回测报告的表现,让VNPY帮忙完成参数调优的过程。
下图是策略跑完的回测报告。
下图是跑完的账户权益,值得注意的是,2018年1月中旬权益发生断崖式下跌,其实因为01合约换月所致。所以后续的曲线其实应该整体向上平移。能够注意到这一点,就可以走入更深的交易细节了,譬如合约换月怎么办,合约活跃量怎么评价,划点怎么计算等。但整体来看,在考虑了手续费和滑点之后,甲醇的基本面策略还是取得了比较优秀的成果。
盈亏频数分析中,最大的那笔亏损其实也是合约换月所致。
各位读者可能看图片不太直观,也可以通过访问下面的链接得到更好的体验。下文中的策略数据也是会日度自动更新的。
策略链接地址:
http://robinjia.top/hangqing/kucunStrategyma01.html
6
总结与思考
经过了上文的量化之旅,相信各位对怎么开展基本面量化也有了初步的认识,回顾过去的量化经历,我有如下想法与诸君共勉:
1.基本面的量化是研究价值最大化的利器,是给研究员插上了量化的翅膀,是商品交易领域的蓝海
2.基本面的量化就跟生活一样,从来没有容易二字,如果没有亲自写过策略代码,那就不可能是一个好的Quants(宽客)。
3.基本面量化,重点不在于选参数进实盘,而在于把基本面的正确认知用代码实现,所以不应该迷信参数,要迷信的是正确的逻辑。
最后,给大家分享下文章开篇答应过的核心代码。
本文首发于微信公众号:扑克投资家。文章内容属作者个人观点,不代表和讯网立场。投资者据此操作,风险请自担。
【免责声明】本文仅代表作者本人观点,与和讯网无关。和讯网站对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。请读者仅作参考,并请自行承担全部责任。
最新评论