目录

一、动量策略描述

1.1 策略思想

1.2 过去收益好的定义

二、动量策略代码实现

1. 数据准备

2. 策略开发思路

3. 策略可视化

4. 策略优化之思路——参数优化和穷举

5. 参数寻优——使用离散Return计算方法


 

一、动量策略描述

1.1 策略思想

   动量效应:由Jegadeesh和Titman(1993)提出,他们认为:股票的收益率有延续原来的运动方向的趋势,即过去一段时间收益率较高的股票,在未来依旧会取得高于平均的收益率。整个解释中最核心的词汇是“延续”,“延续”的左边是过去的历史行情,右边是未来的未知行情,由此分析得出:动量效应是研究过去的历史行情,并预测过去的行情能延续。

       动量效应是否具有可行性?可能很多投资者都认为动量效应是一种非常激进、盲目的投资策略,说白了就是追涨杀跌,其风险程度相当高,一不小心就可能买在顶点,接着就是无尽的站岗模式开启~~~~~但不可否认的是,目前中国A股市场上确实存在着不少长期走牛的个股,比如:索菲亚、贵州茅台等,除此之外,还存在不少短时间内翻倍,甚至三倍的个股。那么在控制好风险的前提下,捕捉这类动量效应明显的个股,貌似也是一个不错的动量策略。其潜在的优势就是盈利空间巨大,劣势是盈利机会较少。

总结:过去收益好的,认为将来收益也会好;

1.2 过去收益好的定义

看过去20天,上限90天,每次增加5天,优化参数,找到收益比率最好的,SR最高

看股价:

  • √有没有创出历史新高
  • √历史新低;
  • √破了均线

类型:Cros- ectional& Time- serles

 

二、动量策略代码实现

%matplotlib inline
import matplotlib.pyplot as plt
plt.style.use('seaborn')
import matplotlib as mpl
mpl.rcParams['font.family'] = 'serif'
import warnings; warnings.simplefilter('ignore')       #忽略警告信息;
import numpy as np
import pandas as pd
import tushare as ts

 

1. 数据准备

data = ts.get_k_data('hs300', start = '2010-01-01', end='2019-04-1')[['date','close']]
data.rename(columns={'close': 'price'}, inplace=True)
data.set_index('date', inplace = True)
data.head()

 

 

2. 策略开发思路

data['returns'] = np.log(data['price'] / data['price'].shift(1))
data['position'] = np.sign(data['returns'])     

data['strategy'] = data['position'].shift(1) * data['returns']  
data.head(20)

strategy是策略收益,position是盈亏情况,returns是股票收益。

 

3. 策略可视化

计算出策略的最终的累计收益:

data[['returns', 'strategy']].cumsum().apply(np.exp).plot(figsize=(10, 6))    

策略的问题和思考? 过于频繁的买卖开仓;

 

4. 策略优化之思路——参数优化和穷举

采用5天平均动量,决定是否开仓、平仓、做空。

data['position_5'] = np.sign(data['returns'].rolling(5).mean())    # 5天平均
data['strategy_5'] = data['position_5'].shift(1) * data['returns']
data[['returns', 'strategy_5']].dropna().cumsum().apply(np.exp).plot(figsize=(10, 6))

 

5. 参数寻优——使用离散Return计算方法

data['returns_dis'] = data['price'] / data['price'].shift(1)-1
                #也可以使用:data['returns_dis'] = data['price'].pct_change()
data['returns_dis_cum'] = (data['returns_dis']+1).cumprod()
data.head()

采用10、20、30、60天平均:

price_plot = ['returns_dis_cum']    #这是用来绘制图形的一个list
for days in [10,20,30,60]:
        #     data['position_%d' % days] = np.sign(data['returns'].rolling(days).mean())
    price_plot.append('sty_cumr_%d' % days)
    data['position_%d' % days] = np.where(data['returns'].rolling(days).mean()>0,1,-1)
    data['strategy_%d' % days] = data['position_%d' % days].shift(1) * data['returns']
    data['sty_cumr_%d' % days] = (data['strategy_%d' % days]+1).cumprod()
data.head()

 

price_plot列表种包括:

data[price_plot].dropna().plot(
    title='HS300 Multi Parameters Momuntum Strategy',
    figsize=(10, 6), style=['--', '--', '--', '--','--'])

 

 

 

 

 

 

 

 

 

更多推荐

量化金融分析AQF(9):动量策略-Momentum Strategy