呐,当你们看到这么搞个大新闻的题目的时候肯定内心的活动是这样的。
我也一直觉得这个现象挺有意思,后来学了machinelearning之后从统计的角度想了想可能是这个原因:
宏观系统本身非常复杂,变量因子多,即使逻辑线以线性关系为主,但因子和因子之间互相还有correlation和dependence使其结构更加复杂,况且还有人这个非理性的参与者randomly影响,掺入了很多有内部结构的噪音。最重要的是因子的权重还是不断动态变化的,即使报告里说的理由都是对的,但是如果并不是当下主要的driver因子,那结论也会是错的。
大家都喜欢说趋势和周期,但到底是个什么没人说得清楚。
这可能也是为什么国内市场的波动大,波动大并非因为市场经常有分歧,反而是因为市场太容易形成趋势,并且这个趋势很容易就被证伪而戛然而止,所以形成的趋势非常脆弱,一旦不能继续维持之后就会反弹式向反方向运动,即强化版的反身性。
好的trader本身就一直在市场里面,即使对长的宏观因子不甚了解,但像A股这样抓住短期市场情绪的driver因子也够收益了。既能做好交易又能动态抓住长远宏观因子从而抓住大趋势的人就简直是凤毛麟角了,一般也都直接去买方当大佬自己赚钱了。
当然,也不是说报告就不用看了,其实看报告是一个不断丰富自己factorpool的过程,但是怎么判断其权重就得从平时对金融系统的观察和思考里面来了。
市场中每时每刻都有不同的声音,大部分时候其实大家说的都有道理,并且都可以在教科书和历史中找到对应,而最大的问题并非是判断谁对谁错,而是判断当下甚至未来给予每个factor的权重是多少,和历史的最大不同也并非是共有的ingredient不同,而是其配比不同,并且这个配比是动态变化的。我觉得这也是一个trader或者投资经理水平高低的决定性因素了。
分析师(特别是买方!)如果想要以后有更广阔的空间不仅需要了解所有影响的因子,更需要掌握每个时段各个因子的权重,想要做好portfolio还是得对因子和市场同时都理解很深刻才行。
这样的话市场的反应速度也会越来越快,以前传统的方式因为结论总是滞后就越来越没有价值,毕竟策略的时效性在金融市场是很重要的。对于个人而言,如果自己没有相应对数据进行处理的能力(这里不单单包括machinelearning),那么相对其他人的edge就会越来越被限制,直到被市场淘汰。
那也许就有人会问,以后是不是金融领域就全部招程序员和datascientist,不需要基金经理了呢?其实也不是,因为金融的核心还是对市场的intuition,处理数据的技术只是作为增加攻击力的武器,如果仅仅单纯依靠武器很容易伤到自己。想舞倚天剑屠龙刀,那也得有张无忌的内功才行对吧~
说实话...我是故意的。
很多时候用中文很难准确表达一个英文的意思,硬翻译过来反而让理解更加困扰,至少不是那么直观。就拿物理来说,本科时候都是翻译过来的中文教材,很多词本来在英文里面是非常易懂的,但翻译成中文之后就完全搞不懂了。金融和统计也一样,我希望尽量保留原汁原味的知识和这个英文单词的语境。
而且英文这个东西的重要性我也不需要再复述,特别是现在竞争压力最大金融和科技行业本身就是发源于英语国家,想要在激烈竞争中不落后与人,从英文学习到一手的信息是很重要的。如果永远都只读别人翻译成中文的东西(还得依仗别人的心情和信达雅的文学程度),无端的增加了自己的学习难度,并且由于获得的信息一直都是滞后的永远都会处于信息上的劣势。
铺垫完背景,接下来就进入正题咯~
(本文分为三部分)
一.金融和统计背景介绍
二.machinelearning各个方法和在trading上的应用
2.1SupervisedLearning:Regressions
2.2Non-ParametricRegression:K-NearestNeighborandLOESS
2.3TreeBasedMethod(RandomForest和ExtremeGradientBoosting)
2.4Classification(LogisticRegression和SupportVectorMachine)
2.5UnsupervisedLearning(PrincipalComponentAnalysis和期权科普)
三.随便结个尾
1.数学
2.数学
3.牢记第一,第二条
大部分时候我们利用统计方法要做的事情就是,利用Xi去预测Y。也就是属于supervised情况(既有X又有Y)。
这里Y一般是涨跌幅或者涨跌的方向,Xi一般就是对Y起影响作用的因子。
最重要的是我们要先弄清楚我们的Xi是什么,我们要预测的Y又是什么。至于Xi是linear还是quadratic,都仅仅是模型处理的细节。
还有另一部分时候,我们想要了解的是Xi与Xi之间的关系,所以用到的就是unsupervised方法(因为这里没有Y)。
我选了几张图介绍当下BigData和金融方面的背景:
具体金融上的大概分类:
金融市场不同sharpratio程度的因子对应的应用方式:
市场上大部分为人们所知的因子都不能成为可以独立运行的策略(也就是图中的notviableasStandAloneSharp,butviableinaportfoliocontextforquants),因为知道的人越多就越不可能成为可以独立运行的策略,但是能加入策略的因子都是有足够大的sharpratio,然后利用machinelearning的方式(也许是unsupervised的主成分分析的方式)组合起来变成一个更strong的策略。
大概有几步,首先需要得到可靠处理好的data(比如直接从交易所拿到的量价数据etc和做数据清洗之类),
第二步从数据中利用machinelearning得到sharprato足够大的的单个因子或者策略Xi,然后把这些因子组合起来形成策略池。
第三步就是给这些选出来的因子分配动态的权重组合成一个portfolio,可以是简单的线性分配weights,也可以是高维甚至多重嵌套(这里更复杂的combine因子可能就不能用简单的线性supervised和unsupervised模型给weights去操作,我猜可能需要其他的方法)。
最后一步就是看这些合成起来的总因子的回测表现,算出来总的sharpratio。
至于给权重的办法,大概的传统办法就是投资组合,MarkowitzMean-VarianceModel和经过改进更为主观也更flexible的Black-Littermanmodel。
还有的就是动态的投资组合方式,具体我也还在努力啃activeportfoliomanagement那本圣经...也许到时候会写写这方面(如果到时我还活着…)。至于machinelearning来进行动态给权重,我也不甚了解…希望有热心的读者可以指导哈!
下面这张图就是不同machinelearning方法处理不同问题的分类:
下图是bigdata应用在金融上的标准化工作流程~
金融想要解决的问题和其对应的machinelearning方法:
我们可以看到右边有很多的统计方法,每一个都得了解背后的机理,所以这真是一个长期的学习过程呢。
接下来在介绍具体的machinelearning方法和应用之前,需要介绍统计领域一个最最重要的概念,那就是bias和variance和trade-off,换句话说也就是overfitting的问题。
我们用统计方法的一般流程是,首先我们将的dataset分成两部分,一部分是trainingsample,是用来确定(train)model的;另一部分是testsample(或者validationsample),是用来看这个model效果的。
在各个统计方法里面,很难找到一个方法是好到完全dominate其他所有的方法,一般都是各有利弊,主要的原因就是因为我们有bias和variance和tradeoff。
直观一点理解的话,variance代表的是第一步选出来的model对于我们用的trainingsample的依赖性。我们自然是希望从trainingsample中选出的模型能很好的fit整个dataset,但比如我们重新做一次实验,将我们的dataset分成新的trainingsample和testsample,如果从trainingsample得到的model是跟第一次得到的model完全不一样,那么就说明这个model并不能很好的描述我们的数据。这个对于trainingsample的选择的依赖性就是variance,我们是希望它越小越好。
对于bias呢,就是我们得到model之后在testsample上面测试这个model的好坏。一般越是复杂的model,在trainingsample上预测的效果越好(因为overfitting),也就是bias越小。但是同时越复杂的model对于trainingsample数据的依赖性就越强,很可能换一个trainingsample就得到完全不一样的model,这样模型会非常不稳定,因为统计上我们是假设所有的数据是从同一个真实的模型f(x)中产生出来的,我们的任务就是从已有的数据中找到最接近这个真实的模型f(x)的模型。
所以我们希望得到bias和variance之间的平衡点,也就是希望bias和variance之和最小(MSE,MeanSquaredError就是用来estimate他们之和的一个指标)。
我们可以看一张bia和variance直观的图:
图中的点是从真实的modelf(x)产生出来的,我们想做的就是用不同flexibility程度的统计方法去fit这些点,看看哪种方法的拟合效果越好。
右图是flexibility(可以看做对于data的依赖性)为横坐标,他们各自的bias和variance之和也就是MSE为纵坐标。红色那条线就是将模型用在testsample得到的testMSE的结果,我们可以看到是一个U型,也正是说明了bias和variance之间是有一个平衡位置使得MSE最小。linearregression模型(黄色的点)的MSE比较大,因为左图中可以明显看到其对这些点的线性回归效果并不好,但是是不是最扭曲的绿线smoothingspline模型就效果最好呢,也不是,我们可以看到红线上绿色的点的MSE大小随着flexibility的程度又翘上去了,反而是蓝色的模型在bias和variance之间取得了平衡。
至于灰线,它是trainingMSE,我们一般不关心,因为trainingset的信息只是用来获得model的,对于衡量model的预测效果不能提供有用的信息。
所以我们可以看到并不是模型越flexible越扭曲越好,而是需要在bias和variance之间进行一个平衡。
下面还有变化了真实的modelf(x)的情况下,同样用这三种model拟合的MSE结果:
上图是f(x)为非线性model的情况。
我们可以看到如果我们的model跟真实的f(x)的形式越match,那么拟合的效果就好越好。
接下来我们看看理论上公式是怎么推导出bias和variance的(这块儿内容可能需要一定统计知识,如果不感兴趣的也可以跳过,但是想要真的理解这两个东西还是得从最本质的公式入手):
从上面的公式里面我们可以看到看到Bias和Variance分别是代表了什么和是怎么算出来的,其实bias和variance都是针对trainingsample取的期望值。
统计从理论上的做法是假设在dataset之下有一个fundamental的真实modelf(x),然后Y是由f(x)加上一个不可消除irreducible的随机量构成,是符合正态分布的一个随机数。然后我们是想要从datasample中找到一个modelf^hat(x)使其尽量靠近真实的那个modelf(x)。
上面写的MSE其实是expectedtestMSE(注意我是用的箭头,不是等号),就是在我们已有的样本基础上得到的我们的modelf^hat(x)和真实modelf(x)之间的平方差的期望值的估计。求期望呢,实际上是对f^hat(x)求期望,因为整个MSE的式子里面唯一的变量就是我们的modelf^hat(x),而f^hat(x)又是从trainingsample得到的,所以我们对f^hat(x)求期望实际上是对trainingsample的信息求期望。
bias呢,就是真实值f(x)和f^hat(x)的expectation之间的差。所以是基于数据求出来的error。如果过拟合了呢,就会使得这里的error会非常小,也就是bias会很小。
variance呢,是我们模型f^hat(x)本身的expectation和它本身之间的差值的期望值,也就是仅仅跟我们的model选取有关,如果过拟合了trainingsample呢,那么我们选取的model就会非常volatile,也就是这里的variance会非常大。
这里的MSE仅仅是针对x0这一个点,真正的MSE其实是应该遍历所有的点,也就是通过无数次随机选取trainingsample得到的distribution,再对这么多trainingsample的distribution求期望得到的值。但在现实中我们不可能做到取无数组trainingset,所以我们只能用sample去estimate整个population的MSE。我们就用testsample中的所有点作为整体MSE的估计值,或者用cross-validation的方式来随机取一定数目的trainingsample和testsample,并且对于这些testsample的testMSE求平均来估计整体的MSE。详细内容可以见《theelementsofstatisticallearning》中的5.5.2和7.3这两节。
并且在实际中因为我们不可能知道产生这些点的真实modelf(x),所以是不可能单独观察bias和variance的,我们能得到的只有他们的和MSE的estimate,也就是那条U型的曲线,从中我们可以找到最低点,也就是bias和variance最平衡的model。
除此了bias和variance的trade-off之外,还有一个trade-off是predictionaccuracy和modelinterpretability。有些复杂的model(比如非参或者deeplearning等等模型)预测起来奇准无比,但是理解起来会不是那么直观,甚至完全不知道内部发生了什么,在应用的时候就会造成困扰,比如别人问你为什么是这个结果的时候我们是说不出个所以然来的,无法令人信服;另一方面,像简单的model比如线性模型就非常好解释是怎么预测的,每一个变量都很直观,但是问题就是很多时候预测效果不好,特别是对非线性的问题。这个也是需要针对实际情况进行取舍。
看到这里是不是已经一脸懵逼了呢~
不要怕!马上就到应用部分了!
每一个方法我都会大概的介绍其数学推导的机理和方向(为了尽量使得每一个方法简洁易懂,所以需要牺牲一定程度的严谨性,希望写的不准确的地方大家见谅),并且加上我自己的理解给出其相应在金融上具体是怎么应用。
首先我们需要知道一些区分统计方法的概念:
一个是parametric和non-parametric,一个是supervised和unsupervised,还有一个是regression和classification,分别是代表了问题的不同的特性或者要求。
parametric和non-parametric的区别是model中有没有参数。
supervised和unsupervised的区别是有没有Y,比如我们只研究Xi之间关系的话就是属于unsupervised。
regression和classification的区别是在有Y的supervised方法下面,Y是定量的(quantitative,比如涨跌幅度)还是定性的(qualitative,比如涨跌方向)。
接下来我们就开始介绍各个不同的统计方法和其应用:
对于supervised方法,我们最重要的就是要弄清楚我们想要predict的是什么,我们有的因子又是什么;也就是分别弄清楚在实际问题里面Y是什么和X是什么。
PenalizedRegressionTechniques:Lasso,Ridge,andElasticNet
对于处理线性的问题,我们可以用ridge还有lasso。
好处是非常易于理解背后的关系,坏处就是对于non-linear的问题fitting效果不好,弱点还有变量Xi数目比较多,或者变量之间有correlation的时候也会效果不好。但是这个是所有regression方法的基础,所以必须掌握。
一般的形式如下:
Xi是变量,是相应变量的系数,是随机的一个不可消除的误差,Y是我们想要预测的目标。
比如一个具体的形式是
这里我们可以看到USEquities和GlobalEquities前面的系数相对其他变量大很多,这就说明了这两个变量对于这个AssetPrice的影响最大,当然USEquities是正面的影响,GlobalEquities是负面的影响。
这里我们就可以发现一个问题,那就是比如像EMgrowth这个变量前面的系数非常小,说明这个因子对于AssetPrice的贡献不大,所以如果依然把这个因子加入model的会就会导致过拟合,因为本来这个因子是不应该在model里面结果我们却放进去了,自然就导致变量更多,model更复杂增加了其对于data的dependence,也就是variance。
当变量比较少的时候我们自然可以手动把这些不需要的因子剔除掉,但是如果变量有成百上千甚至上万的话,人工来选择因子就会非常繁琐,而且还容易造成错误。有没有一种方法可以自动帮我们做这件事情呢?有,就是接下来我们说到的Lasso方法。
然后还有一个方法,就是ridge。唯一不同的地方就在于ridge的penalty函数是系数的平方之和,而不是Lasso里面系数绝对值之和。
但是这里有一个问题,那就是如果有一个因子确实是一个非常强的因子,并且前面系数非常大。如果用Lasso和Ridge的话就会使得其前面的系数减小,那这样的话不是underestimate这个因子的重要性了么?毕竟系数越大的,在这个penalty下面会减小的越多。
对于这个很大系数的主要因子的问题,理论上可以证明出Lasso和Ridge并不会首先将系数大的主要因子系数变为最小,而是首先将不那么重要的因子的系数变小。可以从主观的感觉上面来理解,如果将主要因子的系数降低的话,会造成公式前面那个RSS这一项的值变得很大,这样即使后面penalty会减小,但整体的和不一定会降低,反而可能会升高(毕竟penalty只是一个调节的项,RSS才是想要降低的主体)。但是如果降低的是不那么重要的因子的系数,就会使得前面RSS的值增加不多,但是后面的penalty会降低不少,特别是penalty前面系数a足够大的情况下。所以综合而言,Lasso的作用是把不重要的因子剔除出去(也就是使得其前面的系数变为0)。
Lasso相对于Ridge的优势也正在于可以将主要因子的系数直接降为0,这样也就是一个选因子的model。
关于Lasso和Ridge之间的对比,至于为什么Lasso可以将不重要的因子的系数降为0而Ridge不行,我们可以看下面这个图更加直观:
假设我们只有两个因子X1和X2,他们分别的系数是1和2。然后上面那个椭圆就是前面那个lossfunctionRSS画在1和2的平面上,每一个椭圆代表的是不同的RSS的值,并且椭圆越小的时候RSS越小,也就是我们想要其越小越好。对于Lasso和Ridge,因为前面那一项RSS都是用同一套数据经过同样的leastsquare方法计算出来,所以椭圆的形状对于Lasso和Ridge都是一样的。不一样的仅仅是第二项,也就是阴影的面积。
一方面我们想要这个椭圆越小越好,最好的情况就是直接缩小成中间的点hat。
另一方面,我们又想要阴影部分的面积最小,因为我们所加的penalty一定程度上就代表了阴影的面积。
所以两个方面的平衡下,我们就需要找到这个椭圆和阴影面积的切点,这样可以使得椭圆足够小,这个阴影的面积也足够小。
现在我们知道了切点是我们需要找的点,这个点的坐标是(1,2)。
我们可以看到Lasso的情况是正方形的阴影面积和椭圆相切,由于正方形是有四个突出的顶点,所以这四个顶点更容易和椭圆相切。而这四个顶点的坐标都在X或者Y的坐标轴上,也就是要么1被留下,要么2被留下,其实这就是为什么可以将被去掉的因子的系数变为0(因为切点在坐标轴上)。
而Ridge的情况是,由于阴影面积是一个圆,所以并没有突出的顶点可以更容易跟椭圆相切,故想要正好相切在坐标轴上是非常困难的,需要RSS的形状满足非常极端的条件才行。
所以如果想要选择因子的时候,我们可以利用Lasso的方法来获得足够重要的因子。
从上面这张图我们可以看到Lasso基本上把真实Actual的主要因子都抓住了,并且给予的系数(权重)基本上和真实值一致。而OLS,也就是最基本的leastsquare的方法(仅仅只有Lasso的第一项)会分配权重给全部的因子,这样就造成了overfiting。也可以看到Lasso里面加上的penalty这一项对于筛选重要的因子的还是很有效的。
下面是penalty因子系数的大小(X轴)和得到的每个因子的系数大小(Y轴),
我们可以看到的值从小到大(X轴从右往左看)的时候,右边的Lassomodel会让不同的因子在不同的时期消失。也就是随着的值增大(也就是penalty的程度越来越大),不断有因子的系数被Lasso归0,也就是剩下的因子的重要性越来越大。最后剩下几个影响非常大的因子。
而左边Ridge的只能让这些因子的系数一起变小,最左边值也就是penalty非常大的时候,几乎所有的因子系数都变成非常小,这样显然不是我们想要的结果。
Bayesian和ridge还有lasso的关系:
ridge还有lasso都可以由贝叶斯推导出来,只是需要改变贝叶斯里面prior的distribution的形式,ridge需要在贝叶斯里面把prior改变成laplacian,lasso需要把prior改变成gaussian。
理论上来说,这两种priordistribution的贝叶斯得出的结果应该是和ridge和lasso的结果一致。
这里用贝叶斯导出的原因是贝叶斯不需要复杂的计算公式,仅仅需要的到P(u|data)之后做simulation,可以直接从generate出来的sample里面得到系数beta的均值和方差,而不需要像frequentist那样用公式来求。(具体公式的推导在附图中)
并且贝叶斯的方法当data足够大的时候,prior的distribution其实重要性会越来越小(我自己也胡乱写了传统统计方法frequentist和下面Bayesian的证明)。不过data的size什么才叫做足够大,这是一个问题。
接下来我们介绍一个利用Lasso的例子,
并且我们选取了4个Xi,就是他们各自过去1M,3M,6M还有12M的收益。
这样我们对每一个Y都有4个Xi作为变量。我们想要预测的Y是此种asset第二天的收益。如果是大于0就做多,小于0就做空。
比如我们现在单独看S&P500。
我们利用的dataset是滚动的500个交易日,也就是对于S&P500有500个data值,每个data的值是一个5维空间内的一个点(Y,X1,X2,X3,X4),也就是(S&P500第二天的收益,S&P500当天之前1个月的总收益,过去3个月的总收益,过去6个月的总收益还有过去12个月的总收益)。我们想要做的就是利用一个Lasso模型去fit得到这500个点,使得其对于这500个点fitting的最好,也就是RSS+penalty的和最小。
这样我们就在5维空间内找到了一条线,根据坐标(X1,X2,X3,X4)还有其系数我们就可以预测出Y,也就是在当天(接近)收盘的时候,算出来S&P500当天之前1个月的总收益,过去3个月的总收益,过去6个月的总收益还有过去12个月的总收益,也就是在5维空间里面加入今天这个点,并且因为是rollingwindow,所以将最初始的第一个点(今天之前的第499天)去掉,得到空间中新的500个点,重新获得一个新的Lassomodel,并且根据这个update之后的model去预测第二天的收益。
具体应用中似乎是3个月重新renewal一次model。也就是并不是每天都会加入一个点再去除最旧的一个点,而是在三个月之内用同一套model结合这三个月每天的(X1,X2,X3,X4)去预测第二天的收益。等到了三个月之后,就一次性加入这三个月所有的点,去除掉最旧的相同数目的点,重新进行建模得到一个新的Lassomodel,然后再用这个model结合接下来三个月每天的(X1,X2,X3,X4)来预测第二天的收益,一直rolling下去。
这里需要注意的是(Y,X1,X2,X3,X4)都需要standardize(具体怎么standardize需要弄清楚,后面很多方法都会预先将Xistandardize),因为我们知道跨度不一样其值也会有不同的scale。
但这里是仅仅用了(X1,X2,X3,X4)作为变量,但实际上我们有4个不同的assetY,S&P500,10-yearUST,USdollar(DXY),还有黄金gold,所以可以将这4个Y的(X1,X2,X3,X4)都设置成共用的16个变量(X1,X2,X3,X4,…X16)。然后用这同一套Xi对这四种asset进行regression,每一种asset就都有一个Lassomodel进行预测。
结果譬如下图,
同样我们可以看到其他asset的结果。
对于处理非线性的问题,一个是可以用高阶的linearregression,另一个就是用非参方法KNN之类。
非参方法好处就是如果fundamental的model是非线性,效果会比较好。坏处就是如果model本身是线性的,就容易造成overfit,并且KNN对于outlier的点非常敏感。
这里我们用KNN的方法来择时。(也就是选择历史上类似宏观情况的regime,然后平均一下收益率作为预测值)
具体是这么工作的:
我们有7个类别的indicator,然后用这样一个7-d的vector来表示宏观经济的位置regime(或者说是在7-d空间内的一个点)。
具体怎么构建的这7个indicator可以参照如下slides:
所以这7个indicator就是我们的7个Xi,构成了一个7维空间,并且由于每个月都有这7个indicator的值,所以都可以用这个空间里的一个点表示。
我们想要预测的Y就是20个riskpremia的每一个。
或者可以这么说,每一个月作为一个观察。然后每一个观察包含了这7个Xi和Y(20个riskpremia的每一个)的值。并且我们用Xi的7维空间来区分regime。仅仅是画点上去,而不是像之前的regression一样想要用一条线去fit,这里获取Y的方法是将想要预测点周围的K个点对应的Y取平均值。
我们将过去的10年每个月都可以画在这7-dindicator的空间中,每一个月都可以被这个空间内的一个点所代表其宏观情况。这样当下这个月也可以画在同样一个空间里,找到其最近的K个点。当然K也可以用其他的值,这样就是average一下附近的K个点的每一个riskpremia的return,这样我们可以得到这个点周围附近K个点(也就是历史上类似宏观情况的K个月)这20个riskpremia每一个的平均值,(这个地方距离是standardize之后的距离还是直接用原indicator的scale呢?),这样就找到了历史上最接近现在这个月宏观经济情况的K个月的20个riskpremia每一个的平均值。
根据那个月之后的一个月的20个riskpremia(此时S=20的情况下)的表现情况(如果20个riskpremia是daily的数据,那么就用average来得到一个月每天的平均值,其实也可以直接加起来看每个月的总收益?),并且将其排序,选择其中一部分然后平均分配资金,来决定当下这个月的下个月投在这20个riskpremia上的fundingdistribution。
这里有一个问题就是,因为不能单纯看20个riskpremia的收益大小来选取(不然就全部投给预期收益最高那个riskpremia了)。我猜测可能还需要看组合起来看总体的sharpratio值。所以这样排列下来仅仅只能找到最高收益的那个riskpremia,而不是找到最好的sharpratio。所以需要看这些20个riskpremia的subset的组合情况,得到最好的sharpratio。
但是问题在于,怎么将这些S个riskpremia策略组合在一起得到最好的sharpratio?这个可能就需要看回测的结果了。(但是怎么回测这20个riskpremia所有subset的可能性?)
是不是还涉及到给weight的问题呢?
这里似乎就是直接给予这些不同的riskpremia策略相同的weights,也就是将funding直接均分给不同的策略。但是其实可以用machineleanring来给不同的策略分配不同的weights来改进。
这些细节的问题我也没有一个确定的答案,可能需要问JPM具体做这个策略的人了...
这就是具体的结果。
左边的图的列向量是选择K从0到25,横向量是选择riskpremia的个数。方框中的数值就是sharpratio。从这张图看来,确实是需要对所有的组合进行回测。但这里每一行似乎仅仅区分了riskpremia的个数,而不是每一个单独不一样的riskpremia?(想要弄清楚,可能需要看看JPM的riskpremia是怎么构建的了,应该都是independent,所以并不能单纯以个数来作为loop的条件?)
这里的右图就是单纯给这S个riskpremia(S=20所有都用)平均分配资金,也就是红线。然后就是利用这7个indicator预测的各个riskpremia进行排列组合,选出sharpratio最高的再平均分配资金。
首先介绍treebasedmethod的基础,也就是regressiontree。
给定很多变量Xi,它的原理就是取遍所有Xi和每一个Xi所有的值,找到一个让全局的RSS(ResidualSumofSquares是一个指标,用来描述预测的Y和实际的Y之间的差距的平方和,也就是预测的效果好坏)最小的某一个Xi的某一个值,这里就算是一个internalnode。
这样,Xi的这个值将所有的点分成了两个区域,每一个区域的点所estimate的值就是这整个区域所有点的平均值。
再同样的过程,得到一个让这一步全局RSS最小的Xi的一个值(这里Xi可以跟上一步的Xi是同一个变量)。
同样的过程不断进行下去,一直到某一个条件停止。比如RSS到达某一个值,或者某一个区域的点小于5之后,等等。
记住,这里的RSS是全局的RSS,也就是所有区域的RSS总和,而不仅仅是所分开区域的RSS之和。
同理,这里需要一个penalty函数。因为树越深其实越overfit(可以想象当树深到极致就是每个区内只有一个点),所以给目标函数RSS加上一个additional的alpha*树的深度,使得其总和达到最小。
合适alpha值的选取就需要通过cross-validaiton来得到,同时可以得到的也有tree的深度。这样一个model就选出来了。
regressiontree应用的示意图如下:
regressiontree的好处就是非常容易理解,因为每一个node的Xi取值都一目了然。但是不好的地方就是它对于outliers非常敏感,因为outliers会极大的增加RSS这个指标,所以很容易被影响。
RandomForest:
randomforest的意思就是,在上面的regressiontree的基础上,我们再利用bootstrap来产生数量为B的testdatasets(也就是bagging的model)。对于每一个dataset我们可以利用一个regressiontree去fit。所以对于每一个观察,我们都可以得到B个prediction的值。接着我们就把这些值average一下,就得到了我们最终的estimate。这样的好处就是可以降低variance,因为我们用了很多的sample一起求出的平均值,而不是像decision/regression/classificationtree那样一次性的estimate。
然后randomforest又加了另外一项,也就是限制每一个node可以选取的Xi的数目。比如一共有p个Xi,但是我们可以规定每个node只能randomly选取sqrt(p)的Xi。这样的好处就是为了防止一个factordominates,不然就会导致这B个tree的correlation非常大,即使求平均值也起不到降低variance的作用。
具体我们可以看如下的例子:
我们利用randomforest的model来预测。
首先我们利用bootstrap构造100个testdatasets,然后针对每一个dataset去fit一个regressiontree。并且每一个tree的每个node处,一般每次只能randomly选择sqrt(14)=3factors。但是这里我们用OOB这个方式来判断每个node处可以选择Xi的个数(得到的是14个全部可以用),并且每个tree的深度也是由OOB这个最小值来确定。
接着我们对于每一个股票都有100个prediction的值,然后average,得到我们最终的estimate。
这里的一个问题也是同样,我们是不是需要将股票的收益向右位移一个单位,使得这14个riskfactorsXi所对应的Y是下一个月的收益。毕竟如果放在同一个月,那就不存在预测的问题了,因为都是同时发生,而不是用一个去预测接下来即将发生的另一个。
另一张图就是策略的回测结果,通过对于这1400个股票的预测值进行排序,我们就可以得到每一个quantile(一共分为5个quantiles)的股票basket。
ExtremeGradientBoosting
boosting的原理就是慢慢学习,也就是先给一个不太准确的estimate,然后用真实值减去这个estimate得到residual/error,接着用regressiontree去fit这个剩余的residualerror得到这个residual的estimate,再用上一层residual减去这个estimate得到下一层的residual,然后进行K次(即一共用K个tree去fitK层的residual),实质上是从一层一层的residual里面不断缓慢提取信息不断加到之前的estimate上面,使得最终得到一个总的好fitting。boosting指的是一类方法,而不是一个方法。ExtremeGradientboosting是boosting中一个的方法。
首先我们有8个Xi,也就是8个宏观的factor,
Oil,Gold,Dollar,Bonds;economicsurpriseindex(CESIUSD),10Y-2Yspread,IGcredit(CDXHG)andHYcreditspreads(CDXHY)
然后我们要做的事情就是,用这8个Xi,还有extremegradientboosting的model去预测每一个Yi的表现。
这里extremegradientboostingmodel里面的参数是,5-fold-cross-validation来确定tree的数目为30,也就是经过30次的从residual里面extractinginformation。并且每个regressiontree的深度为7,也就是每个tree被分为了7+1=8个区域。
有了这个extremegradientboostingmodel不断的iterate(30遍,每一遍的tree的深度是7)来不断extract信息给想要估计的那个estimate函数f^hat之后,f^hat确定了下来。在同样给定了这个想要预测的observation的8个Xi的值(也就是这个8维空间内的一个点)之后,就可以经过这个model得到我们想要的预测值Yi。
这里应该是用的每天的涨跌幅(里面有说rebalancedailyatmarketclose)。因为对于同一个Yi来说,比如我们预测energy这个sectorETF的涨跌幅。我们每一天都有这8个macro的factor的一个值,这样一天在这个8维空间上来说就是一个点,252天的话就是有252个点。这样才能开始利用boostingtree来划分区域进行预测。甚至都不一定是daily的数据,可以是更小级别的数据,这样点(信息)也就更多了,model的预测也更加贴近真实的model。然后利用这252个点来建立model,建立之后预测energyETF的涨跌幅。
有一个问题就是,同样我们这里可能需要将energyETF的向右位移一个单位,也就是将第二天的energyETF作为这一天的Yi,这样8个Xi预测出来的结果也是第二天的energyETF的涨跌幅。(但这里还有一个问题就是为什么是位移一个单位,也许这些macrofactor传导给ETF是有不同时滞的,所以每个Xi甚至都需要不同的位移)
然后根据long-short策略,每天我们可以预测出这9个ETF的涨跌幅度,将其排序,做多前三个,做空后三个,形成了一个策略。
除此之外,我感觉还可以用另一种方法。那就不用位移,直接将当天的ETF涨跌幅看做是Yi。这里的一个assumption就是市场是有效的,macrofactor的变化可以马上传导给ETF的价格。这样的话我们就可以通过预测的值,看如果当天实际并没有达到这个涨跌幅(在快收盘的时候检查condition),我们可以进去统计套利,也就是赌其一定会往那个涨跌幅移动。
也可以将其量化变成相差多少个sigma(假设围绕预测值是一个normaldistribution,其mean就是预测的值,width可以取历史上面的error是不是都一样,如果是近似flat可以直接用这个constant作为error,如果不是的话可以继续分析其error的结构),大于两个sigma的时候进去开仓bet会继续往预测的方向走,不一定是同方向,如果涨跌幅走过了2个sigma那就是bet其一定会reversion(后续部分请参考下条)