动量因子 动量因子构建

在经典物理学上有一个描述表示物体质量和速度的乘积的物理量,物理学家们将其命名为动量,通俗来讲这个物理量描述的是运动物体的影响效果。

一辆高速运动质量很大的卡车就拥有一个很强大的动量,而一个低速运动的自行车的动量反而就不那么大了。换一句话说动量很大的大卡车相比与低速运动的自行车而言,很难停下。而在过去的股票市场中,很多投资者都喜欢采取追涨杀跌的方式购买股票(或是一些其他标的的投资)。然而这一切都只是一种假设,在学术界并没有一个严格的论证(虽然没有论证然而很多投资者已经基于动量因子构建了一些动量策略获得了不菲的利润)。

而直到1993年,Jegadeesh和Titman发表在上的论文首次从经济学的角度探讨了从1965年到1989年的美国股票市场上发生的动量效应。

我们来看一下动量因子的定义,我们可以利用计算个股(或其他投资标的)过去N个时刻窗口的收益回报,收益回报的计算公式如下:

那么这个return就可以被称为价格的动量,这里我们使用了收盘价作为计算动量的标注,在实际的因子开发和挖掘中我们还会使用不同的计算技巧,例如

来计算受盘中最高价和最低价的调整的调整收盘价动量。这样做的逻辑是,在日线的层面上我们收盘价往往可以表示市场主力资本对标的物的价格判断(由于夜间停盘时无法进行市场交易,资本需要将标的物的价格调整到合理的范围规避资本风险),而最高价和最低价往往反应了市场投机者(职业交易者与散户投资)的心情,同时合理考虑这样的多方心情可以更好的衡量市场的动量变化。

现在我们来尝试使用Python构建动量因子,在python计算动量因子只需要一行代码即可实现,其中timeperiod就是我们的时刻位移窗口N:

上面是动量因子最简单的实现方式,那么同样我们可以看一下调整后的价格动量因子怎样实现:

上图是我们的绘制了2根k线动量与2根k线调整收盘价动量的分析,可以看出调整价的两日动量明显更加明显。

那么到这里我们的动量因子就已经实现完成了,然而由于股票的价格一个随经济或标的本身经营情况有变化的变量。那么如果变量有指数增长动向(exponentialgrowth),比如GDP,股票价格,期货价格,则一般取对数,使得lnGDP变为线性增长动向(lineargrowth)。

这里我们还可以将我们的因子转变为:

defbarMon(data,timeperiod=2):

returnnp.log(data[‘price’]-data[‘price].shift(timeperiod)

或是调整收盘价因子:

我们看到由于对数值取了对数,因此我们发现动量为负值的时候动量变得不连续了(小于零的值的对数在实数域上我们不考虑)。除此之外上述这样的因子考虑的够全面了么?我们知道不同的交易标的由于价格不一样因此价格浮动的完全值也大相径庭。

例如,

股票A的每股价格是2000元,当日涨幅1%,该股的对应上涨的价格是20元/股

而股票B的每股价格是20元,当日涨幅达到了涨停板的10%,该股的上涨的对应完全值2元/股。

那么依照前面的动量计算公式,A股的一日动量值为20,B股的一日动量值为2每股。

这样的动量显然没有办法很好的衡量投资标的物在市场中的变化量(这里主要是针对依据动量选股策略做出调整,由于需要比较不同标的之间的动量关系)。

因此我们继续修改动量指标的计算方式:

所对应的调整收盘价的动量计算方式就为:

可以看出在对数百分比角度上这两个因子就相差比较小了,在实际的动量策略中我们常常是使用这样的经过对数调整的因子。那么到这里我们动量因子的构建方式就完成啦!