Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
zengbin93
czsc
提交
0ee1592d
C
czsc
项目概览
zengbin93
/
czsc
通知
23
Star
2
Fork
1
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
4
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
C
czsc
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
4
Issue
4
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
0ee1592d
编写于
8月 30, 2020
作者:
Z
zengbin93
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
0.5.3 优化线段识别
上级
ef640447
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
60 addition
and
39 deletion
+60
-39
czsc/analyze.py
czsc/analyze.py
+19
-27
test/test_analyze.py
test/test_analyze.py
+41
-12
未找到文件。
czsc/analyze.py
浏览文件 @
0ee1592d
...
...
@@ -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
:
...
...
test/test_analyze.py
浏览文件 @
0ee1592d
...
...
@@ -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
=
Tru
e
)
ka
=
KlineAnalyze
(
kline1
,
name
=
"日线"
,
max_raw_len
=
2000
,
verbose
=
Fals
e
)
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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录