策略"/>
【Python】使用tushare完成配对交易策略
tushare ID:495023
分析对象:茅台&五粮液,获取上述股票2020/1/1到2021/12/31的股票数据,
1.可视化价差spread、z-score
2.产生并可视化交易信号:上升交易信号、下降交易信号
3.计算策略的累计效益,可视化为折线图
代码如下:
1,端口准备
#端口准备
import tushare as ts
pro=ts.pro_api()
import pandas as pd
%matplotlib inline
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import numpy as np
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
2,使用tushare获取数据,注意:为方便做图要将交易日期设置为index并将index转化为datetime格式
#茅台日线数据
df = pro.daily(ts_code='600519.SH', start_date='20200101', end_date='20211231')
df = df.sort_values(by = 'trade_date')
df['trade_date'] = pd.to_datetime(df['trade_date'])
df.set_index("trade_date", inplace=True)#五粮液日线数据
df2 = pro.daily(ts_code='000858.SZ', start_date='20200101', end_date='20211231')
df2 = df2.sort_values(by = 'trade_date')
df2['trade_date'] = pd.to_datetime(df2['trade_date'])
df2.set_index("trade_date", inplace=True)
3,
#收盘价折线图对比
ax1=df.plot(y='close',label='茅台',figsize=(10,5)) # 茅台收盘价折线
df2.plot(ax=ax1,y='close',label='五粮液') # 五粮液收盘价折线
plt.title('收盘价对比')
plt.xlabel('日期')
plt.ylabel('收盘价')
plt.grid(True)
4,
#价差及其均值
df['spread']=df['close']-df2['close']
df['spread'].plot(figsize=(10,5))
plt.title('茅台与五粮液价差')
plt.xlabel('日期')
plt.ylabel('价差')
plt.axhline(df['spread'].mean())
plt.grid(True)
5,z-score 是对时间序列偏离其均值程度的衡量,表示时间序列偏离了其均值多少倍的标 准差。一个序列在时间 t 的 z-score,是它在时间 t 的值,减去序列的均值,再除以序列的 标准差后得到的值。
#对价差进行标准化
df['zscore']=(df['spread']-np.mean(df['spread']))/np.std(df['spread'])
df['zscore'].plot(figsize=(10,5))
plt.title('茅台与五粮液价差Z值')
plt.xlabel('日期')
plt.ylabel('Z值')
plt.grid(True)
6,
#茅台交易信号
df['position1'] = np.where(df['zscore']>1,-1,np.nan) #大于1,做多
df['position1'] = np.where(df['zscore']<-1,1,df['position1']) #小于-1,做空
df['position1'] = np.where(abs(df['zscore'])<0.5,0,df['position1']) #在0.5范围区间,平仓
df['position1'] = df['position1'].ffill().fillna(0)
df['position1'].plot(ylim=[-1.1,1.1],title='茅台买卖信号',xlabel='日期',figsize=(10,5))
#五粮液交易信号
df['position2'] = -np.sign(df['position1']) #与茅台相反操作
df['position2'].plot(ylim=[-1.1,1.1],title='五粮液买卖信号',xlabel='日期',figsize=(10,5))
7,
#策略的累计收益率
df['茅台']=(np.log(df['close']/df['close'].shift(1))).fillna(0)
df['五粮液']=(np.log(df2['close']/df2['close'].shift(1))).fillna(0)
df['配对策略']=0.5*(df['position1'].shift(1)*df['茅台'])+0.5*(df['position2'].shift(1)*df['五粮液'])
df[['茅台','五粮液','配对策略']].dropna().cumsum().apply(np.exp).plot(figsize=(10,5))
plt.title('配对策略累计收益率')
plt.xlabel('日期')
plt.ylabel('累计收益率')
plt.grid(True)
更多推荐
【Python】使用tushare完成配对交易策略
发布评论