def collectKPattherAndShowChart(): from earnmi.data.SWImpl import SWImpl from vnpy.trader.constant import Exchange from vnpy.trader.constant import Interval sw = SWImpl() lists = sw.getSW2List() start = datetime(2014, 5, 1) end = datetime(2020, 8, 17) bars = [] limitSize = 0 chart = Chart() for code in lists: # for code in lists: barList = sw.getSW2Daily(code, start, end) indicator = Indicator(40) preBar = None yestodayIsMatch = False for i in range(0, len(barList)): bar = barList[i] indicator.update_bar(bar) patternValue = KPattern.encode1KAgo1(indicator) todayIsMatch = 9 == patternValue if todayIsMatch: if indicator.count > 20: chart.show( indicator.makeBars(), savefig=f"imgs/collectKPattherAndShowChart_{limitSize}" ) limitSize += 1 if (limitSize > 50): break pass if yestodayIsMatch: pass preBar = bar yestodayIsMatch = todayIsMatch if (limitSize > 50): break pass
def printKPatterMoreDetail(kPatters=[ 6, 3, 17, 81, 7, 5, 4, 82, 159, 16, 28, 83, 15, 84, 18, 27, 93, 104, 158, 92, 160, 236, 157, 94, 85, 80, 14, 8, 161, 9, 29, 170, 26, 19, 38, 2, 79 ]): from earnmi.data.SWImpl import SWImpl from vnpy.trader.constant import Exchange from vnpy.trader.constant import Interval sw = SWImpl() lists = sw.getSW2List() start = datetime(2014, 5, 1) end = datetime(2020, 8, 17) pct_split = [-7, -5, -3, -1.5, -0.5, 0.5, 1.5, 3, 5, 7] pct_split = [-7, -5, -3, -1.0, 0, 1, 3, 5, 7] pct_split = [-0.5, 0.5] pctEncoder = FloatEncoder(pct_split) kPattersMap = {} for value in kPatters: kPattersMap[value] = True class InnerData(object): kValue: int ## sell_disbute = np.zeros(pctEncoder.mask()) ##卖方力量分布情况 buy_disbute = np.zeros(pctEncoder.mask()) #买方力量分布情况 pass dataSet = {} occurDayMap = {} allTrayDay = 1 for code in lists: # for code in lists: barList = sw.getSW2Daily(code, start, end) indicator = Indicator(40) preBar = None previousIsMatch = False previousPatternVaule = None allTrayDay = max(allTrayDay, len(barList)) for i in range(0, len(barList)): bar = barList[i] indicator.update_bar(bar) patternValue = KPattern.encode1KAgo1(indicator) todayIsMatch = False if not patternValue is None: todayIsMatch = kPattersMap.__contains__(patternValue) if todayIsMatch: dayKey = bar.datetime.year * 13 * 35 + bar.datetime.month * 13 + bar.datetime.day occurDayMap[dayKey] = True pass if previousIsMatch: innerData: InnerData = dataSet.get(previousIsMatch) if innerData is None: innerData = InnerData() innerData.kValue = previousIsMatch dataSet[previousPatternVaule] = innerData sell_pct = 100 * ((bar.high_price + bar.close_price) / 2 - preBar.close_price) / preBar.close_price buy_pct = 100 * ((bar.low_price + bar.close_price) / 2 - preBar.close_price) / preBar.close_price innerData.buy_disbute[pctEncoder.encode(buy_pct)] += 1 innerData.sell_disbute[pctEncoder.encode(sell_pct)] += 1 pass preBar = bar previousIsMatch = todayIsMatch previousPatternVaule = patternValue print(f"所有交易日中,有意义的k线形态出现占比:%.2f%%" % (100 * len(occurDayMap) / allTrayDay)) for kValue, dataItem in dataSet.items(): total_count1 = 0 total_count2 = 0 for cnt in dataItem.sell_disbute: total_count1 += cnt for cnt in dataItem.buy_disbute: total_count2 += cnt assert total_count1 == total_count2 assert total_count1 > 0 print(f"\n\nk:%6d, " % (kValue)) print(f" 卖方价格分布:") for encode in range(0, len(dataItem.sell_disbute)): occurtRate = 100 * dataItem.sell_disbute[encode] / total_count1 print(f" {pctEncoder.descriptEncdoe(encode)}:%.2f%%" % (occurtRate)) print(f" 买方价格分布:") for encode in range(0, len(dataItem.buy_disbute)): occurtRate = 100 * dataItem.buy_disbute[encode] / total_count1 print(f" {pctEncoder.descriptEncdoe(encode)}:%.2f%%" % (occurtRate)) pass
def compute_SW_KEncode_data(): from earnmi.data.SWImpl import SWImpl sw = SWImpl() lists = sw.getSW2List() start = datetime(2014, 5, 1) end = datetime(2020, 8, 17) dataSet = {} total_count = 0 occurKPattenDayMap = {} kBarListTotalDay = 0 for code in lists: #for code in lists: barList = sw.getSW2Daily(code, start, end) indicator = Indicator(40) preBar = None kBarListTotalDay = len(barList) for bar in barList: ##先识别形态 kEncodeValue = KPattern.encode1KAgo1(indicator) if kEncodeValue is None: indicator.update_bar(bar) preBar = bar continue total_count += 1 dataItem: CountItem = None if dataSet.__contains__(kEncodeValue): dataItem = dataSet[kEncodeValue] else: dataItem = CountItem() dataSet[kEncodeValue] = dataItem ##第二天的收益 pct = ((bar.high_price + bar.close_price) / 2 - preBar.close_price) / preBar.close_price ##收录当前形态 #dataItem.values.append(value) dataItem.count_total += 1 dataItem.pct_total += pct if pct > 0.000001: dataItem.count_earn += 1 dataItem.pct_earn += pct indicator.update_bar(bar) preBar = bar occurDayKey = preBar.datetime.year * 13 * 35 + preBar.datetime.month * 35 + preBar.datetime.day occurKPattenDayMap[occurDayKey] = True ##打印当前形态 occur_count = 0 print(f"总共分析{total_count}个形态,识别出{len(dataSet)}个形态,有意义的形态有:") max_succ_rate = 0 min_succ_rate = 100 ret_list = [] for key, dataItem in dataSet.items(): success_rate = 100 * dataItem.count_earn / dataItem.count_total if dataItem.count_total < 500: continue if abs(int(success_rate - 50)) < 10: continue ret_list.append(key) earn_pct = 100 * dataItem.pct_earn / dataItem.count_earn if success_rate < 50: earn_pct = 100 * (dataItem.pct_total - dataItem.pct_earn) / ( dataItem.count_total - dataItem.count_earn) avg_pct = 100 * dataItem.pct_total / dataItem.count_total occur_count += dataItem.count_total occur_rate = 100 * dataItem.count_total / total_count max_succ_rate = max(success_rate, max_succ_rate) min_succ_rate = min(success_rate, min_succ_rate) print( f"{key}: total={dataItem.count_total},suc=%.2f%%,occur_rate=%.2f%%,earn_pct:%.2f%%,avg_pct:%.2f%%)" % (success_rate, occur_rate, earn_pct, avg_pct)) total_occur_rate = 100 * occur_count / total_count total_occur_in_day_rate = 100 * len( occurKPattenDayMap) / kBarListTotalDay ##在所有交易日中,k线形态日出占比: print(f"总共:occur_rate=%.2f%%, min_succ_rate=%.2f%%, max_succ_rate=%.2f%%" f"\n所有交易日中,k线形态日出占比:%.2f%%" % (total_occur_rate, min_succ_rate, max_succ_rate, total_occur_in_day_rate)) print(f"{ret_list}")