最近在学习Axioma的优化器的用法,主要是gui与它的Python API。Axioma的Python API真的还挺复杂的,使用Axioma的API来进行回测和优化,一方面这个轮子同事已经造好了,另一方面我有自己的框架,感觉再用这套就比较麻烦。但是Axioma优化器的设计的思路却是值得学习。目前国内也有一些量化平台在提供了一些优化器的API,感觉是不得要领,显得简单了一些。
在专栏之前的文章,已经介绍了通过Python来进行多因子投研的一些内容,组合优化也介绍了一部分。本人最近一段时间也在研究商业优化器的开发,所以本文将主要讨论组合优化的设计。
我一个人做其实挺难的,后端算法,数据,模型我都能搞定,但是前端这块却是一个问题,不是说会不会写,而是如何设计让自己(用户)用的舒服,用的满意,并在这个基础上进行研发就比较难,怪不得产品和开发经常争论,互相不顺眼。在这个问题的研究上,我好像把前端,后端,产品,算法,数据的活都要包揽,在家的工作量可不小。
下面我会结合模型,具体来讲如何来做优化器的设计。
同其他量化模型一样,数据也是优化器的基础,无论是目标函数还是约束都需要数据来进行支撑。下面简单罗列了一些需要的数据:
- Universe:全局股票池,记录股票的基本信息,例如代码,中文简称,停复牌信息等等
- Local Universe:投资股票池,也是优化所使用的股票池
- Price:股票价格
- Date:优化的日期
- Benchmark:基准的成分股权重信息
- Industry:股票的行业属性
- Risk Model:风险模型数据
- Group:优化所需要的各类因子数据
一个优化策略大概是由三部分构成:
- 基本设置,比如优化日期,基准,使用的风险模型,初始资金,初始权重等等
- 目标函数,一般来说是一些项的线性加总,需要定义各项的权重,例如我最大化组合的二次效用,那么这实际上是两个部分相加而成:预期收益和预期风险
- 约束:各种约束类型,例如行业中性,跟踪误差等等
在优化成功后,我们当然不是简单的就把优化的结果做成交易单发给交易员来做,我们还需要对优化后的持仓进行分析,看看是不是符合我们的需求,这里我想了几点可能基本要做的:
- 与基准的行业偏离,风格偏离
- 与初始权重的比较
- 激活的约束包含哪些
- 组合持仓本身的一些归因分析
这个问题纠结了很久,开始想全部都用网页的形式来着,但是网页相对Excel来说在模型的数据层面的展示不是很好,而且网页不用IFRAME体验不是很好,但IFRAME据说有很多缺点,只能放弃。而Excel可以敲公式,还可以使用万得插件,拉金融数据很方便,添加新的数据也很方便。但Excel调用Python不方便,即对运行策略进行优化这个环节体验不是很好。总之,这两者各有各的利弊,所以我会结合两者一起来用。而对于商用的优化器,实际上会有GUI来实现两者的统一,这块能力不够,本人只能折衷了。
数据层面的展示如下:
我将不同的数据做在了不同的Sheet当中,这样查看还是比较方便的,如果添加新的数据,可以通过增加Sheet的方式来添加。
生成了这个文件之后,如果需要重新优化,可以直接加载这个Excel来获取数据,有点像我们通过Excel来存储一个WorkSpace。
整个开发的项目的框架如下:
大概分为三个部分:
Constraint即定义了一些常见的约束:
在之前的文章中,介绍过线性约束与二次约束。通过继承的方法,我们可以不断拓展具体的约束类型,例如我们还可以控制组合在一些主题上的暴露,或者控制组合在板块上的约束等等。
这种方法,对于我们写代码的来说比较方便,但对于不会写代码的来说不方便,这块后面还是需要进行迭代。对于不会写代码的用户,他要么GUI上点点点,要么提供一个配置文件的模板,他来在配置文件形式上修改。
我们的数据存储通过DataClass来完成,即在我们优化之前,DataClass会调用一系列的方法来完成数据的抓取,并提供给优化程序。主要数据如图中所示,也可以通过继承的方法来对数据进行扩展。
核心对象为Optimizer,它通过add_constraint方法来添加约束,add_object方法来设置目标函数,solver函数进行求解,status来记录优化状态,等等。
这样,我们通过抽象,将组合优化拆解成了数据,约束,优化三个部分。
如前文所说,app.py主要给来做优化器网页的前端展示,以及整个优化服务的部署。这块比较麻烦,真的是产品+前端+后端三个活都要干了,精力实在有限,还没有做完。
另外还有一个部分是对优化后的组合进行分析,这块还没来的及做,后面也还需要花点时间来研究。
- 本文真的是详细的写了自己优化器的设计的一些思路,供感兴趣的读者参考。后面在开发完成后,也会把网页前端的一些设计起贴出来。当然,后面可能主要精力还是会放在研究上了。结合前面介绍的一些多因子模型的模块,整个Python与量化多因子的投研体系其实已经很完善了。
- 一个人真的很奇怪,有时候完全不想写代码,有时候却也蛮有成就感的,不过其实也然并卵,坚持真的全靠热爱。
- 坚持也不容易,觉得有帮助给作者我打赏呀。