def addTechnicalIndicators(simple_data): stock = sts.StockDataFrame(simple_data) stock['cr'] stock['kdjk'] stock['kdjd'] stock['kdjj'] stock['close_10_sma'] stock['macd'] stock['boll'] stock['rsi_6'] stock['rsi_12'] stock['wr_6'] stock['wr_10'] stock['cci'] stock['cci_20'] stock['tr'] stock['atr'] stock['dma'] stock['adxr'] stock['close_12_ema'] stock['trix'] stock['trix_9_sma'] stock['vr'] stock['vr_6_sma'] new_dataframe = pd.DataFrame(stock).loc[:, COLUMNS] transformed_dataframe = new_dataframe.iloc[ 10:len(new_dataframe) - SHIFT_NUMBER] # Bỏ các hàng khuyết dữ liệu scaler = StandardScaler() scaler.fit(transformed_dataframe) return pd.DataFrame(scaler.transform(transformed_dataframe), columns=COLUMNS)
def calculate_stock(self): stock = stockstats.StockDataFrame().retype(self.feed) stock['close_20_sma'] stock['boll'] stock['boll_ub'] stock['boll_lb'] return stock.round(2)
def calculate_stock(self): stock = stockstats.StockDataFrame().retype(self.feed) shortlen = 5 longlen = 10 short = talib.EMA(self.feed['volume'], shortlen) long = talib.EMA(self.feed['volume'], longlen) osc = 100 * (short - long) / long stock['VOSC'] = osc return stock
def __init__(self, df: pd.core.frame.DataFrame): # Arg Check co = ['open', 'high', 'low', 'close'] if not all(i in df.columns for i in co): raise KeyError("arg's columns must have {}, but it has {}".format(co, df.columns)) self._init_stock_dataframe = ss.StockDataFrame(df) # スパン変更前のデータフレーム self.stock_dataframe = None # スパン変更後、インジケータ追加後のデータフレーム self.freq = None # 足の時間幅 self._fig = None # <-- plotly.graph_objs self._indicators = {} # Plotするときに使う指標
def __init__(self, df: pd.core.frame.DataFrame): # Arg Check co = ['open', 'high', 'low', 'close'] assert all( i in df.columns for i in co), 'arg\'s columns must have {}, but it has {}'.format( co, df.columns) if not type(df.index) == pd.tseries.index.DatetimeIndex: raise TypeError(df.index) self._init_stock_dataframe = ss.StockDataFrame(df) # スパン変更前のデータフレーム self.stock_dataframe = None # スパン変更後、インジケータ追加後のデータフレーム self.freq = None # 足の時間幅 self._fig = None # <-- plotly.graph_objs
def resample(self, freq: str): """Convert ohlc time span Usage: `fx.resample('D') # 日足に変換` * Args: 変更したい期間 M(onth) | W(eek) | D(ay) | H(our) | T(Minute) | S(econd) * Return: スパン変更後のデータフレーム """ self.freq = freq df = self._init_stock_dataframe.resample(freq).ohlc2().dropna() self.stock_dataframe = ss.StockDataFrame(df) for indicator in self._indicators.keys(): self.append(indicator) # Re-append indicator in dataframe return self.stock_dataframe
def calulate_stock(self): #change class attributes before calculation stockstats.StockDataFrame.BOLL_PERIOD = self.boll_period stock = stockstats.StockDataFrame().retype(self.feed) stock['boll'] #stock._get_boll(stockstats.StockDataFrame()) stock['boll_ub'] stock['boll_lb'] #print('period',stockstats.StockDataFrame.BOLL_PERIOD) #print(stock['boll_lb'].tail(3)) stock['close_30_sma'] #boll limit stock['boll_bb'] = (stock['close'] - stock['boll_lb'])/(stock['boll_ub']-stock['boll_lb'])*100 stock['boll_band'] = (stock['boll_ub'] - stock['boll_lb'])/stock['boll']*100 #print(stock.tail(5)) #print(stock['boll'].tail(3)) #print(ind.up_trend(stock['boll'],window=2)) #print(ind.down_trend(stock['boll'],window=1)) return stock.round(2)
def run(self): print(f"Process_{self.no}_started") self.stats = stockstats.StockDataFrame(self.data) def normalize(x): x = x.copy() return (x - np.mean(x)) / (np.std(x) + 1e-5) self.wr = normalize(self.stats['wr_14']) self.kdjk = normalize(self.stats['kdjk_20']) self.kdjd = normalize(self.stats['kdjd_20']) self.kdjj = normalize(self.stats['kdjj_20']) self.rsi = normalize(self.stats['rsi_18']) self.adx = normalize(self.stats['adx']) self.dma = normalize(self.stats['dma']) self.len = len(self.stats) def shirnk(x): if abs(x) > self.threshold: return x else: return 0 sign2cate = lambda x: 1 - x while True: pos = np.random.randint(self.img_shape[1], self.len - 1 - self.k) img = self.grey_scale_img(pos) delta = self.stats.iloc[ pos + self.k]['close'] - self.stats.iloc[pos]['close'] t = shirnk(delta) sign = np.sign(t) cate = sign2cate(sign) stat = self.get_stats(pos) self.pair_queue.put((img, stat, cate))
def __init__(self, data, total_step, img_shape, charge, init_money, threshold): self.stats = stockstats.StockDataFrame(data) def normalize(x): x = x.copy() return (x - np.mean(x)) / (np.std(x) + 1e-5) self.wr = normalize(self.stats['wr_14']) self.kdjk = normalize(self.stats['kdjk_20']) self.kdjd = normalize(self.stats['kdjd_20']) self.kdjj = normalize(self.stats['kdjj_20']) self.rsi = normalize(self.stats['rsi_12']) self.adx = normalize(self.stats['adx']) self.dma = normalize(self.stats['dma']) self.len = len(self.stats) self.start_pos = None self.cur_pos = None self.total_step = total_step self.step_cnt = None self.in_cnt = None self.is_win = None self.reward_list = None self.img_shape = img_shape self.charge = charge self.action = None # 0:buy, 1:wait, 2:sell self.f = None self.threshold = threshold self.init_money = init_money self.money = None self.contract = None self.sign = None self.in_close = None self.window = None print("Env_started")
def calculate_long(self): data = ind.load_stock(self.tker,200) return stockstats.StockDataFrame().retype(data)
def get_technical_indicators(data, last_days=2691, plot=False): # 获取股价技术指标 输入参数为数据集、持续时间和是否绘制图表 输出技术指标 key表示对哪一个指标进行统计分析 # 7日均线和21日均线 import stockstats dataset_tech = data[[ 'open', 'close_x_x', 'high', 'low', 'vol', 'amount', 'pct_chg' ]] dataset_tech['close'] = dataset_tech['close_x_x'] dataset_tech['volume'] = dataset_tech['vol'] dataset_tech = dataset_tech.drop(columns=['close_x_x', 'vol']) stock = stockstats.StockDataFrame(dataset_tech) technical_keys = [ 'macd', # moving average convergence divergence. Including signal and histogram. 'macds', # MACD signal line 'macdh', # MACD histogram 'volume_delta', # volume delta against previous day 'open_2_d', # open delta against next 2 day 'open_-2_r', # open price change (in percent) between today and the day before yesterday, 'r' stands for rate. 'cr', # CR indicator, including 5, 10, 20 days moving average 'cr-ma1', 'cr-ma2', 'cr-ma3', 'volume_-3,2,-1_max', # volume max of three days ago, yesterday and two days later 'volume_-3~1_min', # volume min between 3 days ago and tomorrow 'kdjk', # KDJ, default to 9 days 'kdjd', 'kdjj', 'kdjk_3_xu_kdjd_3', # three days KDJK cross up 3 days KDJD 'open_2_sma', # 2 days simple moving average on open price 'boll', # bolling, including upper band and lower band 'boll_ub', 'boll_lb', 'close_10.0_le_5_c', # close price less than 10.0 in 5 days count 'cr-ma2_xu_cr-ma1_20_c', # CR MA2 cross up CR MA1 in 20 days count 'rsi_6', # 6 days RSI 'rsi_12', # 12 days RSI 'wr_10', # 10 days WR 'wr_6', # 6 days WR 'cci', # CCI, default to 14 days 'cci_20', ## 20 days CCI 'tr', #TR (true range) 'atr', # ATR (Average True Range) 'dma', # DMA, difference of 10 and 50 moving average 'pdi', # DMI +DI, default to 14 days 'mdi', # -DI, default to 14 days 'dx', # DX, default to 14 days of +DI and -DI 'adx', # ADX, 6 days SMA of DX, same as stock['dx_6_ema'] 'adxr', # ADXR, 6 days SMA of ADX, same as stock['adx_6_ema'] 'trix', # TRIX, default to 12 days 'trix_9_sma', # MATRIX is the simple moving average of TRIX 'vr', # VR, default to 26 days 'vr_6_sma' # MAVR is the simple moving average of VR ] for key in technical_keys: dataset_tech[key] = pd.DataFrame(stock[key]) if plot: # 绘制技术指标 plot_dataset = dataset_tech plot_dataset = dataset_tech.iloc[-last_days:, :] shape_0 = plot_dataset.shape[0] x = list(plot_dataset.index) plt.figure(dpi=100) # 1.股价、成交量,成交额、MA移动平均线、MACD plt.subplot(2, 1, 1) plt.plot(plot_dataset['close'], label='Close Price') plt.xticks(plot_dataset['volume']) plt.plot(plot_dataset['']) # 2.KDJ # 3.RSI # 4.BOLL # 5.WR # 6.DMI # 7.All in one for key in technical_keys: plt.plot(dataset_tech[key], label=key, color=choose_color()) plt.legend() plt.show() # Plot first subplot plt.subplot(2, 1, 1) plt.plot(plot_dataset[key + '_' + 'tech'], label=key + '_' + 'technical indicator', linestyle='-') plt.plot(plot_dataset[key + '_' + 'ma7'], label=key + '_' + 'MA 7', color=colors[0], linestyle='--') plt.plot(plot_dataset[key + '_' + 'ma21'], label=key + '_' + 'MA 21', color=colors[1], linestyle='--') plt.plot(plot_dataset[key + '_' + '20sd'], label=key + '_' + '20days Standard Deviation', color=colors[6], linestyle='--') plt.plot(plot_dataset[key + '_' + 'upper_band'], label=key + '_' + 'Upper Band', color=colors[2], linestyle=':') plt.plot(plot_dataset[key + '_' + 'lower_band'], label=key + '_' + 'Lower Band', color=colors[3], linestyle=':') plt.fill_between(x, plot_dataset[key + '_' + 'lower_band'], plot_dataset[key + '_' + 'upper_band'], alpha=0.3) plt.title(' Technical indicators in {} days .'.format(last_days)) plt.ylabel(key + '_' + 'technical') plt.legend() # Plot second subplot plt.subplot(2, 1, 2) plt.title('MACD') plt.plot(plot_dataset[key + '_' + 'MACD'], label=key + '_' + 'MACD', linestyle='-') plt.hlines(plot_dataset[key + '_' + 'MACD'].mean(), plot_dataset.index[0], plot_dataset.index[shape_0 - 1], color=colors[4], linestyles=':', label='MACD mean') plt.plot(plot_dataset[key + '_' + 'ema'], label=key + '_' + 'Ema', linestyle='--') plt.hlines(plot_dataset[key + '_' + 'ema'].mean(), plot_dataset.index[0], plot_dataset.index[shape_0 - 1], colors=colors[5], linestyles=':', label='Exponential moving average mean') plt.legend() plt.show() # 汇总技术指标 return dataset_tech
def reset_dataframe(df): """Reset dataframe as stockstats""" return ss.StockDataFrame(df.ix[:, ['open', 'high', 'low', 'close']])
def calulate_stock(self): stock = stockstats.StockDataFrame().retype(self.feed) #print(stock['boll'].tail(3)) return stock.round(2)
def get_technical_indicators(data, last_days=2691, plot=True, save=False): # 获取股价技术指标 输入参数为数据集、持续时间和是否绘制图表 输出技术指标 key表示对哪一个指标进行统计分析 # 7日均线和21日均线 import stockstats dataset_tech = data[[ 'daily_open', 'daily_close', 'daily_high', 'daily_low', 'daily_vol', 'daily_amount' ]] dataset_tech = dataset_tech.rename( columns=lambda x: x.lstrip('daily_')).rename(columns={ 'vol': 'volume', 'ow': 'low', 'mount': 'amount' }) stock = stockstats.StockDataFrame(dataset_tech) technical_keys = [ 'macd', # moving average convergence divergence. Including signal and histogram. 'macds', # MACD signal line 'macdh', # MACD histogram 'volume_delta', # volume delta against previous day 'volume_-3,2,-1_max', # volume max of three days ago, yesterday and two days later 'volume_-3~1_min', # volume min between 3 days ago and tomorrow 'kdjk', # KDJ, default to 9 days 'kdjd', 'kdjj', 'kdjk_3_xu_kdjd_3', # three days KDJK cross up 3 days KDJD 'boll', # bolling, including upper band and lower band 'boll_ub', 'boll_lb', 'open_2_sma', # 2 days simple moving average on open price 'open_2_d', # open delta against next 2 day 'open_-2_r', # open price change (in percent) between today and the day before yesterday, 'r' stands for rate. 'close_10.0_le_5_c', # close price less than 10.0 in 5 days count 'cr', # CR indicator, including 5, 10, 20 days moving average 'cr-ma1', 'cr-ma2', 'cr-ma3', 'cr-ma2_xu_cr-ma1_20_c', # CR MA2 cross up CR MA1 in 20 days count 'rsi_6', # 6 days RSI 'rsi_12', # 12 days RSI 'wr_10', # 10 days WR 'wr_6', # 6 days WR 'cci', # CCI, default to 14 days 'cci_20', ## 20 days CCI 'dma', # DMA, difference of 10 and 50 moving average 'pdi', # DMI +DI, default to 14 days 'mdi', # -DI, default to 14 days 'dx', # DX, default to 14 days of +DI and -DI 'adx', # ADX, 6 days SMA of DX, same as stock['dx_6_ema'] 'adxr', # ADXR, 6 days SMA of ADX, same as stock['adx_6_ema'] 'tr', #TR (true range) 'atr', # ATR (Average True Range) 'trix', # TRIX, default to 12 days 'trix_9_sma', # MATRIX is the simple moving average of TRIX 'vr', # VR, default to 26 days 'vr_6_sma' # MAVR is the simple moving average of VR ] for key in technical_keys: dataset_tech[key] = pd.DataFrame(stock[key]) dataset_tech['ma7'] = dataset_tech['close'].rolling(window=7).mean() dataset_tech['ma21'] = dataset_tech['close'].rolling(window=21).mean() dataset_tech['ema'] = dataset_tech['close'].ewm(com=0.5).mean() dataset_tech['momentum'] = dataset_tech['close'] - 1 if plot: # 绘制技术指标 plot_dataset = dataset_tech plot_dataset = dataset_tech.iloc[-last_days:, :] shape_0 = plot_dataset.shape[0] x = list(plot_dataset.index) colors = choose_color(10) # 0.股价、成交量,成交额、MA移动平均线 plt.figure(figsize=(16, 10), dpi=150) linewidth = 1 plt.subplot(3, 1, 1) plt.title('Close Price and Volume Statistics') plt.plot(plot_dataset['close'], label='Close Price') plt.plot(plot_dataset['ma7'], label='MA-7', linestyle='--', linewidth=linewidth) plt.plot(plot_dataset['ma21'], label='MA-21', linestyle='--', linewidth=linewidth) plt.plot(plot_dataset['ema'], label='EMA', linestyle=':', linewidth=linewidth) plt.legend() plt.subplot(3, 1, 2) plt.bar(x, plot_dataset['volume'], label='Volume', width=linewidth) plt.bar(x, -plot_dataset['amount'], label='Amount', width=linewidth) plt.legend() plt.subplot(3, 1, 3) plt.plot(plot_dataset['volume_delta'], label='volume delta', linestyle='-', linewidth=linewidth / 2, color='k') plt.legend() if save: plt.savefig('project\\feature_engineering\\30_price_amount.png') plt.show() # 1.MACD plt.figure(figsize=(16, 10), dpi=150) linewidth = 1 plt.subplot(2, 1, 1) plt.title('Close price and MACD') plt.plot(plot_dataset['close'], label='Close Price') plt.legend() plt.subplot(2, 1, 2) plt.plot(plot_dataset['macd'], label='macd', linewidth=linewidth) plt.plot(plot_dataset['macds'], label='macd signal line', linestyle='--', linewidth=linewidth) plt.bar(plot_dataset['macdh'].loc[plot_dataset['macdh'] >= 0].index, plot_dataset['macdh'].loc[plot_dataset['macdh'] >= 0], label='macd histgram', width=linewidth, color='r') plt.bar(plot_dataset['macdh'].loc[plot_dataset['macdh'] < 0].index, plot_dataset['macdh'].loc[plot_dataset['macdh'] < 0], label='macd histgram', width=linewidth, color='g') plt.legend() if save: plt.savefig('project\\feature_engineering\\31_MACD.png') plt.show() # 2.KDJ and BOLL plt.figure(figsize=(16, 10), dpi=150) linewidth = 1 plt.subplot(2, 1, 1) plt.title('Bolling band and KDJ') plt.plot(plot_dataset['close'], label='Close Price') plt.plot(plot_dataset['boll'], label='Bolling', linestyle='--', linewidth=linewidth) plt.plot(plot_dataset['boll_ub'], color='c', label='Bolling up band', linewidth=linewidth) plt.plot(plot_dataset['boll_lb'], color='c', label='Bolling low band', linewidth=linewidth) plt.fill_between(x, plot_dataset['boll_ub'], plot_dataset['boll_lb'], alpha=0.35) plt.legend() plt.subplot(2, 1, 2) plt.plot(plot_dataset['kdjk'], label='KDJ-K', linewidth=linewidth) plt.plot(plot_dataset['kdjd'], label='KDJ-K', linewidth=linewidth) plt.plot(plot_dataset['kdjj'], label='KDJ-K', linewidth=linewidth) plt.scatter( plot_dataset['kdjk'].loc[plot_dataset['kdjk_3_xu_kdjd_3'] == True].index, plot_dataset['kdjk'].loc[plot_dataset['kdjk_3_xu_kdjd_3'] == True], marker='^', color='r', label='three days KDJK cross up 3 days KDJD') plt.legend() if save: plt.savefig('project\\feature_engineering\\32_boll_kdj.png') plt.show() # 3.Open price and RSI plt.figure(figsize=(16, 10), dpi=150) linewidth = 1 plt.subplot(2, 1, 1) plt.title('Open price and RSI') plt.plot(plot_dataset['open'], label='Open Price') plt.bar(x, plot_dataset['open_2_d'], label='open delta against next 2 day') plt.plot( plot_dataset['open_-2_r'], label= 'open price change (in percent) between today and the day before yesterday', linewidth=linewidth) plt.legend() plt.subplot(2, 1, 2) plt.plot(plot_dataset['rsi_12'], label='12 days RSI ', color='c') plt.plot(plot_dataset['rsi_6'], label='6 days RSI', linewidth=linewidth, color='r') plt.legend() if save: plt.savefig('project\\feature_engineering\\33_open_rsi.png') plt.show() # 4.CR and WR plt.figure(figsize=(16, 10), dpi=150) linewidth = 1 plt.subplot(2, 1, 1) plt.title('WR and CR in 5/10/20 days') plt.plot(plot_dataset['wr_10'], label='10 days WR', linestyle='-', linewidth=linewidth, color='g') plt.plot(plot_dataset['wr_6'], label='6 days WR', linestyle='-', linewidth=linewidth, color='r') plt.legend() plt.subplot(2, 1, 2) plt.bar(x, plot_dataset['cr'], label='CR indicator', linestyle='--', linewidth=linewidth, color='skyblue') plt.plot(plot_dataset['cr-ma1'], label='CR 5 days MA', linestyle='-', linewidth=linewidth) plt.plot(plot_dataset['cr-ma2'], label='CR 10 days MA', linestyle='-', linewidth=linewidth) plt.plot(plot_dataset['cr-ma3'], label='CR 20 days MA', linestyle='-', linewidth=linewidth) plt.legend() if save: plt.savefig('project\\feature_engineering\\34_cr_ma.png') plt.show() # 5.CCI TR VR # plt.figure(figsize=(16, 10), dpi=150) linewidth = 1 plt.subplot(2, 1, 1) plt.title('CCI TR and VR') plt.plot(plot_dataset['tr'], label='TR (true range)', linewidth=linewidth) plt.plot(plot_dataset['atr'], label='ATR (Average True Range)', linewidth=linewidth) plt.plot(plot_dataset['trix'], label='TRIX, default to 12 days', linewidth=linewidth) plt.plot(plot_dataset['trix_9_sma'], label='MATRIX is the simple moving average of TRIX', linewidth=linewidth) plt.legend() plt.subplot(2, 1, 2) plt.plot(plot_dataset['cci'], label='CCI, default to 14 days', linestyle='-', linewidth=linewidth, color='r') plt.plot(plot_dataset['cci_20'], label='20 days CCI', linestyle='-', linewidth=linewidth, color='g') plt.bar(x, plot_dataset['vr'], label='VR, default to 26 days') plt.bar(x, -plot_dataset['vr_6_sma'], label='MAVR is the simple moving average of VR') plt.legend() if save: plt.savefig('project\\feature_engineering\\35_cci_tr_vr.png') plt.show() # 6.DMI plt.figure(figsize=(16, 10), dpi=150) linewidth = 1 plt.subplot(3, 1, 1) plt.title('DMI and DMA') plt.bar(x, plot_dataset['pdi'], label='+DI, default to 14 days', color='r') plt.bar(x, -plot_dataset['mdi'], label='-DI, default to 14 days', color='g') plt.legend() plt.subplot(3, 1, 2) plt.plot(plot_dataset['dma'], label='DMA, difference of 10 and 50 moving average', linewidth=linewidth, color='k') plt.legend() plt.subplot(3, 1, 3) plt.plot(plot_dataset['dx'], label='DX, default to 14 days of +DI and -DI', linewidth=linewidth) plt.plot(plot_dataset['adx'], label='6 days SMA of DX', linewidth=linewidth) plt.plot(plot_dataset['adxr'], label='ADXR, 6 days SMA of ADX', linewidth=linewidth) plt.legend() if save: plt.savefig('project\\feature_engineering\\36_close_DMI.png') plt.show() return dataset_tech