import tushare as ts
import pandas as pd
import talib as tb
import numpy as np
import datetime
from dateutil.relativedelta import relativedelta
from time import sleep
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.sans-serif'] = ['SimHei'] # 正常显示中文 黑体
plt.rcParams['axes.unicode_minus'] = False # 显示负号
today = datetime.datetime.today().strftime('%Y%m%d') #获取今天的年月日
last_year = datetime.datetime.today() - relativedelta(months=12) #获取前一年的日期
last_year = last_year.strftime('%Y%m%d') # 转换成STR
ts.set_token('')
pro=ts.pro_api()
df = pro.daily(ts_code = '000157.SZ', start_date = last_year, end_date = today)
df = df.sort_values(by = 'trade_date',ascending = True)
df = df.set_index('trade_date')
# 获取锤子线
df['integer'] = tb.CDLHAMMER(df.open, df.high, df.low, df.close)
# 获取出现锤子线的日期
# 有的话检测十天内股票趋势拟合直线 正切角大于3° 则买入
# 股票趋势拟合直线 小于1 则卖出
labels = []
signal = np.asarray(df['integer'])
for i in range(len(signal)):
if signal[i] == 100:
labels.append(i)
qxj = tb.LINEARREG_ANGLE(np.asarray(df['close']),timeperiod=3) #计算趋势 倾斜角
df['qxl'] = qxj
df['持仓信号'] = np.where(np.logical_and(df['qxl']>3,df['integer'] == 100),1,0)
df['持仓信号'] = np.where(np.logical_and(df['qxl']<-3,df['integer'] == 100),-1,df['持仓信号'])
# 持多单 持到斜率小于等于0平仓
# 持空单 持到斜率大于等于0平仓
num = df[['持仓信号'][0]].tolist()
qxl_n = df[['qxl'][0]].tolist()
xzchxh = [0]*len(num)
for i in range(len(num)):
if num[i] == -1:
for j in range(i,len(num)):
if qxl_n[j] < 0:
xzchxh[j] = -1
else:
break
for i in range(len(num)):
if num[i] == 1:
for j in range(i,len(num)):
if qxl_n[j] > 0:
xzchxh[j] = 1
else:
break
df['修正持仓信息'] = xzchxh
plt.subplot(3,1,1)
plt.title('锤子线配合3日斜率')
plt.gca().axes.get_xaxis().set_visible(False) # 不显示横坐标
df['integer'].plot(figsize = (10,8),marker='o',linestyle='')
plt.legend(loc = 'upper left')
plt.subplot(3,1,2)
df['qxl'].plot(figsize = (10,8))
plt.gca().axes.get_xaxis().set_visible(False) # 不显示横坐标
plt.legend(loc = 'upper left')
plt.subplot(3,1,3)
df['修正持仓信息'].plot(figsize = (10,8),marker='o',linestyle='')
plt.legend(loc = 'upper left')
plt.suptitle('修正持仓信息')
plt.show()
# 计算收益
# 计算股票每日收益率
# 计算变化率:(后一个值-前一个值)/前一个值
# 累乘是通过变化率来得到存量,比如有每天的数据变动趋势,通过累乘来得到当前的数据;
df['pct_change'] = df['close'].pct_change()
# 计算策略每日收益率
df['strategy_return'] = df['pct_change']*df['修正持仓信息']
# 计算股票累计收益率
df['return'] = (df['pct_change'] + 1).cumprod()
# 计算策略累计收益率
df['strategy_cum_return'] = (df['strategy_return'] + 1).cumprod()
df[['return','strategy_cum_return']].plot(figsize = (10,8))
plt.title('锤子线加倾斜角收益图')
plt.legend(loc = 'upper left')
# 将沪深300股票池里的股票最终收益率保存为一个CSV
plt.savefig('锤子线加倾斜角收益图.png')
plt.show()