在股市,总能发现这样的情况,当股价上涨一段时间后,股价继续上涨的可能性要高于回落的可能性,一只比其它股票上涨得快的股票可能会继续比其他股票上涨得快,这就是动量效应,也就是股民(投资者,投机者)中所谓的“强者恒强,弱者恒弱”。
动量策略(Momentum Strategies)的基本思想是按照股票前一段时间的回报,将它们从高到低进行排名,买入表现最佳的股票(组合和仓位)并持有一段时间,然后在一定时间重复该过程(组合再平衡和头寸再平衡)。
动量投资的精髓在于追涨。但是追涨要系统性的方法,不然一不小心就追在山顶,高处不胜寒。特别是A股,可以这么说,我走过的最长的路就是A股的套路。所以不应该买这种短时间内暴涨暴跌的股, 主要太难把握,例如:
应该要买中长期稳步上升的牛股, 回头去看A股非常多这样的,所以,系统化方法非常重要, 比如:
有很多种方法来进行动量投资:
在《趋势永存》一书中,作者描述了一个基于指数回归的动量投资策略,非常有效,我在该策略的基础上做了简单的优化,使之更适用于A股:
线性回归计算得到的斜率可以用来度量股票动量,而指数回归的斜率是按百分数表示,显示出每日平均涨跌幅的百分比。然后用R2(判定系数: 价格序列与回归线的拟合程度)来衡量价格序列数据是否符合回归直线。然后降序找到排名前30的股票。
文字的表示总是抽象的,转为代码就是:
import numpy as npfrom scipy import statsdef momentum_score(ts): ''' input: 价格序列,按交易日期降序 output: 收益率指数回归的斜率*R2 ''' x = np.arange(len(ts)) log_ts = np.log(ts) slope, intercept, r_value, p_value, std_err = stats.linregress(x, log_ts) annualized_slope = (np.power(np.exp(slope), 90) -1) *100 # 90个交易日 return annualized_slope * (r_value ** 2)
排名方法有了,那按什么规则买入呢? 一个简单有效的方法是根据股票的ATR(Average True Range, 平均真实波幅)来决定。这是一个衡量股票价格波动的一种指标,是一段时间内真实波幅的平均值。python的技术分析库talib已经有ATR的实现,使用代码如下:
import talibdef get_atr(high, low, close): ''' input: 最高价,最低价, 收盘价的序列 output: 20的ATR ''' reutrn talib.ATR(high, low, close, timeperiod=20)
策略流程图
具体的交易规则
排名示例(只为演示,不做建仓建议)
这个策略盈利的三个要点: 头寸再平衡,仓位再平衡以及坚定不移地执行。
传奇交易员理查德.丹尼斯曾说:
我说过很多次,你可以把我的交易法则登在报纸上,但没人会遵守它们。关键是统一性和纪律性。几乎每一个人都可以列出一串法则,而且不比我们的那些法则差多少。但它们不能给别人信心,而唯有对法则充满信心,你才会坚持这些法则,即使遭遇逆境。
《金融怪杰》
《趋势永存》的作者提到对该策略的优化,边际效用并不高,在针对A股做了某些特别变动后,的确没必要优化,但是, 用机器学习方法来优化,边际效用就会大幅提升,这也是我目前正在做的工作。
Note: 本文只是记录下自己看到过,实践过的一些方法,实践中其实做了很多优化,并不作为投资建议,买者自慎。
联系客服