def select(stock_list, x_position=-1, zf=4, kline_type=StockConfig.kline_type_week, min_item=80): """ 均线选股法 :param stock_list: :param kline_type: :param avg: :return: """ result = [] for stock in stock_list: try: kline = StockIO.get_kline(stock.stock_code, kline_type=kline_type) except Exception as e: print(e) continue if kline.shape[0] < min_item: continue open = kline[:, 1].astype(np.float) close = kline[:, 2].astype(np.float) high = kline[:, 3].astype(np.float) low = kline[:, 4].astype(np.float) p_close = np.roll(close, 1) sma5, sma10, sma20 = StockIndicator.sma(kline, 5, 10, 20) max_zf = StockIndicator.max_zf(kline) if max_zf[x_position] > zf and (low[x_position] < sma20[x_position]) and open[x_position] < close[x_position]: print(stock) result.append(stock) print(len(result)) return result
def select(x_position=-1): origin_stock = get_stock(x_position - 1) new_stock = get_stock(x_position) diff_stock = [x for x in new_stock if x in origin_stock] result = [] for stock in diff_stock: try: kline = StockIO.get_kline(stock.stock_code, kline_type=StockConfig.kline_type_day) except Exception as e: print(e) continue if kline.shape[0] < 10: continue close = kline[:, 2].astype(np.float) cjl = StockIndicator.cjl(kline) sma_cjl5, smacjl10 = StockIndicator.asma(cjl, 5, 10) if close[x_position] > np.max(close[x_position - 10: x_position]): if cjl[x_position] > sma_cjl5[x_position] > smacjl10[x_position]: print(stock) result.append(stock) return result
def stat_chg(stock_list, from_date, to_date, kline_type=StockConfig.kline_type_day): reports = [] if len(stock_list) == 0: return reports for stock in stock_list: frome_position = StockIndicator.position(from_date, stock.stock_code, kline_type) to_position = StockIndicator.position(to_date, stock.stock_code, kline_type) if frome_position is not None and to_position is not None: kline = StockIO.get_kline(stock.stock_code, kline_type=StockConfig.kline_type_day) pre_close = float(kline[frome_position][2]) close = float(kline[to_position][2]) reports.append( (stock.stock_code, stock.stock_name, close, close - pre_close, (close - pre_close) / pre_close * 100)) reports.sort(key=lambda x: x[4]) print("%-10s %-10s %8s %8s %8s" % ('code', 'name', 'price', 'chg', 'chg_per')) for report in reports: print("%-10s %-10s %8.2f %8.2f %8.2f" % (report[0], report[1], report[2], report[3], report[4])) return reports
def select(stock_list, kline_type=StockConfig.kline_type_week, x_position=-1, abs_chg=15, min_vb=10, max_vb=100, min_item=120): """ 指定 振幅 或者 涨幅区间 :param stock_list: :param kline_type: :param avg:d :return: """ result = [] for stock in stock_list: try: kline = StockIO.get_kline(stock.stock_code, kline_type=kline_type) close = kline[:, 2].astype(np.float) except: continue if kline.shape[0] < min_item: continue chg = StockIndicator.chg(kline) vb = StockIndicator.vibration(kline) if max_chg > chg[x_position] > min_chg or max_vb > vb[ x_position] > min_vb: print(stock) result.append(stock) return result
def select(stock_list, x_position=-1, df=-4, kline_type=StockConfig.kline_type_week, min_item=80): """ 均线选股法 :param stock_list: :param kline_type: :param avg: :return: """ result = [] for stock in stock_list: try: kline = StockIO.get_kline(stock.stock_code, kline_type=kline_type) except Exception as e: print(e) continue if kline.shape[0] < min_item: continue close = kline[:, 2].astype(np.float) sma5, sma10, sma20 = StockIndicator.sma(kline, 5, 10, 20) max_df = StockIndicator.max_df(kline) if max_df[x_position] < df and (close[x_position] < sma10[x_position]): print(stock) result.append(stock) print(len(result)) return result
def select(stock_list, x_position=-1, kline_type=StockConfig.kline_type_day, min_item=120): """ 均线选股法 :param stock_list: :param kline_type: :param avg: :return: """ result = [] for stock in stock_list: try: kline = StockIO.get_kline(stock.stock_code, kline_type=kline_type) except Exception as e: print(e) continue if kline.shape[0] < min_item: continue open = kline[:, 1].astype(np.float) close = kline[:, 2].astype(np.float) low = kline[:, 4].astype(np.float) sma5, sma10, sma20, sma30, sma60 = StockIndicator.sma( kline, 5, 10, 20, 30, 60) zf = StockIndicator.zf(kline) if close[x_position] > sma5[x_position] > sma10[x_position] > open[ x_position] and sma10[x_position] > sma20[x_position]: if zf[x_position] > 5: print(stock) result.append(stock) return result
def select(stock_list, kline_type=StockConfig.kline_type_week, x_position=-1, min_vb=6, ratio=0.4, min_item=120): """ 振幅/涨幅 """ result = [] for stock in stock_list: try: kline = StockIO.get_kline(stock.stock_code, kline_type=kline_type) except: continue if kline.shape[0] < min_item: continue open = kline[:, 1].astype(np.float) close = kline[:, 2].astype(np.float) high = kline[:, 3].astype(np.float) low = kline[:, 4].astype(np.float) chg = StockIndicator.chg(kline) vb = StockIndicator.vibration(kline) entity = StockIndicator.entity(kline) sma5, sma10, sma20 = StockIndicator.sma(kline, 5, 10, 20) if entity[x_position] / abs(chg[x_position]) > 1.5 and entity[x_position] > 3: print(stock) result.append(stock) return result
def select(stock_list, x_position=-1, min_item=10): """ 均线选股法 :param stock_list: :param kline_type: :param avg: :return: """ result = [] for stock in stock_list: try: kline = StockIO.get_kline(stock.stock_code, kline_type=StockConfig.kline_type_day) except: continue if kline.shape[0] < min_item: continue open = kline[:, 1].astype(np.float) close = kline[:, 2].astype(np.float) sma5, sma10, sma20 = StockIndicator.sma(kline, 5, 10, 20) vb = StockIndicator.vibration(kline) chg = StockIndicator.chg(kline) chg_compress = StockAlgrithm.compress_array(chg) if chg[x_position] < 0: if sma5[x_position] > sma10[x_position] and sma5[x_position] > sma20[x_position]: if chg_compress[-2] + chg_compress[-1] > 0: print(stock) result.append(stock) return result
def select(stock_list, kline_type=StockConfig.kline_type_week, x_position=-1, min_vb=6, ratio=0.4, min_item=120, append_file='recent2.txt'): """ 下影线选股法 """ result = [] for stock in stock_list: try: kline = StockIO.get_kline(stock.stock_code, kline_type=kline_type) except: continue if kline.shape[0] < min_item: continue open = kline[:, 1].astype(np.float) close = kline[:, 2].astype(np.float) high = kline[:, 3].astype(np.float) low = kline[:, 4].astype(np.float) vb = StockIndicator.vibration(kline) chg = StockIndicator.chg(kline) sma5, sma10, sma20 = StockIndicator.sma(kline, 5, 10, 20) if StockShape.is_lower_shadow(open[x_position], close[x_position], high[x_position], low[x_position], min_vb=min_vb, ratio=ratio, red=True): print(stock) result.append(stock) # print(stock) # result.append(stock) # append to file # path = '{root}/{name}'.format(root=StockConfig.path_track, name=append_file) # with open(path, mode='a', encoding='utf-8') as f: # value = low[-1] + (high[-1] - low[-1]) * 0.3 # f.write("{},{},{}\n".format(stock.stock_code, value, high[-1])) return result
def select(stock_list, kline_type=StockConfig.kline_type_week, x_position=-1, min_chg=-100, max_chg=100, min_vb = 15, max_vb=100, period=6,min_item=120): """ 根据 振幅区间 和 涨幅区间排序 :param stock_list: :param kline_type: :param avg:d :return: """ result = [] for stock in stock_list: try: kline = StockIO.get_kline(stock.stock_code, kline_type=kline_type) close = kline[:, 2].astype(np.float) except: continue if kline.shape[0] < min_item: continue chg = StockIndicator.chg(kline) vb = StockIndicator.vibration(kline) if max_chg > chg[x_position] > min_chg and max_vb > vb[x_position] > min_vb: # 过滤掉单边上涨 if not StockAlgrithm.sumOfSubArray(chg[-period:])[0] > 14: if np.max(vb[-period:]) > 14: print(stock) result.append(stock) return result
def select(stock_list, x_position=-1, kline_type=StockConfig.kline_type_week, min_item=120): """ 均线选股法 :param stock_list: :param kline_type: :param avg: :return: """ result = [] for stock in stock_list: try: kline = StockIO.get_kline(stock.stock_code, kline_type=kline_type) except: continue if kline.shape[0] < min_item: continue open = kline[:, 1].astype(np.float) close = kline[:, 2].astype(np.float) sma5, sma10, sma20, sma30 = StockIndicator.sma(kline, 5, 10, 20, 30) cjl = StockIndicator.cjl(kline) if sma5[x_position] > sma10[x_position] > sma20[x_position] > sma30[ x_position]: result.append(stock) return result
def select_7(date): """ 还有about=False等 :return: """ filter_date = date fileter_x_position = None stock_list = StockFilter.find_kdj_jx('sza', kline_type=StockConfig.kline_type_day, x_position=fileter_x_position, date=filter_date, about=False) result = [] hit = False for stock in stock_list: x_position = StockIndicator.position( filter_date, stock.stock_code, StockConfig.kline_type_day ) if filter_date is not None else fileter_x_position kline = StockIO.get_kline(stock.stock_code, kline_type=StockConfig.kline_type_day) open = kline[:, 1].astype(np.float) close = kline[:, 2].astype(np.float) vol = kline[:, 5].astype(np.float) sma5 = StockIndicator.sma(kline, 5)[0] if sma5.shape[0] < 5 + abs(x_position): continue if sma5[x_position] < open[x_position] < close[x_position] \ and sma5[x_position - 2] > close[x_position - 2] \ and sma5[x_position - 3] > close[x_position - 3] \ and sma5[x_position - 4] > close[x_position - 4] \ and sma5[x_position - 5] < close[x_position - 5] : result.append(stock) return result
def select(stock_list, kline_type=StockConfig.kline_type_week, x_position=-3, shadow_min_vb=3.5, shadow_ratio=0.4, min_chg=-100, max_chg=100, min_vb=6, max_vb=20, min_item=120): """ 根据 振幅区间 和 涨幅区间排序 :param stock_list: :param kline_type: :param avg:d :return: """ result = [] for stock in stock_list: try: kline = StockIO.get_kline(stock.stock_code, kline_type=kline_type) open = kline[:, 1].astype(np.float) close = kline[:, 2].astype(np.float) high = kline[:, 3].astype(np.float) low = kline[:, 4].astype(np.float) sma5, sma10, sma20 = StockIndicator.sma(kline, 5, 10, 20) chg = StockIndicator.chg(kline) vb = StockIndicator.vibration(kline) except: continue if kline.shape[0] < min_item: continue if close[x_position] < sma5[x_position] < sma10[x_position] < sma20[ x_position]: continue if max_chg > chg[x_position] > min_chg and max_vb > vb[ x_position] > min_vb: result.append(stock) continue if StockShape.is_lower_shadow(open[x_position], close[x_position], high[x_position], low[x_position], min_vb=shadow_min_vb, ratio=shadow_ratio, red=False): result.append(stock) continue # if sma5[x_position] > sma10[x_position] > sma20[x_position] and vb[x_position] > shadow_min_vb: # result.append(stock) continue return result
def select(stock_list, x_position=-1, w_x_position=-1, kline_type=StockConfig.kline_type_week, min_item=80): """ 均线选股法 :param stock_list: :param kline_type: :param avg: :return: """ result = [] for stock in stock_list: try: kline = StockIO.get_kline(stock.stock_code, kline_type=kline_type) except Exception as e: print(e) continue if kline.shape[0] < min_item: continue open = kline[:, 1].astype(np.float) close = kline[:, 2].astype(np.float) low = kline[:, 4].astype(np.float) sma5, sma10, sma20, sma30, sma60 = StockIndicator.sma( kline, 5, 10, 20, 30, 60) cjl = StockIndicator.cjl(kline) add = False if close[x_position] > sma5[x_position] > sma10[x_position] and close[ x_position] > sma20[x_position] and sma5[x_position] > sma20[ x_position]: if close[x_position] > np.max(close[x_position - 10:x_position]): add = False # 趋势 count = 0 while count < 10: if StockFilter2.is_jx(sma5, sma10, x_position - count): add = True break count += 1 if add: max_exceed = 5 while close[x_position] > np.max( close[x_position - max_exceed:x_position]): max_exceed += 1 if max_exceed > 200: break stock.max_exceed = max_exceed if add: print(stock) result.append(stock) return result
def select(stock_list, kline_type=StockConfig.kline_type_day, x_position=-1, min_item=120): """ 根据 振幅区间 和 涨幅区间排序 :param stock_list: :param kline_type: :param avg:d :return: """ result = [] for stock in stock_list: try: kline = StockIO.get_kline(stock.stock_code, kline_type=kline_type) close = kline[:, 2].astype(np.float) except: continue if kline.shape[0] < min_item: continue open = kline[:, -1].astype(np.float) close = kline[:, -2].astype(np.float) high = kline[:, -3].astype(np.float) low = kline[:, -4].astype(np.float) sma5, sma10, sma20 = StockIndicator.sma(kline, 5, 10, 20) vb = StockIndicator.vibration(kline) count = 9 stock.count = 0 while count >= 0: strength = 0 if high[x_position - count] > sma5[x_position - count] > low[x_position - count]: strength += 1 if high[x_position - count] > sma10[x_position - count] > low[x_position - count]: strength += 1 if high[x_position - count] > sma20[x_position - count] > low[x_position - count]: strength += 1 if strength >= 4 and vb[x_position - count] > 4: stock.count += 1 count -= 1 if stock.count > 3: result.append(stock) print(stock) return result
def select_w_5(stock_list): """ 随机游走模型 :return: """ min_item = 120 x_position = -1 period = 5 result = [] for stock in stock_list: try: kline = StockIO.get_kline(stock.stock_code, kline_type=StockConfig.kline_type_week) except: continue if kline.shape[0] <= min_item: continue open = kline[:, 1].astype(np.float)[:None if x_position == -1 else (x_position + 1)] close = kline[:, 2].astype(np.float)[:None if x_position == -1 else (x_position + 1)] high = kline[:, 3].astype(np.float)[:None if x_position == -1 else (x_position + 1)] low = kline[:, 4].astype(np.float)[:None if x_position == -1 else (x_position + 1)] vb = StockIndicator.vibration(kline)[:None if x_position == -1 else (x_position + 1)][-period:] cg = (close - open)[-period:] count = 0 for index, z in enumerate(vb): if z > 15: count = count + 1 if count >= 3 and not stock.stock_code.startswith('300'): result.append(stock) print(vb) print(stock) return result
def select(stock_list, kline_type=StockConfig.kline_type_week, x_position=-1, min_hsl=10, max_hsl=100, min_item=120): """ 根据 换手率选择 :param stock_list: :param kline_type: :param avg:d :return: """ ltgb = StockIO.get_ltgb() print(ltgb) result = [] for stock in stock_list: try: kline = StockIO.get_kline(stock.stock_code, kline_type=kline_type) close = kline[:, 2].astype(np.float) except: continue if kline.shape[0] < min_item: continue hsl = StockIndicator.hsl(kline, ltgb.get(stock.stock_code, 0)) if hsl is None: continue #print(stock.stock_code) if min_hsl < hsl[x_position] < max_hsl: print(stock) result.append(stock) return result
def a(stock_list, kline_type=StockConfig.kline_type_day, x_position=-1, min_item=360): """ 一阳穿三线, 股票有启动迹象,观察后续均线走势 :param stock_list: :param kline_type: :param x_position: :return: """ result = [] for stock in stock_list: try: origin_kline = StockIO.get_kline(stock.stock_code, kline_type=kline_type) except: continue if origin_kline.shape[0] < min_item: continue open = origin_kline[:, 1].astype(np.float) close = origin_kline[:, 2].astype(np.float) high = origin_kline[:, 3].astype(np.float) low = origin_kline[:, 4].astype(np.float) sma5, sma10, sma20 = StockIndicator.sma(origin_kline, 5, 10, 20) if close[x_position] > open[x_position]: if open[x_position] < min( sma5[x_position], sma10[x_position], sma20[x_position]) and close[x_position] > max( sma5[x_position], sma10[x_position], sma20[[x_position]]): result.append(stock) return result
def day_tendency(x_position=-1): """ 收盘价 位于 20日线 或者 60日线之上 :return: """ stock_result = [] stock_list_1 = StockIO.get_stock('sha') stock_list_2 = StockIO.get_stock('sza') stock_list = stock_list_1 + stock_list_2 for stock in stock_list: try: kline = StockIO.get_kline(stock.stock_code, kline_type=StockConfig.kline_type_day) open = kline[:, 1].astype(np.float) close = kline[:, 2].astype(np.float) sma5, sma10, sma20, sma60 = StockIndicator.sma( kline, 5, 10, 20, 60) except Exception as e: print(e) continue if kline.shape[0] < 360: continue if sma5[x_position] > sma20[x_position] and sma5[x_position] > sma60[ x_position] and sma10[x_position] > sma20[ x_position] and sma10[x_position] > sma60[x_position]: if close[x_position] < sma5[x_position] and open[ x_position] > sma5[x_position]: stock_result.append(stock) return stock_result
def select(stock_list, kline_type=StockConfig.kline_type_week, x_position=-1, min_item=120): """ 根据 换手率选择 :param stock_list: :param kline_type: :param avg:d :return: """ ltgb = StockIO.get_ltgb() print(ltgb) result = [] for stock in stock_list: try: kline = StockIO.get_kline(stock.stock_code, kline_type=kline_type) close = kline[:, 2].astype(np.float) except: continue if kline.shape[0] < min_item: continue sma30 = StockIndicator.sma(kline, 30)[0] if close[x_position] > sma30[x_position]: #print(stock) result.append(stock) return result
def select(stock_list, x_position=-1, kline_type=StockConfig.kline_type_week, min_item=120): """ 均线选股法 :param stock_list: :param kline_type: :param avg: :return: """ result = [] for stock in stock_list: try: kline = StockIO.get_kline(stock.stock_code, kline_type=kline_type) except: continue if kline.shape[0] < min_item: continue open = kline[:, 1].astype(np.float) close = kline[:, 2].astype(np.float) high = kline[:, 3].astype(np.float) sma5, sma10, sma20, sma60 = StockIndicator.sma(kline, 5, 10, 20, 60) if not (close[x_position] > sma5[x_position] > sma10[x_position] and sma5[x_position] > sma20[x_position]): continue if not close[x_position] > max( np.max(open[x_position - 20:x_position]), np.max(close[x_position - 20:x_position])): continue print(stock) result.append(stock) return result
def fei_lei(): stock_result = [] stock_list = StockIO.get_stock('sha') stock_list += StockIO.get_stock('sza') for stock in stock_list: try: kline = StockIO.get_kline(stock.stock_code, kline_type=StockConfig.kline_type_day) except Exception as e: print(e) continue if kline.shape[0] < 41: continue close = kline[:, 2].astype(np.float) sma5, sma10, sma20, sma30 = StockIndicator.sma(kline, 5, 10, 20, 30) if close[-1] > sma5[-1] > sma10[-1] > sma20[-1] > sma30[-1]: print(stock) stock_result.append(stock) StockIO.save_stock('day_up', stock_result, root=StockConfig.path_stock, message='日线向上股')
def select(stock_list, kline_type=StockConfig.kline_type_week, x_position=-1, min_vb=6, ratio=0.4, min_item=120): """ 影线选股法 """ result = [] for stock in stock_list: try: kline = StockIO.get_kline(stock.stock_code, kline_type=kline_type) except: continue if kline.shape[0] < min_item: continue open = kline[:, 1].astype(np.float) close = kline[:, 2].astype(np.float) high = kline[:, 3].astype(np.float) low = kline[:, 4].astype(np.float) chg = StockIndicator.chg(kline) #sma5, sma10, sma20 = StockIndicator.sma(kline, 5, 10, 20) if StockShape.is_shadow(open[x_position], close[x_position], high[x_position], low[x_position], min_vb=min_vb, ratio=ratio, red=False): if not StockAlgrithm.sumOfSubArray(chg[-15:])[0] > 15: print(stock) result.append(stock) return result
def select(stock_list, kline_type=StockConfig.kline_type_week, x_position=-1, period=10, min_down=-5, max_down=-15, min_item=100): """ 根据跌幅来选择 :param stock_list: :param kline_type: :param avg:d :return: """ result = [] from_position = x_position - period + 1 to_position = None if x_position == -1 else (x_position + 1) for stock in stock_list: try: kline = StockIO.get_kline(stock.stock_code, kline_type=kline_type) chg = StockIndicator.chg(kline)[from_position:to_position] except: continue if kline.shape[0] < min_item: continue up, down = StockAlgrithm.sumOfSubArray(chg) if max_down < down < min_down: result.append(stock) return result
def week_tendency2(): """ 收盘价 位于 20日线 或者 60日线之上 :return: """ stock_result = [] stock_list_1 = StockIO.get_stock('sha') stock_list_2 = StockIO.get_stock('sza') stock_list = stock_list_1 + stock_list_2 for stock in stock_list: try: kline = StockIO.get_kline(stock.stock_code, kline_type=StockConfig.kline_type_week) close = kline[:, 2].astype(np.float) sma5, sma10, sma20, sma60 = StockIndicator.sma( kline, 5, 10, 20, 60) except Exception as e: print(e) continue if kline.shape[0] < 41: continue if sma5[-2] > sma10[-2] and sma5[-2] > sma20[-2]: stock_result.append(stock) return stock_result
def query_close(stock_list, date): reports = [] if len(stock_list) == 0: return reports for stock in stock_list: position = StockIndicator.position( date, stock.stock_code, kline_type=StockConfig.kline_type_day) if position is not None: kline = StockIO.get_kline(stock.stock_code, kline_type=StockConfig.kline_type_day) kline_item = kline[position] pre_close = float(kline[position - 1][2] if kline.shape[0] > abs(position) else kline_item[1]) close = float(kline_item[2]) reports.append( (stock.stock_code, stock.stock_name, close, close - pre_close, (close - pre_close) / pre_close * 100)) reports.sort(key=lambda x: x[4]) print("%-10s %-10s %8s %8s %8s" % ('code', 'name', 'price', 'chg', 'chg_per')) for report in reports: print("%-10s %-10s %8.2f %8.2f %8.2f" % (report[0], report[1], report[2], report[3], report[4])) return reports
def delete_invalid_record(): with open('{}/{}'.format(StockConfig.path_track, '2_sma_track.txt'), 'r', encoding='utf-8') as f: lines = f.readlines() with open('{}/{}'.format(StockConfig.path_track, '2_sma_track.txt'), 'w', encoding='utf-8') as f: for line in lines: if not line.startswith("#") and not '\n' == line: data = line.strip('\n').split(',') stock_code = data[0] target_sma = 0 if data[2].strip() == '' else int(data[2]) target_price = 0 if data[3].strip() == '' else float(data[3]) kline = StockIO.get_kline(stock_code, StockConfig.kline_type_day) close = kline[:, -2].astype(np.float) sma5, sma10, sma20 = StockIndicator.sma(kline, 5, 10, 20) if target_sma == 0 and target_price == 0: if sma5[-1] < sma10[-1] and sma5[-1] < sma20[-1] or close[ -1] < sma20[-1]: continue f.write(line) else: f.write(line)
def select(stock_list, x_position=-1, w_x_position=-1, kline_type=StockConfig.kline_type_week, min_item=120): """ 均线选股法 :param stock_list: :param kline_type: :param avg: :return: """ result = [] for stock in stock_list: try: kline = StockIO.get_kline(stock.stock_code, kline_type=kline_type) w_kline = StockIO.get_kline(stock.stock_code, kline_type=StockConfig.kline_type_week) except: continue if kline.shape[0] < min_item: continue open = kline[:, 1].astype(np.float) close = kline[:, 2].astype(np.float) sma5, sma10, sma20, sma30 = StockIndicator.sma(kline, 5, 10, 20, 30) cjl = StockIndicator.cjl(kline) w_close = w_kline[:, 2].astype(np.float) #if w_sma5[w_x_position] > w_sma10[w_x_position]: if close[x_position] > sma5[x_position] > sma10[x_position] and close[ x_position] > sma30[x_position]: if close[x_position] > np.max(close[x_position - 8:x_position]): if cjl[x_position] > np.max(cjl[x_position - 8:x_position]): count = 0 add = False while count < 4: if StockFilter2.is_jx(sma5, sma10, x_position - count): add = True break count += 1 if add: print(stock) result.append(stock) return result
def kdj_is_in(stock, kline_type, position=0, k_min=0, k_max=30): kline = StockIO.get_kline(stock.stock_code, kline_type) k, d = StockIndicator.kd(StockIO.get_kline(stock.stock_code, kline_type), 9) if k.shape[0] > abs(position) + 1: if k_max > k[position] > k[position - 1] > k_min: return True return False
def bottom_shape(stock, kline_type, **args): """ :param stock: :param kline_type: :param :return: """ k_min = args.get('k_min', 0) k_max = args.get('k_max', 0) kline = StockIO.get_kline(stock.stock_code, kline_type) k, d = StockIndicator.kd(kline) sma5 = StockIndicator.sma(kline, 5)[0] # 形态确认 #if(StockFilter.is_jx(k, d, True) or StockFilter.is_jx(k, d, False) or ) # 强度确认 return 9, 20,