plotly是一款可以动态展示图型的可视化工具,但是网上的教程相对比较混乱,所以我写了一个针对金融分析的作图笔记。
其实plotly的封装cufflinks就能很好的解决金融图表问题,但是cufflinks对子图的支持十分不友好,最终还是放弃,决定还是使用纯plotly。
先给各位看一下效果
一、多子图基本步骤讲解
1、首先导入所需库
import pandas as pd import talib import plotly.graph_objs as go from plotly.subplots import make_subplots
2、然后画子图的画布
fig = make_subplots(rows=2, cols=1, shared_xaxes=True,row_heights=[0.8,0.2]) """ 1、其中row表示行、cols表示列 2、shared_xaxes=True 表示x轴共用,这样移动一个表适合另一个也会一起动,方便分析时序图标 3、row_heights=[0.8,0.2] 表示第一行站0.8,第二行占0.2 其他的自己举一反三即可 """
3、画布制作好了就可以增加数据了
首先是fig.add_trace 可以理解加一个线,加一条线就写一个fig.add_trace
go.Candlestic是k线图(蜡烛图)
fig.add_trace(go.Candlestick(x=df.index, open=df.Open, high=df.High, low=df.Low, close=df.Close,increasing_line_color='green', decreasing_line_color='red', name='日K线'), row=1, col=1)
4、灵魂来了,那么我总共分了两个,我想在k线上加三条辅助线,下面的子图不变,那么怎么让 辅助线道第一个子图而不是第二个子图去呢,这就是需要这里的row和col
row表示行,col表示列
row = 1,col = 1表示 这个k线是在第一行,第一列的图上
5、 知道了这个我们就可以添加其他线条去不同子图了。
# 加DC指标的三条线 每条都去第一行第一列的子图去
fig.add_trace(go.Scatter(x=df.index, y=df.t_up, marker_color='yellow', name='T', line=dict(width=1)), row=1, col=1)
fig.add_trace(go.Scatter(x=df.index, y=df.t_low, marker_color='blue', name='M', line=dict(width=1), fill='tonextx',
fillcolor='rgba(0,191,255,0.1)'), row=1, col=1)
fig.add_trace(go.Scatter(x=df.index, y=df.t_middle, marker_color='blue', name='L', line=dict(width=1)),
row=1, col=1)
# 加RSI的一条线 到第二行第一列的子图去
fig.add_trace(go.Scatter(x=df.index, y=df.RSI, marker_color='white', name='R', line=dict(width=1)), row=2, col=1)
6、但是线宽是如何设置的呢,毕竟辅助线不能和大老粗一样影响我们分析,改变线条的宽度的地方就在这里,marker_color是改变线条颜色, line=dict(width=1)为改变线条粗度,
line可以改变线条的样式,需要的可以自己百度学习
7、有些指标,比如布林、唐奇安等是一个区间,那么怎么填充呢
这里就是fill的所有属性,至于怎么才是正确填充,各位多试试吧,我暂时也没理解,但是试个三四次就能试验出来。
- tozerox 和 tozeroy 分别表示填充曲线到x=0和y=0的区域;
- tonextx 和 tonexty 分别表示填充曲线到x和y方向上的前一条曲线之间的区域,如果前面没有曲线,则效果同tozerox 和 tozeroy;
- toself 表示将曲线的各端点连接成闭合的形状;
- tonext 表示将2条曲线各端点均连接成闭合的形状,前提是一条曲线包围另一条曲线
填充后,你会发现你的属于不透明的,改策划给你透明就是修改fillcolor,里面的rgba里面的a属性就是修改透明度(我改成立0.1)
8、做完后可以fig.show()看一下,发现下面的子图多一个滑块,其实这个滑块可以全局看图,但是这里我们不需要,我们可以通过xaxis_rangeslider_visible=False属性去掉。
9、记得添加主题背景,不然你的图会是白色的
fig.update_layout(xaxis_rangeslider_visible=False) # 加一个黑色的主题背景 fig["layout"]["template"] = "plotly_dark" fig.show()
上面的完整代码(需要自己有数据,直接跑不通,直接复制粘贴的可以走了)
import pandas
import pandas as pd
import talib
import plotly.graph_objs as go
from plotly.subplots import make_subplots
# 写入你自己的文件
# filepath = r'C:Users17671Desktophistoy123.csv'
pds = pd.read_csv(filepath, encoding='gbk')
df = pds[0:1000]
df['RSI'] = talib.RSI(df['Close'], timeperiod=28)
a = pandas.DataFrame()
b = pandas.DataFrame()
df.fillna(0)
for i in range(56):
a[f's{i}_high'] = df['High'].shift(i)
b[f's{i}_low'] = df['Low'].shift(i)
a.fillna(0)
b.fillna(0)
# 唐奇安上阻力线 - 由过去N天的当日最高价的最大值形成。
df['t_up'] = a.max(axis=1)
# #
# 唐奇安下支撑线 - 由过去N天的当日最低价的最小值形成。
#
df['t_low'] = b.min(axis=1)
# 中心线 - (上线 + 下线)/ 2
df['t_middle'] = (df['t_up'] + df['t_low']) / 2
fig = make_subplots(rows=2, cols=1, shared_xaxes=True,row_heights=[0.8,0.2])
fig = go.FigureWidget(fig)
fig.add_trace(go.Candlestick(x=df.index, open=df.Open, high=df.High, low=df.Low, close=df.Close,
increasing_line_color='green', decreasing_line_color='red', name='日K线'), row=1, col=1)
# 加唐奇安通道
fig.add_trace(go.Scatter(x=df.index, y=df.t_up, marker_color='yellow', name='T', line=dict(width=1)), row=1, col=1)
fig.add_trace(go.Scatter(x=df.index, y=df.t_low, marker_color='blue', name='M', line=dict(width=1), fill='tonextx',
fillcolor='rgba(0,191,255,0.1)'), row=1, col=1)
fig.add_trace(go.Scatter(x=df.index, y=df.t_middle, marker_color='blue', name='L', line=dict(width=1)),
row=1, col=1)
fig.add_trace(go.Scatter(x=df.index, y=df.RSI, marker_color='white', name='R', line=dict(width=1)), row=2, col=1)
fig.update_layout(xaxis_rangeslider_visible=True, xaxis_rangeslider_thickness = 0.04)
fig["layout"]["template"] = "plotly_dark"
fig.show()
还有一个需求我目前没有想到,就是如何实时更新
我的想法是通过离线模式,生成html文件,然后通过定时任务刷新这个文件,实时更新这个文件,如果有更好的方法还麻烦告知。



