可视化神器Plotly绘制金融图表

公众号:尤而小屋
作者:Peter
编辑:Peter

大家好,我是Peter~

好久没有更新关于plotly的文章。

什么是Plotly?

Plotly是一个基于JavaScript的绘图库,可以创建各种类型的图表,包括散点图、折线图、面积图、条形图、误差线、箱线图、直方图、热图、子图、多轴图、极坐标图和气泡图等。

它提供了非常多的编程接口,使用户能够自定义数据、形状、颜色等属性。

1 基于plotly绘制金融图形

https://plainenglish.io/blog/a-simple-guide-to-plotly-for-plotting-financial-chart-54986c996682

本文就给大家介绍如何使用plotly绘制各种金融图形,具体内容:

In [1]:

import pandas as pd
import numpy as npimport plotly_express as px
import plotly.graph_objects as gofrom datetime import datetime# yfinance 是一个流行的开源库,用于访问雅虎财经上可用的财务数据
import yfinance as yf  

2 导入数据

网络OK的话,可以使用下面的代码直接从yfinance直接下载数据,然后保存到data.csv文件中。

In [2]:

# name = "AAPL"  # 指定公司名字# apple = yf.download(name, start="2021-01-01",end="2023-11-15")
# apple.to_csv("data.csv",index=False)

在这里直接读取已经保存的data.csv:

In [3]:

df = pd.read_csv("data.csv")
df.head()

3 线型图-Close

3.1 基础线型图

观察指标随着时间的变化趋势

In [4]:

