什么是动量效应和动量交易策略?

动量效应是指过去收益较高的资产,在未来一段时间内仍获得较高的收益,过去收益较低的资产在未来仍获得较低的收益。对于动量效应现象的解释,传统金融学认为,动量效应的存在并不是市场无效的证据,并试图从理性风险补偿这一角度对其进行解释;而行为金融学认为动量效应是由投资者的非理性行为和反应不足影响的。虽然两种学说的理论依据有所不同,但都从不同方面解释了动量效应的存在,这为动量效应的研究奠定了理论基础,也为投资者寻找套利机会提供了依据。

1. 引库

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

2. 数据准备 & 回测准备

# tushare 获取沪深300股票数据
data = ts.get_k_data('hs300', start = '2010-01-01', end='2017-06-30')[['date','close']]
data.rename(columns={'close': 'price'}, inplace=True)
data.set_index('date', inplace = True)
data.head()

3. 策略开发思路

# 计算连续收益率
data['returns'] = np.log(data['price'] / data['price'].shift(1))
# np.sign()符号函数支持向量化
data['position'] = np.sign(data['returns'])     

只 使用 前一天的 进行预测(如果前一天收益为正,则预测今天收益也为正)

# 计算Momentum策略收益(注意未来函数问题) 
data['strategy'] = data['position'].shift(1) * data['returns']  

4. 策略可视化

# 计算策略最终累计收益
data[['returns', 'strategy']].cumsum().apply(np.exp).plot(figsize=(10, 6))

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

策略的问题和思考? 由于只是根据前一天进行预测今天的收益, 会出现过于频繁的买卖开仓,所以自然可以想到能否使用过去5天呢(当然不一定是5天),当然时间越长也会使得策略反应比较慢

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

参数寻优——使用离散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()

# 建立一个绘制图形的 list
price_plot = ['returns_dis_cum'] 
# 参数寻优(入门方法)
for days in [10,20,30,60]:
    price_plot.append('sty_cumr_%dd' % days)
    data['position_%dd' % days] = np.where(data['returns'].rolling(days).mean()>0, 1, -1)
    data['strategy_%dd' % days] = data['position_%dd' % days].shift(1) * data['returns']
    data['sty_cumr_%dd' % days] = (data['strategy_%dd' % days] + 1).cumprod()
data[price_plot].dropna().plot(
    title='HS300 Multi Parameters Momuntum Strategy',
    figsize=(10, 6), style=['--', '--', '--', '--','--'])

6. 策略优化思路之—— High Frequency Data用于Momentum策略

hs300_hf = ts.get_k_data('hs300', ktype='5')  # ktype='5' 表示5分钟
hs300_hf.head(10)

hs300_hf.set_index('date',inplace = True)
hs300_hf.index = hs300_hf.index.to_datetime()
hs300_hf.info()          
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 482 entries, 2019-03-28 14:55:00 to 2019-04-12 15:00:00
Data columns (total 8 columns):
open             482 non-null float64
close            482 non-null float64
high             482 non-null float64
low              482 non-null float64
volume           482 non-null float64
amount           482 non-null object
turnoverratio    482 non-null object
code             482 non-null object
dtypes: float64(5), object(3)
memory usage: 33.9+ KB

hs300_hf['returns'] = np.log(hs300_hf['close'] / hs300_hf['close'].shift(1))
hs300_hf['position'] = np.sign(hs300_hf['returns'].rolling(10).mean())   #10个5分钟平均;
hs300_hf['strategy'] = hs300_hf['position'].shift(1) * hs300_hf['returns']

# 画图
hs300_hf[['returns', 'strategy']].dropna().cumsum().apply(np.exp).plot(figsize=(10, 6), style=['--', '--'])

更多推荐

金融量化— 动量策略(Momentum Strategy)