目录
一、动量策略描述
1.1 策略思想
1.2 过去收益好的定义
二、动量策略代码实现
1. 数据准备
2. 策略开发思路
3. 策略可视化
4. 策略优化之思路——参数优化和穷举
5. 参数寻优——使用离散Return计算方法
一、动量策略描述
动量效应:由Jegadeesh和Titman(1993)提出,他们认为:股票的收益率有延续原来的运动方向的趋势,即过去一段时间收益率较高的股票,在未来依旧会取得高于平均的收益率。整个解释中最核心的词汇是“延续”,“延续”的左边是过去的历史行情,右边是未来的未知行情,由此分析得出:动量效应是研究过去的历史行情,并预测过去的行情能延续。
动量效应是否具有可行性?可能很多投资者都认为动量效应是一种非常激进、盲目的投资策略,说白了就是追涨杀跌,其风险程度相当高,一不小心就可能买在顶点,接着就是无尽的站岗模式开启~~~~~但不可否认的是,目前中国A股市场上确实存在着不少长期走牛的个股,比如:索菲亚、贵州茅台等,除此之外,还存在不少短时间内翻倍,甚至三倍的个股。那么在控制好风险的前提下,捕捉这类动量效应明显的个股,貌似也是一个不错的动量策略。其潜在的优势就是盈利空间巨大,劣势是盈利机会较少。
总结:过去收益好的,认为将来收益也会好;
看过去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
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()
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是股票收益。
计算出策略的最终的累计收益:
data[['returns', 'strategy']].cumsum().apply(np.exp).plot(figsize=(10, 6))
策略的问题和思考? 过于频繁的买卖开仓;
采用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))
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=['--', '--', '--', '--','--'])