Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
zengbin93
czsc
提交
e6bf002b
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 搜索 >>
提交
e6bf002b
编写于
4月 27, 2020
作者:
Z
zengbin93
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
0.3.1 优化当下走势划分
上级
0f865c54
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
49 addition
and
31 deletion
+49
-31
chan/analyze.py
chan/analyze.py
+49
-31
未找到文件。
chan/analyze.py
浏览文件 @
e6bf002b
...
...
@@ -6,7 +6,7 @@ import pandas as pd
from
.ta
import
macd
def
is_bei_chi
(
ka
,
zs1
,
zs2
,
direction
=
"down"
,
mode
=
"bi"
):
def
is_bei_chi
(
ka
,
zs1
,
zs2
,
direction
=
"down"
,
mode
=
"bi"
,
adjust
=
0.9
):
"""判断 zs1 对 zs2 是否有背驰
:param ka: KlineAnalyze
...
...
@@ -22,6 +22,9 @@ def is_bei_chi(ka, zs1, zs2, direction="down", mode="bi"):
zs 判断两个走势类型之间是否存在背驰
xd 判断两个线段之间是否存在背驰
bi 判断两笔之间是否存在背驰
:param adjust: float
调整 zs2 的力度,建议设置范围在 0.6 ~ 1.0 之间,默认设置为 0.9;
其作用是确保 zs1 相比于 zs2 的力度足够小。
:return:
"""
assert
zs1
[
0
]
>
zs2
[
0
],
"zs1 必须是最近的走势,用于比较;zs2 必须是较前的走势,被比较。"
...
...
@@ -34,7 +37,7 @@ def is_bei_chi(ka, zs1, zs2, direction="down", mode="bi"):
if
mode
==
'bi'
:
macd_sum1
=
sum
([
abs
(
x
)
for
x
in
k1
.
macd
])
macd_sum2
=
sum
([
abs
(
x
)
for
x
in
k2
.
macd
])
if
macd_sum1
<
macd_sum2
*
0.9
:
if
macd_sum1
<
macd_sum2
*
adjust
:
bc
=
True
elif
mode
==
'xd'
:
...
...
@@ -46,7 +49,7 @@ def is_bei_chi(ka, zs1, zs2, direction="down", mode="bi"):
macd_sum2
=
sum
([
abs
(
x
)
for
x
in
k2
.
macd
if
x
>
0
])
else
:
raise
ValueError
(
'direction value error'
)
if
macd_sum1
<
macd_sum2
*
0.9
:
if
macd_sum1
<
macd_sum2
*
adjust
:
bc
=
True
else
:
...
...
@@ -96,7 +99,7 @@ def is_macd_cross(ka, direction="up"):
class
KlineAnalyze
(
object
):
def
__init__
(
self
,
kline
,
bi_mode
=
"new"
,
xd_mode
=
"loose"
,
handle_last
=
Fals
e
):
def
__init__
(
self
,
kline
,
bi_mode
=
"new"
,
xd_mode
=
"loose"
,
handle_last
=
Tru
e
):
"""
:param kline: list of dict or pd.DataFrame
...
...
@@ -255,6 +258,7 @@ class KlineAnalyze(object):
min_k_num
=
5
else
:
raise
ValueError
self
.
min_k_num
=
min_k_num
kn
=
self
.
kline_new
# 符合标准的分型
...
...
@@ -303,14 +307,35 @@ class KlineAnalyze(object):
return
bi
def
__handle_last_bi
(
self
,
bi
):
"""处理最后一个笔标记"""
"""处理最后一个笔标记
最后一个笔标记后有两种情况:
1) 出现顶、底分型,使得最后一笔满足定义,加上对应的标记;
2) 没有出现使得最后一笔满足定义的顶底分型,耐心等待。
特别的,对应最后一个笔标记:最后一根K线的最高价大于顶,或最后一根K线的最低价大于底,则删除这个标记。
"""
last_bi
=
bi
[
-
1
]
seq
=
[
x
for
x
in
self
.
kline_new
if
x
[
'dt'
]
>=
last_bi
[
'dt'
]]
sor
=
sorted
(
deepcopy
(
seq
),
key
=
lambda
x
:
x
[
'close'
],
reverse
=
False
)
seq
=
[
x
for
x
in
self
.
fx
if
x
[
'dt'
]
>=
last_bi
[
'dt'
]]
sor
=
sorted
(
deepcopy
(
seq
),
key
=
lambda
x
:
x
[
'fx'
],
reverse
=
False
)
if
last_bi
[
'fx_mark'
]
==
'd'
and
sor
[
-
1
][
'fx_mark'
]
==
'g'
:
k
=
deepcopy
(
sor
[
-
1
])
elif
last_bi
[
'fx_mark'
]
==
'g'
and
sor
[
0
][
'fx_mark'
]
==
'd'
:
k
=
deepcopy
(
sor
[
0
])
else
:
k
=
None
if
k
:
k_num
=
[
x
for
x
in
self
.
kline_new
if
last_bi
[
'dt'
]
<=
x
[
'dt'
]
<=
k
[
'dt'
]]
if
len
(
k_num
)
>=
self
.
min_k_num
:
k
[
'bi'
]
=
k
[
'fx'
]
del
k
[
'fx'
]
bi
.
append
(
k
)
# 笔标记后出现新高或新低,则这个笔标记不成立
if
(
last_bi
[
'fx_mark'
]
==
'd'
and
sor
[
0
][
'
close
'
]
<
last_bi
[
'bi'
])
\
or
(
last_bi
[
'fx_mark'
]
==
'g'
and
sor
[
-
1
][
'
close
'
]
>
last_bi
[
'bi'
]):
if
(
last_bi
[
'fx_mark'
]
==
'd'
and
sor
[
0
][
'
fx
'
]
<
last_bi
[
'bi'
])
\
or
(
last_bi
[
'fx_mark'
]
==
'g'
and
sor
[
-
1
][
'
fx
'
]
>
last_bi
[
'bi'
]):
bi
.
pop
(
-
1
)
return
bi
...
...
@@ -388,31 +413,21 @@ class KlineAnalyze(object):
return
xd
def
__handle_last_xd
(
self
,
xd
):
"""处理最后一个线段标记"""
"""处理最后一个线段标记
最后一个线段后有两种情况:
1) 出现笔的顶、底背驰,对这种情况,在背驰出现的位置加上对应的线段标记;
2) 没有出现笔的顶、底背驰,不需要进行处理,耐心等待笔的顶、底背驰出现或者小转大出现。
特别的,对最后一个线段标记:最后一根K线的最高价大于顶,或最后一根K线的最低价大于底,则删除这个标记。
"""
last_xd
=
xd
[
-
1
]
bi_seq
=
[
x
for
x
in
self
.
bi
if
x
[
'dt'
]
>=
last_xd
[
'dt'
]]
bi_sor
=
sorted
(
deepcopy
(
bi_seq
),
key
=
lambda
x
:
x
[
'bi'
],
reverse
=
False
)
# 最后一个线段标记为底,且该标记后笔序列的最小值小于该线段标记,移动
if
last_xd
[
'fx_mark'
]
==
'd'
and
bi_sor
[
0
][
'bi'
]
<
last_xd
[
'xd'
]:
xd
.
pop
(
-
1
)
new
=
deepcopy
(
bi_sor
[
0
])
new
[
'xd'
]
=
new
[
'bi'
]
del
new
[
"bi"
]
xd
.
append
(
new
)
# 最后一个线段标记为顶,且该标记后笔序列的最大值大于该线段标记,移动
if
last_xd
[
'fx_mark'
]
==
'g'
and
bi_sor
[
-
1
][
'bi'
]
>
last_xd
[
'xd'
]:
xd
.
pop
(
-
1
)
new
=
deepcopy
(
bi_sor
[
-
1
])
new
[
'xd'
]
=
new
[
'bi'
]
del
new
[
"bi"
]
xd
.
append
(
new
)
# 最后一个线段标记为底,且与该标记后笔序列的最大值之间满足线段成立的条件,新增一个线段标记
if
last_xd
[
'fx_mark'
]
==
'd'
:
bi_m
=
[
x
for
x
in
self
.
bi
if
bi_sor
[
-
1
][
'dt'
]
>=
x
[
'dt'
]
>=
last_xd
[
'dt'
]]
# 线段条件:内部有三笔,且最后一笔新高背驰
if
len
(
bi_m
)
>
4
:
if
len
(
bi_m
)
>=
4
:
zs1
=
[
bi_m
[
-
2
][
'dt'
],
bi_m
[
-
1
][
'dt'
]]
zs2
=
[
bi_m
[
-
4
][
'dt'
],
bi_m
[
-
3
][
'dt'
]]
if
is_bei_chi
(
self
,
zs1
,
zs2
,
mode
=
'bi'
):
...
...
@@ -421,11 +436,9 @@ class KlineAnalyze(object):
del
new
[
"bi"
]
xd
.
append
(
new
)
# 最后一个线段标记为顶,且与该标记后笔序列的最小值之间满足线段成立的条件,新增一个线段标记
if
last_xd
[
'fx_mark'
]
==
'g'
:
bi_m
=
[
x
for
x
in
self
.
bi
if
bi_sor
[
0
][
'dt'
]
>=
x
[
'dt'
]
>=
last_xd
[
'dt'
]]
# 向下线段条件:内部有三笔,且最后一笔新低背驰
if
len
(
bi_m
)
>
4
:
if
len
(
bi_m
)
>=
4
:
zs1
=
[
bi_m
[
-
2
][
'dt'
],
bi_m
[
-
1
][
'dt'
]]
zs2
=
[
bi_m
[
-
4
][
'dt'
],
bi_m
[
-
3
][
'dt'
]]
if
is_bei_chi
(
self
,
zs1
,
zs2
,
mode
=
'bi'
):
...
...
@@ -433,6 +446,11 @@ class KlineAnalyze(object):
new
[
'xd'
]
=
new
[
'bi'
]
del
new
[
"bi"
]
xd
.
append
(
new
)
last_k
=
self
.
kline_new
[
-
1
]
if
(
xd
[
-
1
][
'fx_mark'
]
==
'd'
and
last_k
[
'low'
]
<
xd
[
-
1
][
'xd'
])
\
or
(
xd
[
-
1
][
'fx_mark'
]
==
'g'
and
last_k
[
'high'
]
>
xd
[
-
1
][
'xd'
]):
xd
.
pop
(
-
1
)
return
xd
def
_find_xd
(
self
):
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录