def bigFallOpen(self, stocks): # 大幅低开,放心追 rise_threshold = -0.07 buy_stocks = [] for stock in stocks: opens = history_bars(stock, self.period, '1d', 'open') close = history_bars(stock, self.period, '1d', 'close') # increase_rate = (now - past) / past open_rate = (opens[-1] - close[-2]) / close[-2] if open_rate < rise_threshold: buy_stocks.append(stock) return buy_stocks
def search(self, stocks, sc_dict, today): sell_stocks = [] for stock in stocks: buy_date = sc_dict[stock][0] period = (today - buy_date).days + 1 highs = history_bars(stock, period, '1d', 'high') close = history_bars(stock, period, '1d', 'close') # increase_rate = (now - past) / past retreat_rate = (close[-1] - highs.max()) / highs.max() if retreat_rate <= self.retreat_threshold: # pdb.set_trace() sell_stocks.append(stock) return sell_stocks
def riseStopCheck(self, stocks): # 选出日涨停,且不是连续涨停 check_period = 10 selected_stocks = [] for stock in stocks: high_prices = history_bars(stock, check_period+1, '1d', 'high') close_prices = history_bars(stock, check_period+1, '1d', 'close') # 要求收盘价等于最高价,但要求收盘价高于9.95% if (Utility.isRiseStopNow(close_prices) and close_prices[-1] == high_prices[-1] and not Utility.isContinueRiseStop(close_prices, max_co_present=2)): selected_stocks.append(stock) self.logger.debug('选出当日涨停,且不连续涨停的股票%s' % stock) return selected_stocks
def breakStrength(self, stocks): # 收盘价创3个交易日新高, 且选出日未出现跳空缺口 check_period = 3 selected_stocks = [] for stock in stocks: close_prices = history_bars(stock, check_period, '1d', 'close') open_prices = history_bars(stock, check_period, '1d', 'open') high_prices = history_bars(stock, check_period, '1d', 'high') low_prices = history_bars(stock, check_period, '1d', 'low') if close_prices.max() == close_prices[-1]: if open_prices[-1] <= high_prices[-2] and open_prices[-1] >= low_prices[-2]: selected_stocks.append(stock) self.logger.debug('选出收盘价创新高且未出现跳空缺口的股票%s' % stock) return selected_stocks
def aboveBoolMiddelLine(self, stocks): # 高于布林线中轨 # 且必须是红盘才考虑买股票 buy_stocks = [] for stock in stocks: close = history_bars(stock, self.period, '1d', 'close') opens = history_bars(stock, self.period, '1d', 'open') upper, middle, lower = talib.BBANDS(close, timeperiod=20, nbdevup=2, nbdevdn=2, matype=0) if close[-1] >= middle[-1] and close[-1] > opens[-1]: buy_stocks.append(stock) return buy_stocks
def bigRiseOpen(self, stocks): # 这条规则应该优化成,涨停开盘,如果开板就追一把。 rise_threshold = 0.07 rise_stop = 0.095 buy_stocks = [] for stock in stocks: opens = history_bars(stock, self.period, '1d', 'open') close = history_bars(stock, self.period, '1d', 'close') # increase_rate = (now - past) / past open_rate = (opens[-1] - close[-2]) / close[-2] if open_rate > rise_stop: # 开盘涨停的就不用分析了,跟不上的 continue if open_rate > rise_threshold: buy_stocks.append(stock) return buy_stocks
def search(self, stocks): uc_97 = 0 uc_85 = 0 uc_50 = 0 uc_15 = 0 uc_3 = 0 total = len(stocks) for stock in stocks: close_prices = history_bars(stock, self.period, '1d', 'close') if len(close_prices) < 90: # print('股票:%s, 交易日:%d' % (stock,len(close_prices))) total -= 1 continue if self.LessThantQ(close_prices, 97): uc_97 += 1 if self.LessThantQ(close_prices, 85): uc_85 += 1 if self.LessThantQ(close_prices, 50): uc_50 += 1 if self.LessThantQ(close_prices, 15): uc_15 += 1 if self.LessThantQ(close_prices, 3): uc_3 += 1 # upper_rate = upper_counter / total # lower_rate = lower_counter / total # 如果 uc_50/total 大于 0.5, 说明两市超过50%的股票价格处于低位,熊市特征。 # 如果 uc_3/total 大于 0.5, 说明两市超过50%的股票价格处于极低水平,股市超跌。 if uc_3 / total > 0.5: return 1 return 0
def stepBack(self, stocks): # 回踩5/10日线企稳,意思就是前一天回踩5日线,然后今天依然在5日线之上 buy_stocks = [] for stock in stocks: lows = history_bars(stock, self.period, '1d', 'low') close = history_bars(stock, self.period, '1d', 'close') avg5 = talib.MA(close, timeperiod=5, matype=0) avg10 = talib.MA(close, timeperiod=10, matype=0) if lows[-2] < avg5[-2] and close[-2] > avg5[-2] and close[ -1] > avg5[-1]: # 前一天回踩5日线,今天依然收盘在5日线之上 buy_stocks.append(stock) elif lows[-2] < avg10[-2] and close[-2] > avg10[-2] and close[ -1] > avg10[-1]: # 前一天回踩10日线,今天依然收盘在10日线之上 buy_stocks.append(stock) return buy_stocks
def calTrend(self, market_index): # 计算大盘多空趋势的核心算法 ema_period = 28 close_prices = history_bars(market_index, self.period, '1d', 'close') close_ema = talib.EMA(close_prices, timeperiod=ema_period) today = close_ema[-1] yesterday = close_ema[-2] return today, yesterday
def smallRiseOpen(self, stocks): # 小幅高开,看看再追 rise_threshold = 0.05 buy_stocks = [] for stock in stocks: opens = history_bars(stock, self.period, '1d', 'open') close = history_bars(stock, self.period, '1d', 'close') lows = history_bars(stock, self.period, '1d', 'low') # increase_rate = (now - past) / past open_rate = (opens[-1] - close[-2]) / close[-2] if open_rate < rise_threshold and open_rate > 0: if lows[-1] <= close[-2] \ and close[-1] > opens[-1]: # 回补日内缺口 # 且必须收红 buy_stocks.append(stock) return buy_stocks
def volShrinkCheck(self, stocks): check_period = 3 selected_stocks = [] for stock in stocks: close_prices = history_bars(stock, check_period+1, '1d', 'volume') if Utility.isabsoluteDesc(close_prices[:-1]): selected_stocks.append(stock) self.logger.debug('%s股票选出日前连续3天缩量下跌' % stock) return selected_stocks
def breakAvgsAdv(self, stocks): # 突破中期均线, 这个规则必须放在最后 selected_stocks = [] for stock in stocks: # 突破标志位 open_prices = history_bars(stock, self.load_period, '1d', 'open') close_prices = history_bars(stock, self.load_period, '1d', 'close') avg20 = talib.MA(close_prices, timeperiod=20, matype=0) avg30 = talib.MA(close_prices, timeperiod=30, matype=0) avg60 = talib.MA(close_prices, timeperiod=60, matype=0) # 如果确实突破了中期均线,且没有上方压力,那么就可以选择这个股票 # 计算上穿的中期均线的数量和名称 break_through = self._avgCrossFind(open_prices[-1], close_prices[-1], avg20[-1], avg30[-1], avg60[-1]) if self._strengthCheck(break_through, open_prices[-1], close_prices[-1], avg20[-1], avg30[-1], avg60[-1]): selected_stocks.append(stock) # 将突破结果写入 暂存字典 self.select_info[stock] = (close_prices[-1], '突破%s均线' % break_through) self.logger.debug('选出突破中期均线的股票%s' % stock) return selected_stocks
def search(self, stocks, sc_dict): sell_stocks = [] for stock in stocks: buy_price = sc_dict[stock][1] close = history_bars(stock, self.period, '1d', 'close') # increase_rate = (now - past) / past retreat_rate = (close[-1] - buy_price) / buy_price if retreat_rate <= self.retreat_threshold: sell_stocks.append(stock) return sell_stocks
def redAtTail(self, stocks): # 尾盘红盘 buy_stocks = [] for stock in stocks: close = history_bars(stock, self.period, '1d', 'close') # 可以考虑用小时来判断是否是尾盘,比如2:30之后。 if close[-1] > close[-2]: # 尾盘红盘后可考虑买入 buy_stocks.append(stock) return buy_stocks
def tunoverRateCheck(self, stocks): # 换手率数据取不到,因此采用成交量数据代替 # 换手率=当日成交额/流通股本 check_period = 3 selected_stocks = [] for stock in stocks: vols = history_bars(stock, check_period, '1d', 'volume') if Utility.isabsoluteIncr(vols): selected_stocks.append(stock) self.logger.debug('选出成交量逐渐放大的股票%s' % (stock)) return selected_stocks
def bollCheckAdv(self, stocks): check_period = 100 selected_stocks = [] # 收盘价跌破下轨 for stock in stocks: close_prices = history_bars(stock, check_period, '1d', 'close') upper, middle, lower = talib.BBANDS(close_prices, timeperiod=20, nbdevup=2, nbdevdn=2, matype=0) if close_prices[-1] < lower[-1]: selected_stocks.append(stock) self.logger.debug('%s收盘跌破Boll线下轨' % stock) return selected_stocks
def aboveBreakAvgLine(self, stocks): # 必须高于之前选出时,突破的那条均线 buy_stocks = [] for stock in stocks: # 找到选出当天的信息 _, break_through = self.sdb.getSelectInfo(stock, '追涨') close = history_bars(stock, break_through, '1d', 'close') avg = talib.MA(close, timeperiod=break_through, matype=0) if close[-1] > avg[-1]: buy_stocks.append(stock) return buy_stocks
def riseTooMuch(self, stocks): buy_stocks = [] for stock in stocks: # 找到涨停当天的价格 select_price, break_through = self.sdb.getSelectInfo(stock, '追涨') # 只取五天内的收盘最高价 close = history_bars(stock, 5, '1d', 'close') rise_rate = (max(close) - select_price) / select_price if rise_rate <= 0.05: buy_stocks.append(stock) return buy_stocks
def riseRateCheck(self, stocks): # 过去10个交易日内,涨幅小于25% check_period = 10 selected_stocks = [] for stock in stocks: close_prices = history_bars(stock, check_period, '1d', 'close') rise_rate = (close_prices[-1] - close_prices[0]) / close_prices[0] if rise_rate < 0.25: selected_stocks.append(stock) self.logger.debug('选出过去10个交易日内涨幅小于25%%的股票,当前涨幅%d' % (rise_rate*100)) return selected_stocks
def riseStopCheck(self, stocks): # 连续3个涨停板,三个涨停必须满足: 1,连续; 2,只有3个,不能多。 check_period = 10 selected_stocks = [] for stock in stocks: close_prices = history_bars(stock, check_period+1, '1d', 'close') if (Utility.isContinueRiseStop(close_prices, max_co_present=3) and not Utility.isContinueRiseStop(close_prices, max_co_present=4)): selected_stocks.append(stock) self.logger.debug('选出三连板的股票%s' % (stock)) return selected_stocks
def avg120TrendUpAdv(self, stocks): # 250日均线,趋势向上 selected_stocks = [] for stock in stocks: close_prices = history_bars(stock, self.load_period+3, '1d', 'close') avg250 = talib.MA(close_prices, timeperiod=250, matype=0) # 选出日前3天120日均线趋势向上 if avg250[-1] > avg250[-2] and avg250[-2] > avg250[-3]: selected_stocks.append(stock) self.logger.debug('选出120日均线趋势向上的股票%s' % stock) return selected_stocks
def rsiCheckAdv(self, stocks): # RSI指标低于20 rsi_threshold = 20 selected_stocks = [] for stock in stocks: close_prices = history_bars(stock, self.load_period, '1d', 'close') rsi_data = talib.RSI(close_prices, timeperiod=self.rsi_period)[-1] if rsi_data < rsi_threshold: selected_stocks.append(stock) self.logger.debug('%s股票RSI值低于下限20,当前RSI=%d' % (stock, rsi_data)) return selected_stocks
def rsiCheck(self, stocks): # 涨停前10个交易日内,RSI指标曾处于50以下 check_period = 10 selected_stocks = [] for stock in stocks: close_prices = history_bars(stock, self.load_period, '1d', 'close') rsi_data = talib.RSI(close_prices, timeperiod=self.rsi_period)[-check_period:] if rsi_data.min() < 50: selected_stocks.append(stock) self.logger.debug('涨停前10个交易日内,RSI指标小于50的股票%s,目前RSI=%d' % (stock, rsi_data[-1])) return selected_stocks
def periodRecordHigh(self, stocks): # 创阶段性历史新高 selected_stocks = [] observation_period = 120 for stock in stocks: close_prices = history_bars(stock, observation_period, '1d', 'close') # 涨停且当前价格是近半年来的最高值,直接选出。 if close_prices[-1] == max(close_prices): selected_stocks.append(stock) # select_info = (price, reason) self.select_info[stock] = (close_prices[-1], '创半年新高') self.logger.debug('选出半年之内创新高的股票%s' % stock) return selected_stocks
def seekBoardCheck(self, sc_dict): # 涨停卖出规则:买入条件为打板时,只要不能连续涨停就卖出 sell_stocks = [] for stock in sc_dict.keys(): close = history_bars(stock, self.period, '1d', 'close') buy_reason = sc_dict[stock][2] if buy_reason == '打板' \ and not Utility.isRiseStopNow(close): sell_stocks.append(stock) # 从可卖股票中删除打板股票,以免对后续处理造成影响 for stock in sell_stocks: sc_dict.pop(stock) return sell_stocks
def fallStopCheck(self, stocks): # 一月内不能出现连续跌停,且选出当日不能跌停 check_period = 20 selected_stocks = [] for stock in stocks: close_prices = history_bars(stock, check_period+1, '1d', 'close') if not (Utility.isContinueFallStop(close_prices, min_co_present=2) or Utility.isFallStopNow(close_prices)): selected_stocks.append(stock) else: self.logger.debug('%s股票一月内存在连续跌停,剔除' % stock) return selected_stocks
def breakAtMiddle(self, stocks): # 盘中突破 rise_threshold = 0.04 buy_stocks = [] for stock in stocks: # opens = history_bars(stock, self.period, '1d', 'open') close = history_bars(stock, self.period, '1d', 'close') # 涨幅 = (now - past) / past incr_rate = (close[-1] - close[-2]) / close[-2] if incr_rate > rise_threshold: # 盘中涨幅超过4% buy_stocks.append(stock) return buy_stocks
def deviateAvgCheckAdv(self, stocks): # 收盘价偏离30日线超过20% deviate_period = 30 deviate_threshold = -0.2 selected_stocks = [] for stock in stocks: stock_close = history_bars(stock, deviate_period, '1d', 'close') close = stock_close[-1] close_ma = talib.MA(stock_close, timeperiod=deviate_period) avg30 = close_ma[-1] deviate_idx = (close - avg30) / avg30 if deviate_idx < deviate_threshold: selected_stocks.append(stock) self.logger.debug('%s股价偏离中期均线超过%d'% (stock, deviate_idx*100)) return selected_stocks
def deviateAvgCheck(self, stocks): # 收盘价偏离20日线超过15% deviate_period = 20 deviate_threshold = -0.15 selected_stocks = [] for stock in stocks: stock_close = history_bars(stock, deviate_period, '1d', 'close') close = stock_close[-1] close_ma = talib.MA(stock_close, timeperiod=deviate_period) avg20 = close_ma[-1] # avg20 = sum(stock_close) / deviate_period deviate_idx = (close - avg20) / avg20 if deviate_idx < deviate_threshold: selected_stocks.append(stock) self.logger.debug('%s股价偏离中期均线超过%d'% (stock, deviate_idx*100)) return selected_stocks
def deviateAvgCheck(self, market, deviate_threshold): # 收盘价偏离5日线超过 x% deviate_period = 5 # deviate_threshold = -0.02 market_close = history_bars(market, self.period, '1d', 'close') close = market_close[-1] close_ma = talib.MA(market_close, timeperiod=deviate_period) avg5 = close_ma[-1] deviate_idx = (close - avg5) / avg5 # 判断是超买/还是超卖检查: 小于0超卖,大于0超买 if deviate_threshold < 0: if deviate_idx <= deviate_threshold: # 股票超卖,即使是熊市,你也可以买股票了 return True else: # 还没有触发超卖,你还得继续憋着 return False else: if deviate_idx >= deviate_threshold: # 股票超买,即使是牛市,你也不能再买股票了 return False else: # 还没有触发超买,所以你还是可以买股票 return True