【Python】使用tushare完成配对交易策略

编程入门 行业动态 更新时间:2024-10-26 22:29:35

【Python】使用tushare完成配对交易<a href=https://www.elefans.com/category/jswz/34/1771442.html style=策略"/>

【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完成配对交易策略

本文发布于:2023-06-16 17:38:23,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/747829.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:策略   Python   tushare

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!