一辆高速运动质量很大的卡车就拥有一个很强大的动量,而一个低速运动的自行车的动量反而就不那么大了。换一句话说动量很大的大卡车相比与低速运动的自行车而言,很难停下。而在过去的股票市场中,很多投资者都喜欢采取追涨杀跌的方式购买股票(或是一些其他标的的投资)。但是这一切都只是一种假设,在学术界并没有一个严格的论证(虽然没有论证但是很多投资者已经基于动量因子构建了一些动量策略获得了不菲的利润)。
而直到1993年,Jegadeesh和Titman发表在上的论文首次从经济学的角度探讨了从1965年到1989年的美国股票市场上发生的动量效应。
首先大家来看一下动量因子的定义,大家可以利用计算个股(或其他投资标的)过去N个时间窗口的收益回报, 收益回报的计算公式如下:

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


来计算受盘中最高价和最低价的调整的调整收盘价动量。这样做的逻辑是,在日线的层面上大家收盘价往往可以表示市场主力资本对标的物的价值判断(由于夜间停盘时无法进行市场交易,资本需要将标的物的价值调整到合理的范围规避资本风险),而最高价和最低价往往反应了市场投机者(职业交易者与散户投资)的情绪,同时合理考虑这样的多方情绪可以更好的衡量市场的动量变化。
现在大家来尝试使用Python构建动量因子, 在python计算动量因子只需要一行代码即可实现, 其中timeperiod就是大家的时间位移窗口N:
上面是动量因子最简单的实现方式,那么同样大家可以看一下调整后的价格动量因子如何实现:
上图是大家的绘制了2根k线动量与2根k线调整收盘价动量的分析,可以看出调整价的两日动量明显更加明显。
那么到这里大家的动量因子就已经实现完成了,但是由于股票的价格是一个随经济或标的本身经营情况有变化的变量。那么如果变量有指数增长趋势(exponential growth),比如 GDP,股票价格,期货价格,则一般取对数,使得 lnGDP 变为线性增长趋势(linear growth)。
这里大家还可以将大家的因子转变为:
def barMon(data, timeperiod=2):
return np.log(data['price'] – data['price].shift(timeperiod)
或是调整收盘价因子:
大家看到由于对数值取了对数,所以大家发现动量为负值的时候动量变得不连续了(小于零的值的对数在实数域上大家不考虑)。除此之外上述这样的因子考虑的够全面了么?大家知道不同的交易标的由于价格不一样所以价格浮动的绝对值也大相径庭。
例如,
股票A 的每股价格是2000元,当日涨幅1% ,该股的对应上涨的价格是20元/股
而股票B的每股价格是20 元,当日涨幅达到了涨停板的10%,该股的上涨的对应绝对值2元/股。
那么依照前面的动量计算公式,A股的一日动量值为 20, B股的一日动量值为2每股。
这样的动量显然没有办法很好的衡量投资标的物在市场中的变化量(这里主要是针对依据动量选股策略做出调整,因为需要比较不同标的之间的动量关系)。
所以大家继续修改动量指标的计算方式:
所对应的调整收盘价的动量计算方式就为:
可以看出在对数百分比角度上这两个因子就相差比较小了, 在实际的动量策略中大家常常是使用这样的经过对数调整的因子。那么到这里大家动量因子的构建方式就完成啦!