提交 0ee1592d 编写于 作者: Z zengbin93

0.5.3 优化线段识别

上级 ef640447
......@@ -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:
......
......@@ -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}
]
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册