分享

Backtrader胜率92%策略实盘一:数据复现

 立志德美 2023-05-13 发布于上海

写在实盘前:

你的小手指是我最大的动力。

1,TK策略的要义是根据股市价格涨久必跌,跌就比涨的原则,利用价格的振幅,大久必小,小久必大的理论,在个股下跌且振幅从小到大的拐点买入。

图片

2,实盘中信号的灵敏度是核心,简单高效的策略才能胜任。我们将指标演化成一条或者几条线,突破线就买入,突破卖出线就卖出。

图片

3,楼主想来思去,最后会实现模拟盘的日内高频交易,不敢实盘。

我们今天的任务就是用python实现我们自定义的TK指标。

源码如下:

import scipy as spimport scipy.stats as ssimport akshare as akimport pandas as pdimport numpy as npimport talibimport DToolsimport mplfinance as mpf
days_index = 380code = 'sz002343'data_day = DTools.get_day_akshare(stock_code=code, ndays=days_index,)
data = data_day.loc['2022-8-30':]last_data = data.iloc[-1]

my_color = mpf.make_marketcolors( up='m', # 上涨K线的颜色 down='c', # 下跌K线的颜色 edge='i', wick='i', volume='inherit', # 继承up和down的颜色 inherit=True,)
# 设置图表的背景色my_style = mpf.make_mpf_style( base_mpl_style='seaborn', marketcolors=my_color, rc={'font.family': 'SimHei', 'axes.unicode_minus': 'False'}, y_on_right=False,
)

# 计算macd的数据。计算macd数据可以使用第三方模块talib(常用的金融指标kdj、macd、boll等等都有,这里不展开了),如果在金融数据分析和量化交易上深耕的朋友相信对这些指标的计算原理已经了如指掌,直接通过原始数据计算即可,以macd的计算为例如下:exp12 = data['close'].ewm(span=8, adjust=False).mean()exp26 = data['close'].ewm(span=21, adjust=False).mean()macd = exp12 - exp26signal = macd.ewm(span=5, adjust=False).mean()histogram = (macd - signal)*10

# macd, signal, hist = talib.MACD(data_day['close'], fastperiod=8, slowperiod=21, signalperiod=5)data['macd'] = macddata['signal'] = signaldata['hist'] = histogramdata.fillna(0, inplace=True)data['macdmax'] = 0data['upTK'] = Nonedata['downTK'] = Nonedata['hcTK'] = Nonedata['lcTK'] = None# print(data)data['atrTK'] = Nonedata['upatrTK'] = Nonedata['downatrTK'] = None# 计算 MACD Hist 最大值的位置hist_diff = np.diff(np.sign(data['hist'])) # 计算 hist 的正负变化hist_diff[np.isnan(hist_diff)] = -1hist_change_idx = np.where(hist_diff != 0)[0] # 找到 hist 的正负变化的位置hist_change_idx = np.concatenate( ([0], hist_change_idx, [len(data) - 1])) # 加上首尾位置# 分段计算 MACD Hist 最大值和对应的最高价最大值for i in range(len(hist_change_idx) - 1): start_idx = hist_change_idx[i] end_idx = hist_change_idx[i + 1] if hist_diff[start_idx] > 0: data.iloc[start_idx+1:end_idx+1, data.columns.get_loc( 'macdmax')] = np.max(data.iloc[hist_change_idx[i-2]+1:hist_change_idx[i-1]+1]['hist']) data.iloc[start_idx+1:end_idx+1, data.columns.get_loc( 'upTK')] = np.max(data.iloc[hist_change_idx[i-2]+1:hist_change_idx[i-1]+1]['high']) data.iloc[start_idx+1:end_idx+1, data.columns.get_loc( 'downTK')] = np.min(data.iloc[hist_change_idx[i-2]+1:hist_change_idx[i-1]+1]['low']) data.iloc[start_idx+1:end_idx+1, data.columns.get_loc( 'hcTK')] = np.max(data.iloc[hist_change_idx[i-2]+1:hist_change_idx[i-1]+1]['close']) data.iloc[start_idx+1:end_idx+1, data.columns.get_loc( 'lcTK')] = np.min(data.iloc[hist_change_idx[i-2]+1:hist_change_idx[i-1]+1]['close'])
elif hist_diff[start_idx] < 0: data.iloc[start_idx+1:end_idx+1, data.columns.get_loc( 'macdmax')] = np.max(data.iloc[hist_change_idx[i-3]+1:hist_change_idx[i-2]+1]['hist']) data.iloc[start_idx+1:end_idx+1, data.columns.get_loc( 'upTK')] = np.max(data.iloc[hist_change_idx[i-3]+1:hist_change_idx[i-2]+1]['high']) data.iloc[start_idx+1:end_idx+1, data.columns.get_loc( 'downTK')] = np.min(data.iloc[hist_change_idx[i-3]+1:hist_change_idx[i-2]+1]['low']) data.iloc[start_idx+1:end_idx+1, data.columns.get_loc( 'hcTK')] = np.max(data.iloc[hist_change_idx[i-3]+1:hist_change_idx[i-2]+1]['close']) data.iloc[start_idx+1:end_idx+1, data.columns.get_loc( 'lcTK')] = np.min(data.iloc[hist_change_idx[i-3]+1:hist_change_idx[i-2]+1]['close']) else: hist_max = 0data['upatrTK'] = data['upTK']-data['lcTK']data['downatrTK'] = data['hcTK']-data['downTK']data['atrTK'] = data.loc[:, ['upatrTK', 'downatrTK']].max(axis=1)/2data['limupTK'] = data['open']+data['atrTK']data['limdownTK'] = data['open']-data['atrTK']# 计算mom# python

# 添加macd子图add_plot = [
mpf.make_addplot(data['macdmax'], panel=2,),
mpf.make_addplot(data['upTK'], width=2, secondary_y=False), mpf.make_addplot(data['downTK'], width=2, secondary_y=False), # mpf.make_addplot(data['hcTK'], secondary_y=False), # mpf.make_addplot(data['lcTK'], secondary_y=False), mpf.make_addplot(data['limupTK'], width=0.5, secondary_y=False), mpf.make_addplot(data['limdownTK'], width=0.5, secondary_y=False),


mpf.make_addplot(histogram, type='bar', width=0.5, panel=2, color='r', secondary_y=False),

]

mpf.plot(data, type='candle', ylabel='price', style=my_style, title=code, addplot=add_plot, mav=(21), volume=True, figratio=(21, 10), figscale=5, ylabel_lower='Volume', )

绘图只是查看一下是否符合,可删去。、

看一下结果:

图片

符合预期效果,

下一期将用自定义的数据开始筛选股票,为实盘做好选股部分。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多