From 0ee1592db682d6e9c920f3347f9d36cdbb7c4fd1 Mon Sep 17 00:00:00 2001 From: zengbin93 Date: Sun, 30 Aug 2020 19:55:18 +0800 Subject: [PATCH] =?UTF-8?q?0.5.3=20=E4=BC=98=E5=8C=96=E7=BA=BF=E6=AE=B5?= =?UTF-8?q?=E8=AF=86=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- czsc/analyze.py | 46 ++++++++++++++++---------------------- test/test_analyze.py | 53 ++++++++++++++++++++++++++++++++++---------- 2 files changed, 60 insertions(+), 39 deletions(-) diff --git a/czsc/analyze.py b/czsc/analyze.py index 8bf32de..e4e48b8 100644 --- a/czsc/analyze.py +++ b/czsc/analyze.py @@ -199,17 +199,20 @@ def is_valid_xd(bi_seq1, bi_seq2, bi_seq3): return False # 第一种情况(向下线段) - if bi_seq2[0]['fx_mark'] == 'd' and bi_seq2[1]['bi'] >= standard_bi_seq1[-1]['low']: + # if bi_seq2[0]['fx_mark'] == 'd' and bi_seq2[1]['bi'] >= standard_bi_seq1[-1]['low']: + if bi_seq2[0]['fx_mark'] == 'd' and bi_seq2[1]['bi'] >= min([x['low'] for x in standard_bi_seq1]): if bi_seq2[-1]['bi'] < bi_seq2[1]['bi']: return False # 第一种情况(向上线段) - if bi_seq2[0]['fx_mark'] == 'g' and bi_seq2[1]['bi'] <= standard_bi_seq1[-1]['high']: + # if bi_seq2[0]['fx_mark'] == 'g' and bi_seq2[1]['bi'] <= standard_bi_seq1[-1]['high']: + if bi_seq2[0]['fx_mark'] == 'g' and bi_seq2[1]['bi'] <= max([x['high'] for x in standard_bi_seq1]): if bi_seq2[-1]['bi'] > bi_seq2[1]['bi']: return False # 第二种情况(向下线段) - if bi_seq2[0]['fx_mark'] == 'd' and bi_seq2[1]['bi'] < standard_bi_seq1[-1]['low']: + # if bi_seq2[0]['fx_mark'] == 'd' and bi_seq2[1]['bi'] < standard_bi_seq1[-1]['low']: + if bi_seq2[0]['fx_mark'] == 'd' and bi_seq2[1]['bi'] < min([x['low'] for x in standard_bi_seq1]): bi_seq2.extend(bi_seq3[1:]) standard_bi_seq2 = make_standard_seq(bi_seq2) if len(standard_bi_seq2) < 3: @@ -221,15 +224,16 @@ def is_valid_xd(bi_seq1, bi_seq2, bi_seq3): if bi1['high'] < bi2['high'] > bi3['high']: standard_bi_seq2_g.append(bi2) - # 如果特征序列顶分型最小值小于底分型,返回 False - if min([x['low'] for x in standard_bi_seq2[i-1: i+2]]) < bi_seq2[0]['bi']: + # 特征序列顶分型完全在底分型区间,返回 False + if min(bi1['low'], bi2['low'], bi3['low']) < bi_seq2[0]['bi']: return False if len(standard_bi_seq2_g) == 0: return False # 第二种情况(向上线段) - if bi_seq2[0]['fx_mark'] == 'g' and bi_seq2[1]['bi'] > standard_bi_seq1[-1]['high']: + # if bi_seq2[0]['fx_mark'] == 'g' and bi_seq2[1]['bi'] > standard_bi_seq1[-1]['high']: + if bi_seq2[0]['fx_mark'] == 'g' and bi_seq2[1]['bi'] > max([x['high'] for x in standard_bi_seq1]): bi_seq2.extend(bi_seq3[1:]) standard_bi_seq2 = make_standard_seq(bi_seq2) if len(standard_bi_seq2) < 3: @@ -241,9 +245,10 @@ def is_valid_xd(bi_seq1, bi_seq2, bi_seq3): if bi1['low'] > bi2['low'] < bi3['low']: standard_bi_seq2_d.append(bi2) - # 如果特征序列的底分型最大值大于顶分型,返回 False - if max([x['high'] for x in standard_bi_seq2[i-1: i+2]]) > bi_seq2[0]['bi']: + # 特征序列的底分型在顶分型区间,返回 False + if max(bi1['high'], bi2['high'], bi3['high']) > bi_seq2[0]['bi']: return False + if len(standard_bi_seq2_d) == 0: return False return True @@ -273,23 +278,6 @@ def get_potential_xd(bi_points): return xd_p -def handle_last_xd(bi_points): - """处理当下段 - - 当下段是指当下进行中的无法确认完成的线段,对于操作而言,必须在当下对其进行分析,判断是延续还是转折。 - - :param bi_points: list of dict - 最近一个线段标记后面的全部笔标记 - :return: list of dict - 返回判断结果 - """ - # step 1. 获取潜在分段标记点 - xd_p = get_potential_xd(bi_points) - if len(xd_p) == 0: - if bi_points[0]['fx_mark'] != bi_points[-1]['fx_mark']: - bi_points.pop(-1) - - class KlineAnalyze: def __init__(self, kline, name="本级别", bi_mode="old", max_raw_len=10000, ma_params=(5, 20, 120), verbose=False): """ @@ -615,13 +603,17 @@ class KlineAnalyze: if is_valid_xd(bi_seq1, bi_seq2, bi_seq3): keep_xd_index.append(i) - # 处理最后一个确定的线段标记 + # 处理最近一个确定的线段标记 bi_seq1 = [x for x in self.bi_list if self.xd_list[-2]['dt'] >= x['dt'] >= self.xd_list[-3]['dt']] bi_seq2 = [x for x in self.bi_list if self.xd_list[-1]['dt'] >= x['dt'] >= self.xd_list[-2]['dt']] bi_seq3 = [x for x in self.bi_list if x['dt'] >= self.xd_list[-1]['dt']] if not (len(bi_seq1) == 0 or len(bi_seq2) == 0 or len(bi_seq3) == 0): if is_valid_xd(bi_seq1, bi_seq2, bi_seq3): - keep_xd_index.append(len(self.xd_list)-2) + keep_xd_index.append(len(self.xd_list) - 2) + + # 处理最近一个未确定的线段标记 + if len(bi_seq3) >= 4: + keep_xd_index.append(len(self.xd_list) - 1) new_xd_list = [] for j in keep_xd_index: diff --git a/test/test_analyze.py b/test/test_analyze.py index c660a8d..65b94f2 100644 --- a/test/test_analyze.py +++ b/test/test_analyze.py @@ -12,14 +12,14 @@ from czsc.analyze import KlineAnalyze, find_zs, is_valid_xd, make_standard_seq, warnings.warn("czsc version is {}".format(czsc.__version__)) -# cur_path = os.path.split(os.path.realpath(__file__))[0] -cur_path = "./test" +cur_path = os.path.split(os.path.realpath(__file__))[0] +# cur_path = "./test" file_kline = os.path.join(cur_path, "data/000001.SH_D.csv") kline = pd.read_csv(file_kline, encoding="utf-8") kline.loc[:, "dt"] = pd.to_datetime(kline.dt) kline1 = kline.iloc[:2000] kline2 = kline.iloc[2000:] -ka = KlineAnalyze(kline1, name="日线", max_raw_len=2000, verbose=True) +ka = KlineAnalyze(kline1, name="日线", max_raw_len=2000, verbose=False) def test_ka_update(): ka1 = KlineAnalyze(kline, name="日线", max_raw_len=5000, verbose=False) @@ -289,17 +289,46 @@ def test_is_valid_xd(): def test_handle_last_xd(): - # 0个需要确认的线段标记 + # 只有一个线段标记的例子;300803.XSHE - 30min - 20200830 bi_points = [ - {"dt": 1, "bi": 10, "fx_mark": "d"}, - {"dt": 2, "bi": 11, "fx_mark": "g"}, - {"dt": 3, "bi": 10.4, "fx_mark": "d"}, - {"dt": 4, "bi": 11.1, "fx_mark": "g"}, - {"dt": 5, "bi": 10.6, "fx_mark": "d"}, - {"dt": 6, "bi": 11.2, "fx_mark": "g"}, - {"dt": 7, "bi": 11, "fx_mark": "d"}, + {'dt': 0, 'fx_mark': 'g', 'bi': 73.66}, + {'dt': 1, 'fx_mark': 'd', 'bi': 66.67}, + {'dt': 2, 'fx_mark': 'g', 'bi': 68.93}, + {'dt': 3, 'fx_mark': 'd', 'bi': 56.5}, + {'dt': 4, 'fx_mark': 'g', 'bi': 59.55}, + {'dt': 5, 'fx_mark': 'd', 'bi': 50.11}, + {'dt': 6, 'fx_mark': 'g', 'bi': 55.69}, + {'dt': 7, 'fx_mark': 'd', 'bi': 51.5}, + {'dt': 8, 'fx_mark': 'g', 'bi': 52.96}, + {'dt': 9, 'fx_mark': 'd', 'bi': 47.7}, + {'dt': 10, 'fx_mark': 'g', 'bi': 52.94}, + {'dt': 11, 'fx_mark': 'd', 'bi': 49.21}, + {'dt': 12, 'fx_mark': 'g', 'bi': 51.29}, + {'dt': 13, 'fx_mark': 'd', 'bi': 49.07}, + {'dt': 14, 'fx_mark': 'g', 'bi': 55.21}, + {'dt': 15, 'fx_mark': 'd', 'bi': 46.01} ] - pass + # 有两个线段标记的例子;300803.XSHE - 5min - 20200830 + bi_points = [ + {'dt': 0, 'fx_mark': 'd', 'bi': 49.79}, + {'dt': 1, 'fx_mark': 'g', 'bi': 51.07}, + {'dt': 2, 'fx_mark': 'd', 'bi': 49.9}, + {'dt': 3, 'fx_mark': 'g', 'bi': 51.6}, + {'dt': 4, 'fx_mark': 'd', 'bi': 50.64}, + {'dt': 5, 'fx_mark': 'g', 'bi': 55.21}, + {'dt': 6, 'fx_mark': 'd', 'bi': 53.18}, + {'dt': 7, 'fx_mark': 'g', 'bi': 54.05}, + {'dt': 8, 'fx_mark': 'd', 'bi': 51.7}, + {'dt': 9, 'fx_mark': 'g', 'bi': 52.3}, + {'dt': 10, 'fx_mark': 'd', 'bi': 51.0}, + {'dt': 11, 'fx_mark': 'g', 'bi': 51.99}, + {'dt': 12, 'fx_mark': 'd', 'bi': 48.02}, + {'dt': 13, 'fx_mark': 'g', 'bi': 50.97}, + {'dt': 14, 'fx_mark': 'd', 'bi': 47.72}, + {'dt': 15, 'fx_mark': 'g', 'bi': 53.89} + ] + + -- GitLab