fig = px.line(df,x="Date",y="Close")# 设置图表的标题和其他参数  
fig.update_layout(title='Close of APPLE', xaxis=dict(title='Date'), yaxis=dict(title='Close'),title_x=0.5,  # X位置 title_y=0.95)  # Y位置  fig.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

基于graph_objects实现

In [5]:

fig = go.Figure(data=[go.Scatter(x=df["Date"].tolist(), y=df["Close"].tolist())])# 设置图表的标题和其他参数  
fig.update_layout(title='Close of APPLE', xaxis=dict(title='Date'), # x-y标题的两种写法yaxis_title='Close',title_x=0.5,  # X位置 title_y=0.9)  # Y位置  fig.show()

3.2 进阶线型图:指定x轴区间

In [6]:

fig = px.line(df,x="Date",y="Close",range_x = ["2021-06-01","2021-11-17"] # 优化点:指定x轴显示范围)fig.update_layout(title='Close of APPLE', xaxis=dict(title='Date'), yaxis=dict(title='Close'),title_x=0.5,  title_y=0.95)  fig.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上图中,x轴在指定的区间内显示

3.3 进阶线型图:隐藏日期或时间段

可以是隐藏具体的某天,也可以是隐藏周末,或者每天中的非交易时间段等:

In [7]:

# 1-隐藏时间段fig = px.line(df,x="Date",y="Close",range_x = ["2021-06-01", "2021-07-15"]  # 指定区间
)fig.update_xaxes(rangebreaks=[dict(bounds=["sat","sun"]),  #  优化点:隐藏周六和周日dict(values=["2021-06-04","2021-06-09","2021-06-22","2021-07-05"]) # 隐藏具体日期])fig.show()

# 2-隐藏非交易时间段fig = px.line(df,x="Date",y="Close",range_x = ["2021-06-01", "2021-07-15"]
)fig.update_xaxes(rangebreaks=[dict(bounds=[15,9]),  #  优化点:排除下午15点到第二天9点的时间h])fig.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

因为本文的数据是以日为单位,没有精确到小时,所以没有看到实际效果。

3.4 进阶线型图:是否开启区间滑块

In [9]:

fig = px.line(df,x="Date",y="Close")# 区间滑块的开启或者关闭;【默认】关闭滑动区间
fig.update_xaxes(rangeslider_visible=True)  fig.update_layout(title='Close of APPLE', xaxis=dict(title='Date'), yaxis=dict(title='Close'),title_x=0.5,  title_y=0.95)  fig.show()

3.5 进阶线型图:滑块和时间按钮显示

In [10]:

fig = px.line(df,x="Date",y="Close")fig.update_xaxes(rangeslider_visible=True,  # 优化1: 区间滑块【默认】关闭滑动区间rangeselector=dict(buttons=list([    # 优化2:时间按钮dict(count=1, label="1m", step="month", stepmode="backward"),  # 往前推一个月dict(count=6, label="6m", step="month", stepmode="backward"),  # 往前推6个月dict(count=1, label="YTD", step="year", stepmode="todate"),  # 只显示今年数据dict(count=1, label="1y", step="year", stepmode="backward"),  # 显示过去一年的数据dict(step="all")   # 显示全部数据])))  fig.update_layout(title='Close of APPLE with Rangeslider & Buttons', xaxis=dict(title='Date'), yaxis=dict(title='Close'),title_x=0.5,  title_y=0.95)  fig.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4 柱状图-Volume

Volume一般用柱状图来显示

4.1 基础柱状图

In [11]:

# 为了显示方便,在这里取了前面100个数据点
fig = px.bar(df[:100],x="Date",y="Volume")   # 设置标题及参数  
fig.update_layout(title='Volume of APPLE', xaxis=dict(title='Date'), yaxis=dict(title='Volume'),title_x=0.5,  # X位置 title_y=0.95)  # Y位置  fig.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

下面是基于基于graph_objects的实现:

In [12]:

# 基于graph_objects实现:使用完整数据fig = go.Figure(data=[go.Bar(x=df["Date"].tolist(), y=df["Volume"].tolist())])fig.update_layout(title='Volume of APPLE', xaxis=dict(title='Date'), yaxis_title='Volume',title_x=0.5,  title_y=0.9)  fig.show()

4.2 进阶柱状图

柱子的颜色深浅代表成交量的大小

In [13]:

# 为了显示方便,在这里取前100个数据点
fig = px.bar(df[:100], x="Date", y="Volume", color="Volume")     # 设置标题及参数  
fig.update_layout(title='Volume of APPLE', xaxis=dict(title='Date'), yaxis=dict(title='Volume'),title_x=0.5,  # X位置 title_y=0.95)  # Y位置  fig.show()

5 直方图-Open

5.1 基础直方图histogram

In [14]:

fig = px.histogram(df,x="Date",y="Open",histfunc="avg"
)fig.update_layout(title='Open of APPLE with Histogram', xaxis=dict(title='Date'), yaxis_title='Open',title_x=0.5,  title_y=0.95
)  fig.show()

可以看到上面的图形很紧凑,展示效果很差;下面我们进行调整:

5.2 进阶直方图:柱体设置

In [15]:

fig = px.histogram(df,x="Date",y="Open",histfunc="avg"
)# 优化点:x轴按月显示
fig.update_traces(xbins_size="M1")  # 优化点:x轴刻度设置
fig.update_xaxes(showgrid=False, dtick="M1",  # 按月显示ticklabelmode="period",   # instant  periodtickformat="%b\n%Y"   # 标签显示模式
)fig.update_layout(title='Open of APPLE with Histogram', xaxis=dict(title='Date'), yaxis_title='Open',title_x=0.5,  title_y=0.95,bargap=0.1  # 优化点:每个柱状图间隔
)  fig.show()

5.3 进阶直方图:添加轨迹图

In [16]:

fig = px.histogram(df,x="Date",y="Open",histfunc="avg"
)# 优化点:x轴按月显示
fig.update_traces(xbins_size="M1")  # 优化点:x轴刻度设置
fig.update_xaxes(showgrid=False, dtick="M1",  # 按月显示ticklabelmode="period",   # instant  periodtickformat="%b\n%Y"   # 标签显示模式
)fig.update_layout(title='Open of APPLE with Histogram', xaxis=dict(title='Date'), yaxis_title='Open',title_x=0.5,  title_y=0.95,bargap=0.05  # 优化点:每个柱状图间隔
)  # 重点优化:添加轨迹
fig.add_trace(go.Scatter(mode="lines",x=df["Date"],y=df["Open"],name="Open Trace of APPLE"
))fig.show()

6 Candlestick图

In [17]:

df.columns

Out[17]:

Index(['Date', 'Open', 'High', 'Low', 'Close', 'Adj Close', 'Volume'], dtype='object')

6.1 默认图形

In [18]:

fig = go.Figure(data=[go.Candlestick(x=df['Date'],  # 日期open=df['Open'],  # 开盘、最高价、最低价、收盘价high=df['High'],low=df['Low'],close=df['Close'])])fig.show()

6.2 自定义xy轴信息

In [19]:

fig = go.Figure(data=[go.Candlestick(x=df['Date'],  # 日期open=df['Open'],  # 开盘、最高价、最低价、收盘价high=df['High'],low=df['Low'],close=df['Close'])])fig.update_layout(title='Candlestick of APPLE With Rangeslider', xaxis=dict(title='Date'), yaxis=dict(title='Candlestick'),title_x=0.5,  title_y=0.92,xaxis_rangeslider_visible=True  # 【默认】显示x轴的滑动条
)  fig.show()

6.3 不带滑动块的K线

In [20]:

fig = go.Figure(data=[go.Candlestick(x=df['Date'],open=df['Open'], high=df['High'],low=df['Low'], close=df['Close']
)])fig.update_layout(title='Candlestick of APPLE Without Rangeslider', xaxis=dict(title='Date'), yaxis=dict(title='Candlestick'),title_x=0.5,  title_y=0.92,xaxis_rangeslider_visible=False  # 隐藏x轴的滑动条
)  fig.show()

6.4 自定义颜色

在绘制k线图的时候,默认每天的涨跌使用的是红绿色,其实可以使用自定义的颜色:

In [21]:

fig = go.Figure(data=[go.Candlestick(x=df['Date'],open=df['Open'], high=df['High'],low=df['Low'], close=df['Close'],increasing_line_color="cyan",  # 自定义涨跌颜色decreasing_line_color="gray"
)])fig.update_layout(title='Candlestick of APPLE With Custom Colors', xaxis=dict(title='Date'), yaxis=dict(title='Candlestick'),title_x=0.5,  title_y=0.92 
)  fig.show()

6.5 添加自定义区间、文本和标注

In [22]:

fig = go.Figure(data=[go.Candlestick(x=df['Date'],open=df['Open'], high=df['High'],low=df['Low'], close=df['Close']
)])fig.update_layout(title="Candlestick of APPLE",yaxis_title="AAPL STOCK",# 添加shapeshapes = [dict(x0='2021-08-09', x1='2021-11-09', # x轴范围y0=0, y1=1, xref='x', yref='paper',line_width=2)],# 添加文本annotations=[dict(x='2023-01-06', y=0.05, xref='x', yref='paper',showarrow=False, xanchor='left', text='Increase Period Begins')])  fig.show()

6.6 隐藏周六周日

In [23]:

fig = go.Figure(data=[go.Candlestick(x=df['Date'],  # 日期open=df['Open'],  # 开盘、最高价、最低价、收盘价high=df['High'],low=df['Low'],close=df['Close'])])fig.update_layout(xaxis_rangeslider_visible=False)  # x轴滑动块不显示fig.update_xaxes(rangebreaks=[dict(bounds=["sat", "mon"])])  # 隐藏周六周日fig.show()

7 添加滑动均值Moving

In [24]:

df['MA20'] = df['Close'].rolling(window=3).mean()
df['MA5'] = df['Close'].rolling(window=3).mean()

In [25]:

fig = go.Figure(data=[go.Candlestick(x=df['Date'],  # 日期open=df['Open'],  # 开盘、最高价、最低价、收盘价high=df['High'],low=df['Low'],close=df['Close'],# showlegend=False  # 如果想不显示图例trace0,使用该语句
)])fig.add_trace(go.Scatter(x=df['Date'], y=df['MA5'],opacity=0.7,line=dict(color='blue', width=2),name='MA 5'))
fig.add_trace(go.Scatter(x=df['Date'], y=df['MA20'],opacity=0.7,line=dict(color='orange', width=2),name='MA 20'))fig.show()

8 MACD指标

MACD图是一种股票技术分析图,其计算方法是根据收盘时股价或指数的快速(短期,一般是12天)和慢速(长期,一般是26天)移动平均值(EMA)之间的差值来得出。它表示股票市场趋势的变化:

  • 当MACD线上穿信号线(零线)时,表示中短期上涨信号;
  • 当MACD线下穿信号线时,表示中短期下跌信号

pandas中是通过使用pd.ewm计算移动平均值。

In [26]:

# 针对收盘价Close的操作short = 12
long = 26  df["Short_EWM"] = df["Close"].ewm(span=short).mean()
df["Long_EWM"] = df["Close"].ewm(span=long).mean()

In [27]:

df["MACD"] = df["Short_EWM"] - df["Long_EWM"]

然后根据MACD曲线计算信号线:

signal_line是MACD指标中的一部分,表示的是讯号线。它是将MACD线(即DIF和DEM的差异)通过一个特定长度(一般是9)的EMA平滑处理后得到的曲线。讯号线的作用是用来反映市场趋势的变化,当讯号线向上穿过MACD线时,通常被认为是买入信号;当讯号线向下穿过MACD线时,通常被认为是卖出信号。

In [28]:

m = 9df['Signal_Line'] = df['MACD'].ewm(span=m).mean()

In [29]:

df["Flag"] = df['MACD'] - df['Signal_Line']  

In [30]:

# fig.add_trace(go.Scatter(x=df['Date'], y=df['MACD'], name='MACD Line'))
# fig.add_trace(go.Scatter(x=df['Date'], y=df['Signal_Line'], name='Signal Line'))
# fig.add_trace(go.Bar(x=df['Date'], y=df["Flag"],name='Histogram', marker_color="green"))

In [31]:

# 绘制MACD曲线图
trace1 = go.Scatter(x=df['Date'], y=df['MACD'], mode='lines', name='MACD Line')
trace2 = go.Scatter(x=df['Date'], y=df['Signal_Line'], mode='lines', name='Signal Line')
trace3 = go.Bar(x=df['Date'], y=df["Flag"],name='Histogram', marker_color=(df["Flag"].apply(lambda x: "green" if x >= 0 else "red")))
layout = go.Layout(title='MACD Curve', xaxis=dict(title='Date'), yaxis=dict(title='Value'))fig = go.Figure(data=[trace1, trace2,trace3], layout=layout)    fig.show()

9 布林线

布林线(Boll)指标是股市技术分析的常用工具之一,通过计算股价的“标准差”,再求股价的“信赖区间”。

该线通常由上、中、下三条线组成,其中上下两条线指的就是股票价格的压力线以及支撑线,而中间的一条线是股价平均线。

在股票行情图中,这三条线会随着股价的波动而波动。布林线指标的应用可以反映股票价格的波动情况。

In [32]:

def calculate_bollinger_bands(df, window_size=20, num_std=2):"""功能:计算布林线的上、下限参数:df:给定数据window_size:表示计算移动平均线和标准差时所使用的时间窗口大小num_std:标准差倍数-用于确定上轨和下轨的宽度"""rolling_mean = df['Close'].rolling(window=window_size).mean() rolling_std = df['Close'].rolling(window=window_size).std()upper_band = rolling_mean + (rolling_std * num_std)lower_band = rolling_mean - (rolling_std * num_std)return upper_band, lower_band

In [33]:

upper_band, lower_band = calculate_bollinger_bands(df)fig = go.Figure()# 添加收盘价Close折线图
fig.add_trace(go.Scatter(x=df.Date, y=df['Close'], name='Close Price',line=dict(color="yellow")))  # 黄色-均线
# 添加上、下轨迹 upper_band, lower_band
fig.add_trace(go.Scatter(x=df.Date, y=upper_band, name='Upper Band', line=dict(color='red')))    # 上限-红色
fig.add_trace(go.Scatter(x=df.Date, y=lower_band, name='Lower Band', line=dict(color='blue')))  # 下限-蓝色# 设置图形布局
fig.update_layout(title='Apple Stock Bollinger Bands', xaxis_title='Date', yaxis_title='Price')# 显示图形
fig.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/414980.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

随笔03 笔记整理

图源:文心一言 关于我的考研与信息安全类博文整理~🥝🥝 第1版:整理考研类博文~🧩🧩 第2版:提前列出博文链接,以便小伙伴查阅~🧩🧩 第3版:整理We…

【漏洞攻击之文件上传条件竞争】

漏洞攻击之文件上传条件竞争 wzsc_文件上传漏洞现象与分析思路编写攻击脚本和重放措施中国蚁剑拿flag wzsc_文件上传 漏洞现象与分析 只有一个upload前端标签元素,并且上传任意文件都会跳转到upload.php页面,判定是一个apache容器,开始扫描…

K8S-YAML

一、Kubernetes对象的描述 kubernetes中资源可以使用YAML描述(如果您对YAML格式不了解,可以参考YAML语法),也可以使用JSON。其内容可以分为如下四个部分: typeMeta:对象类型的元信息,声明对象…

Python爬虫从入门到入狱系列合集

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈 入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈 虚 拟 环 境 搭 建 :👉&…

Windows平台反调试技术学习

前言 前俩天的学习记录Windows上面的反调试学习,主要是参考《恶意代码实战分析》和《加密与解密》里面的,给每个小技术都写了程序示例,自己编译反调试了一遍。对于加解密一书是还有很多不理解的地方的,目前只能记录到这了&#x…

蓝桥杯备赛 | 洛谷做题打卡day5

蓝桥杯备赛 | 洛谷做题打卡day5 图论起航,一起来看看深(广)度优先吧 ~ 文章目录 蓝桥杯备赛 | 洛谷做题打卡day5图论起航,一起来看看深(广)度优先吧 ~【深基18.例3】查找文献题目描述 输入格式输出格式样例…

大屏项目:react中实现3d效果的环形图包括指引线

参考链接3d环形图 3d效果的环形图 项目需求实现方式指引线(线的样式字体颜色) 项目需求 需要在大屏上实现一个3d的环形图,并且自带指引线,指引线的颜色和每段数据的颜色一样,文本内容变成白色,数字内容变…

用Axure RP 9 制作联动

制作流程 1.软件:Axure RP 9 2.使用下拉列表 3.点击下拉列表 如图 选择编辑多项 写完确定即可 4.重复步骤3 5.将后面的下拉列表变成动态面板 如图 6.复制动态面板状态 7.将动态面板的状态变成复制的 在后面的动态面板里面修改 如图 8.添加文本标签 9…

上海亚商投顾:沪指冲高回落 旅游板块全天强势

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 沪指昨日冲高回落,创业板指跌近1%,北证50指数跌超3%。旅游、零售板块全天强势&#xf…

Spring - 如何控制多个 AOP 切面执行顺序?

众所周知,Spring 声明式事务是基于 AOP 实现的,那么,如果我们在同一个方法自定义多个 AOP,我们如何指定他们的执行顺序呢? 三种解决方案 1、通过实现 org.springframework.core.Ordered 接口 Component Aspect S…

初识 Elasticsearch 应用知识,一文读懂 Elasticsearch 知识文集(4)

🏆作者简介,普修罗双战士,一直追求不断学习和成长,在技术的道路上持续探索和实践。 🏆多年互联网行业从业经验,历任核心研发工程师,项目技术负责人。 🎉欢迎 👍点赞✍评论…

图解基础排序算法(冒泡、插入、选择)(山东大学实验二)

目录 ⚽前言: 🏐 冒泡排序: 设定: 分类: 起源: 图解冒泡: 图中绿色: 图中橙色: 整体思路: 交换思路: 核心代码: &#x…