摘要:使用Python绘制价格反转图
我与反转图
我第一次了解到反转图,是在交易书籍上看到的。 当时就被它直观的视觉方式惊呆了,感觉它在揭示趋势的延续和趋势的反转方面的能力,堪称一绝。
可惜,国内的交易软件都不能展示反转图。 当时,我还没有学习过Python,甚至一点都不了解Python。 于是只能在有限的软件里使劲折腾,费了极大的精力和功夫, 也不过弄了个凑乎能用的东西出来,距离真正的反转图还是差得太远。
再后来,开始做量化交易,了解到了一款国外的软件,里面有自带的新价线,对反转图有了大概90%的还原度,也是勉强能用了。
为此,我不惜注册了相关的账号。但用了之后发现很多问题难以解决。比如其指标的编写方式,直到现在我依旧不喜欢。其次,因为是外国的软件,用的人很少, 在网络上几乎搜索不到任何有用的资料。所以,如果你有编写一个稍微复杂些的指标,如果在某一步卡住了, 那么很抱歉,你可能会不得不停止了。当然,这些都不算什么,总归是可以克服的。 最后让我不得不放弃它的原因是,频繁掉线。
是的,频繁掉线!不论是白天还是夜盘,平均每隔一分钟就掉线一次。联系了客服,反复检查, 还远程操作了我的电脑,也没能解决问题。同样的账号,登录其他的交易软件都没有问题, 可以排除是期货公司的原因。
两个星期后,我终于还是放弃了。因为其并不支持云端条件单,因此如果掉线,所有的下单指令都会失效。 这简直太可怕了!
举个例子:比如,我交易10手沥青,可能前10秒,还盈利5000,但是因为掉线, 导致平仓慢了那么几秒,就从浮盈5000变成了浮亏5000。这损失难道软件公司会赔我吗?
你叫我怎么用?怎么能用?又怎么敢用? 所以,我最终还是和该软件说了再见!
后来,因为接触到量化交易,于是学习了Python,从此打开了量化交易的另一扇门,进入了新的世界!
以上,是为缘起。
不多言,我们一起来看下反转图的魅力吧!
-----------------------------------------------------------------
首先,导入必要的模块!
# 导入K线和指标绘制模块
from MyKlines import *
# 系统模块,用于自动打开文件
import os
然后,我们获取股票的数据。
之前的文章有讲过怎么获取免费的股票数据,这里就不再重复了。 这里,我们选择凯莱英来作为示例。
data = get_data_juejin(symbol="002821",
start="2023-07-01",
end=now,
frequency="1d",
fields="symbol,frequency,open,close,high,low,volume,amount")
获取到的数据如下所示
date symbol frequency open close high low volume \
0 2023-07-03 002821 1d 117.70 119.18 119.37 117.30 2611887
1 2023-07-04 002821 1d 118.50 121.99 121.99 117.71 3684893
2 2023-07-05 002821 1d 122.01 121.69 122.41 120.12 2531778
3 2023-07-06 002821 1d 121.19 119.60 121.21 118.01 3016366
4 2023-07-07 002821 1d 119.01 119.13 119.90 118.30 1628204
.. ... ... ... ... ... ... ... ...
105 2023-12-05 002821 1d 124.55 123.00 127.80 122.85 6095569
106 2023-12-06 002821 1d 123.00 125.14 127.38 122.99 4978861
107 2023-12-07 002821 1d 124.51 122.71 124.99 121.99 4151701
108 2023-12-08 002821 1d 122.60 121.03 122.60 120.07 5709433
109 2023-12-11 002821 1d 120.03 121.70 122.10 118.88 4289756
下面就是绘制反转图了。
这里,我们用到kbreak()函数,相关的参数如下所示:
- 参数:
- ax:绘图的区域
- data:pandas数据:包括时间和价格
- n=3, 反转的柱体
- width:float格式,柱体的宽度
- edgecolor_up='red', 上涨的边框颜色
- facecolor_up='white', 上涨的填充颜色
- edgecolor_down='green', 下跌的边框颜色
- facecolor_down='green', 下跌的填充颜色
- count_show=False, 是否显示趋势计数
- grid_show=True, 是否显示网格
# 设置画布
fig = plt.figure(figsize=(12, 9), dpi=300)
# 添加绘图区域
ax = fig.add_subplot(111)
先来个三线反转图
默认的反转图,上涨趋势是红色空心的,下跌趋势是绿色实心的。
# 画反转图
kbreak(ax, data, grid_show=False)
# 调整图片的边缘空白大小,取值0-1.
# 注意:right > left, top > bottom
plt.subplots_adjust(left=0.1, right=0.9, top=0.9, bottom=0.1)
也可以改成都是实心的柱体,柱体的颜色都是可以随意调整的,改为自己喜欢的颜色即可。
# 画图前清除绘图区域
plt.cla()
kbreak(
ax, #绘图的区域
data, # 绘图数据,包括时间和价格
n=3, #反转的柱体
width=0.5, # 柱体的宽度
edgecolor_up='red', # 上涨的边框颜色
facecolor_up='red', # 上涨的填充颜色
edgecolor_down='green', # 下跌的边框颜色
facecolor_down='green', # 下跌的填充颜色
count_show=False, # 是否显示趋势计数
draw_start=0, # 为了避免缺失值,从哪一项开始绘制
grid_show=False, # 是否显示网格
)
# 调整图片的边缘空白大小,取值0-1.
# 注意:right > left, top > bottom
plt.subplots_adjust(left=0.1, right=0.9, top=0.9, bottom=0.1)
为了更好地观察和对比价格,我们可以为反转图添加网格。
# 画图前清除绘图区域
plt.cla()
kbreak(
ax, #绘图的区域
data, # 绘图数据,包括时间和价格
n=3, #反转的柱体
facecolor_up='red', # 上涨的填充颜色
grid_show=True, # 是否显示网格
)
# 调整图片的边缘空白大小,取值0-1.
# 注意:right > left, top > bottom
plt.subplots_adjust(left=0.1, right=0.9, top=0.9, bottom=0.1)
为了更明显地展示趋势的延续情况,可以在柱体上添加趋势的计数。
# 画图前清除绘图区域
plt.cla()
kbreak(
ax, #绘图的区域
data, # 绘图数据,包括时间和价格
n=3, #反转的柱体
facecolor_up='red', # 上涨的填充颜色
count_show=True, # 是否显示趋势计数
grid_show=True, # 是否显示网格
)
# 调整图片的边缘空白大小,取值0-1.
# 注意:right > left, top > bottom
plt.subplots_adjust(left=0.1, right=0.9, top=0.9, bottom=0.1)
反转图的特点,就是可以过滤掉震荡,把握住每一次的趋势。
如果不反转就不清仓,那么就绝不会过早止盈,从而提高盈亏比,吃掉趋势的绝大部分利润。 利用反转图,我们可以清楚地看到趋势的发展情况。 趋势是刚开始?还是已经延续了一段时间?趋势反转了吗? 关于趋势的问题,没有必反转图更好的可视化工具了!
我是真的太喜欢反转图了!
我们还可以调大反转图的反转参数,过滤掉一些较小的震荡。
比如,从三线反转,调整为六线反转,我们来看一下凯莱英的六线反转图:
data2 = get_data(code="sz.002821", start_date="2020-01-01", end_date="2021-05-29", frequency="d", adjust='2')
# 画图前清除绘图区域
plt.cla()
kbreak(
ax, #绘图的区域
data2, # 绘图数据,包括时间和价格
n=6, #反转的柱体
facecolor_up='red', # 上涨的填充颜色
count_show=True, # 是否显示趋势计数
grid_show=False, # 是否显示网格
)
# 调整图片的边缘空白大小,取值0-1.
# 注意:right > left, top > bottom
plt.subplots_adjust(left=0.1, right=0.9, top=0.9, bottom=0.1)
日线的数据+六线反转,适用于揭示长期的趋势。
就凯莱英的六线反转图而言,趋势十分明显!
当然,我们也是可以把反转图用于更小的周期。
比如60分钟、15分钟,乃至tick数据都没有任何问题。
还是凯莱英,我们使用60分钟数据,看下它的近期走势如何。
data3 = get_data(code="sz.002821", start_date="2021-01-01", end_date="2021-05-29", frequency="60", adjust='2')
# 画图前清除绘图区域
plt.cla()
kbreak(
ax, #绘图的区域
data3, # 绘图数据,包括时间和价格
n=3, #反转的柱体
facecolor_up='red', # 上涨的填充颜色
count_show=True, # 是否显示趋势计数
grid_show=False, # 是否显示网格
)
# 调整图片的边缘空白大小,取值0-1.
# 注意:right > left, top > bottom
plt.subplots_adjust(left=0.1, right=0.9, top=0.9, bottom=0.1)
把各个周期和不同反转柱体的反转图画到一起
为了更好地比较,我们可以把日线和分钟数据的反转图,画到一起。
# 画图前清除画布
plt.clf()
ax1 = fig.add_subplot(211)
ax2 = fig.add_subplot(212)
kbreak(
ax1, #绘图的区域
data, # 绘图数据,包括时间和价格
n=3, #反转的柱体
facecolor_up='r', # 上涨的填充颜色
grid_show=False, # 是否显示网格
)
ax1.set_title('凯莱英三线反转图(日线) 2020-09-01至2021-05-29')
kbreak(
ax2, #绘图的区域
data, # 绘图数据,包括时间和价格
n=3, #反转的柱体
facecolor_up='r', # 上涨的填充颜色
grid_show=False, # 是否显示网格
)
ax2.set_title('凯莱英三线反转图(60分钟) 2021-01-01至2021-05-29')
# 调整图片的边缘空白大小,取值0-1.
# 注意:right > left, top > bottom
plt.subplots_adjust(left=0.1, right=0.9, top=0.9, bottom=0.1)
顺便提一下,我发现其他颜色和风格的反转图,也是很酷!
# 画图前清除画布
plt.clf()
ax1 = fig.add_subplot(221)
ax2 = fig.add_subplot(222)
ax3 = fig.add_subplot(223)
ax4 = fig.add_subplot(224)
kbreak(
ax1, #绘图的区域
data, # 绘图数据,包括时间和价格
n=3, #反转的柱体
draw_start=60,
edgecolor_up='r', # 上涨的边框颜色
facecolor_up='w', # 上涨的填充颜色
edgecolor_down='g', # 下跌的边框颜色
facecolor_down='g', # 下跌的填充颜色
grid_show=False, # 是否显示网格
)
ax1.set_title('凯莱英三线反转图(日线) 2020-09-01至2021-05-29')
kbreak(
ax2, #绘图的区域
data, # 绘图数据,包括时间和价格
n=3, #反转的柱体
draw_start=60,
edgecolor_up='g', # 上涨的边框颜色
facecolor_up='g', # 上涨的填充颜色
edgecolor_down='r', # 下跌的边框颜色
facecolor_down='r', # 下跌的填充颜色
grid_show=False, # 是否显示网格
)
kbreak(
ax3, #绘图的区域
data, # 绘图数据,包括时间和价格
n=3, #反转的柱体
draw_start=60,
edgecolor_up='k', # 上涨的边框颜色
facecolor_up='w', # 上涨的填充颜色
edgecolor_down='k', # 下跌的边框颜色
facecolor_down='k', # 下跌的填充颜色
grid_show=False, # 是否显示网格
)
kbreak(
ax4, #绘图的区域
data, # 绘图数据,包括时间和价格
n=3, #反转的柱体
draw_start=60,
edgecolor_up='r', # 上涨的边框颜色
facecolor_up='r', # 上涨的填充颜色
edgecolor_down='b', # 下跌的边框颜色
facecolor_down='b', # 下跌的填充颜色
grid_show=False, # 是否显示网格
)
# 调整图片的边缘空白大小,取值0-1.
# 注意:right > left, top > bottom
plt.subplots_adjust(left=0.1, right=0.9, top=0.9, bottom=0.1)