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
Exemplo n.º 7
0
 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
Exemplo n.º 9
0
 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
Exemplo n.º 30
0
 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