Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
zengbin93
czsc
提交
1e531711
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 搜索 >>
提交
1e531711
编写于
7月 12, 2020
作者:
Z
zengbin93
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
0.4.2: 优化线段处理方法
上级
744d4eb7
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
35 addition
and
50 deletion
+35
-50
czsc/analyze.py
czsc/analyze.py
+35
-50
未找到文件。
czsc/analyze.py
浏览文件 @
1e531711
...
...
@@ -187,9 +187,9 @@ def create_df(ka, ma_params=(5, 20, 120, 250), use_macd=True, use_boll=True):
class
KlineAnalyze
(
object
):
def
__init__
(
self
,
kline
,
name
=
"本级别"
,
bi_mode
=
"new"
,
xd_mode
=
"strict"
,
handle_last
=
True
,
debug
=
False
):
def
__init__
(
self
,
kline
,
name
=
"本级别"
,
bi_mode
=
"new"
,
xd_mode
=
"strict"
,
min_bi_gap
=
0.001
,
handle_last
=
True
,
debug
=
False
):
"""
:param kline: list of dict or pd.DataFrame
example kline:
kline = [
...
...
@@ -206,6 +206,8 @@ class KlineAnalyze(object):
:param xd_mode: str
线段识别控制参数,默认为 loose,在这种模式下,只要线段标记内有三笔就满足会识别;另外一个可选值是 strict,
在 strict 模式下,对于三笔形成的线段,要求其后的一笔不跌破或升破线段最后一笔的起始位置。
:param min_bi_gap: float
笔内部缺口的最小百分比,默认值 0.001
:param handle_last: bool
是否使用默认的 handle_last 方法,默认值为 True
"""
...
...
@@ -215,6 +217,7 @@ class KlineAnalyze(object):
self
.
bi_mode
=
bi_mode
self
.
xd_mode
=
xd_mode
self
.
handle_last
=
handle_last
self
.
min_bi_gap
=
min_bi_gap
self
.
debug
=
debug
self
.
kline
=
self
.
_preprocess
(
kline
)
self
.
symbol
=
self
.
kline
[
0
][
'symbol'
]
...
...
@@ -419,22 +422,6 @@ class KlineAnalyze(object):
raise
ValueError
self
.
min_k_num
=
min_k_num
kn
=
self
.
kline_new
# fx_p = [] # 存储潜在笔标记
# fx_p.extend(self.__extract_potential(mode='fx', fx_mark='d'))
# fx_p.extend(self.__extract_potential(mode='fx', fx_mark='g'))
#
# # 加入满足笔条件的连续两个分型
# fx = self.fx
# for i in range(len(fx) - 1):
# fx1 = fx[i]
# fx2 = fx[i + 1]
# k_num = [x for x in kn if fx1['dt'] <= x['dt'] <= fx2['dt']]
# if len(k_num) >= min_k_num:
# fx_p.append(fx1)
# fx_p.append(fx2)
#
# fx_p = sorted(fx_p, key=lambda x: x['dt'], reverse=False)
fx_p
=
self
.
fx
# 确认哪些分型可以构成笔
...
...
@@ -463,12 +450,12 @@ class KlineAnalyze(object):
for
pair
in
k_pair
:
kr
,
kl
=
pair
# 向下缺口
if
kr
[
'low'
]
>
kl
[
'high'
]:
if
kr
[
'low'
]
>
kl
[
'high'
]
*
(
1
+
self
.
min_bi_gap
)
:
has_gap
=
True
break
# 向上缺口
if
kr
[
'high'
]
<
kl
[
'low'
]:
if
kr
[
'high'
]
<
kl
[
'low'
]
*
(
1
-
self
.
min_bi_gap
)
:
has_gap
=
True
break
...
...
@@ -483,17 +470,6 @@ class KlineAnalyze(object):
if
(
k0
[
'fx_mark'
]
==
'g'
and
k
[
'bi'
]
<
k0
[
'bi'
]
and
k
[
'bi'
]
==
min_low
)
or
\
(
k0
[
'fx_mark'
]
==
'd'
and
k
[
'bi'
]
>
k0
[
'bi'
]
and
k
[
'bi'
]
==
max_high
):
bi
.
append
(
k
)
# # 确保相邻两个顶底之间顶大于底
# if (k0['fx_mark'] == 'g' and k['bi'] >= k0['bi']) or \
# (k0['fx_mark'] == 'd' and k['bi'] <= k0['bi']):
# bi.pop(-1)
# continue
#
# # 一笔的顶底分型之间至少包含5根K线
# k_num = [x for x in kn if k0['dt'] <= x['dt'] <= k['dt']]
# if len(k_num) >= min_k_num:
# bi.append(k)
return
bi
def
__handle_last_bi
(
self
,
bi
):
...
...
@@ -559,25 +535,34 @@ class KlineAnalyze(object):
bi_m
=
[
x
for
x
in
self
.
bi
if
k0
[
'dt'
]
<=
x
[
'dt'
]
<=
k
[
'dt'
]]
bi_r
=
[
x
for
x
in
self
.
bi
if
x
[
'dt'
]
>=
k
[
'dt'
]]
# 一线段内部至少三笔
if
len
(
bi_m
)
>=
4
:
# 两个连续线段标记之间只有三笔的处理,这里区分 loose 和 strict 两种模式
if
len
(
bi_m
)
==
4
:
if
self
.
xd_mode
==
'loose'
:
if
(
k
[
'fx_mark'
]
==
"g"
and
bi_m
[
-
1
][
'bi'
]
>
bi_m
[
-
3
][
'bi'
])
\
or
(
k
[
'fx_mark'
]
==
"d"
and
bi_m
[
-
1
][
'bi'
]
<
bi_m
[
-
3
][
'bi'
]):
xd
.
append
(
k
)
elif
self
.
xd_mode
==
'strict'
:
if
len
(
bi_r
)
<=
1
:
continue
lp2
=
bi_m
[
-
2
]
rp2
=
bi_r
[
1
]
if
(
k
[
'fx_mark'
]
==
"g"
and
lp2
[
'bi'
]
<
rp2
[
'bi'
]
and
bi_m
[
-
1
][
'bi'
]
>
bi_m
[
-
3
][
'bi'
])
\
or
(
k
[
'fx_mark'
]
==
"d"
and
lp2
[
'bi'
]
>
rp2
[
'bi'
]
and
bi_m
[
-
1
][
'bi'
]
<
bi_m
[
-
3
][
'bi'
]):
xd
.
append
(
k
)
else
:
raise
ValueError
(
"xd_mode value error"
)
else
:
if
len
(
bi_m
)
<
4
or
len
(
bi_r
)
<
4
:
continue
# 线段的顶必然大于相邻的两个顶;线段的底必然小于相邻的两个底
assert
k
[
'fx_mark'
]
==
bi_m
[
-
3
][
'fx_mark'
]
==
bi_r
[
2
][
'fx_mark'
]
if
k
[
'fx_mark'
]
==
"d"
and
not
(
bi_m
[
-
3
][
'bi'
]
>
k
[
'xd'
]
<
bi_r
[
2
][
'bi'
]):
print
(
"不满足线段的底必然小于相邻的两个底"
)
print
(
bi_m
[
-
3
],
k
,
bi_r
[
2
])
continue
if
k
[
'fx_mark'
]
==
"g"
and
not
(
bi_m
[
-
3
][
'bi'
]
<
k
[
'xd'
]
>
bi_r
[
2
][
'bi'
]):
print
(
"不满足线段的顶必然大于相邻的两个顶"
)
print
(
bi_m
[
-
3
],
k
,
bi_r
[
2
])
continue
# 判断线段标记是否有效
left_last
=
bi_m
[
-
3
]
right_first
=
bi_r
[
1
]
assert
left_last
[
'fx_mark'
]
!=
right_first
[
'fx_mark'
]
if
k
[
'fx_mark'
]
==
'd'
:
max_g
=
max
([
x
[
'bi'
]
for
x
in
bi_r
[:
8
]
if
x
[
'fx_mark'
]
==
'g'
])
if
max_g
>
right_first
[
'bi'
]
and
max_g
>
left_last
[
'bi'
]:
xd
.
append
(
k
)
if
k
[
'fx_mark'
]
==
'g'
:
min_d
=
min
([
x
[
'bi'
]
for
x
in
bi_r
[:
8
]
if
x
[
'fx_mark'
]
==
'd'
])
if
min_d
<
right_first
[
'bi'
]
and
min_d
<
left_last
[
'bi'
]:
xd
.
append
(
k
)
return
xd
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录