栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

金融分析:图形可视化plotly绘图思路—多子图教程

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

金融分析:图形可视化plotly绘图思路—多子图教程

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文件,然后通过定时任务刷新这个文件,实时更新这个文件,如果有更好的方法还麻烦告知。

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/942368.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号