数据来源tushare pro ,利用talib形态识别择时,利用走势斜率止盈或止损

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()

第一张图为观察期内出现锤子线(值为100)的信号,第二张图为3日行情斜率的变化,第三幅图为持仓信号及时间长度
绿线为收盘价走势图,黄线为账户金额

  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhaojieming1990

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值