写在实盘前: 你的小手指是我最大的动力。 1,TK策略的要义是根据股市价格涨久必跌,跌就比涨的原则,利用价格的振幅,大久必小,小久必大的理论,在个股下跌且振幅从小到大的拐点买入。 2,实盘中信号的灵敏度是核心,简单高效的策略才能胜任。我们将指标演化成一条或者几条线,突破线就买入,突破卖出线就卖出。 3,楼主想来思去,最后会实现模拟盘的日内高频交易,不敢实盘。 我们今天的任务就是用python实现我们自定义的TK指标。 源码如下: import scipy as sp import scipy.stats as ss import akshare as ak import pandas as pd import numpy as np import talib import DTools import mplfinance as mpf
days_index = 380 code = '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 - exp26 signal = 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'] = macd data['signal'] = signal data['hist'] = histogram data.fillna(0, inplace=True) data['macdmax'] = 0 data['upTK'] = None data['downTK'] = None data['hcTK'] = None data['lcTK'] = None # print(data) data['atrTK'] = None data['upatrTK'] = None data['downatrTK'] = None # 计算 MACD Hist 最大值的位置 hist_diff = np.diff(np.sign(data['hist'])) # 计算 hist 的正负变化 hist_diff[np.isnan(hist_diff)] = -1 hist_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 = 0 data['upatrTK'] = data['upTK']-data['lcTK'] data['downatrTK'] = data['hcTK']-data['downTK'] data['atrTK'] = data.loc[:, ['upatrTK', 'downatrTK']].max(axis=1)/2 data['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', )
绘图只是查看一下是否符合,可删去。、 看一下结果: 符合预期效果, 下一期将用自定义的数据开始筛选股票,为实盘做好选股部分。 |
|