4.4. 金融图表#
import plotly.graph_objects as go
import pandas as pd
import plotly.io as pio
pio.renderers.default = "notebook"
Plotly 的金融图表库提供了丰富的功能,可以用于分析和可视化金融数据。本节介绍一些基本的经济金融相关图表。
蜡烛图#
蜡烛图是一种用于展示股票或其他金融资产价格的图表。每个蜡烛表示一段时间内的开盘价(Open)、收盘价(Close)、最高价(High)和最低价(Low),我们常说的股市的 k 线图就是一个蜡烛图。Plotly 的 go.Candlestick()
函数可用于创建这种类型的图表。参数有:
x: x 轴上的数据。通常是时间轴上的日期数据,表示蜡烛图中每个蜡烛的位置。
open
: 每个蜡烛的开盘价数据。high
: 每个蜡烛的最高价数据。low
: 每个蜡烛的最低价数据。close
: 每个蜡烛的收盘价数据。
日内收盘价高于开盘价则绿色,反之蜡烛图显示为红色。还可以在 .update_layout
中设置 xaxis_rangeslider_visible
参数决定是否有时间区间的滑块,设置为 False 则不显示滑块,默认为显示。
例:作出苹果公司(AAPL)2015-2917 年股市的蜡烛图。数据包含了每日的开盘价、最高价、最低价和收盘价。作图后,可以通过交互按钮放大特定时间区间的具体表现。
# 下载金融数据
import urllib.request
import os
download_url = f"https://py-ds.godaai.org/datasets/finance/apple.csv"
file_name = download_url.split("/")[-1]
folder_path = os.path.join(os.getcwd(), "../data/finance")
file_path = os.path.join(folder_path, file_name)
if not os.path.exists(folder_path):
os.makedirs(folder_path)
if not os.path.exists(file_path):
urllib.request.urlretrieve(download_url, file_path)
df = pd.read_csv(file_path)
fig = go.Figure()
fig.add_trace(go.Candlestick(x=df['Date'],
open=df['AAPL.Open'],
high=df['AAPL.High'],
low=df['AAPL.Low'],
close=df['AAPL.Close']))
fig.show()
开-高-低-收图(OHLC Charts)#
OHLC 图表与蜡烛图类似,但用线段表示开盘和收盘价,通过 go.Ohlc()
函数创建。
fig = go.Figure()
fig.add_trace(go.Ohlc(x=df['Date'],
open=df['AAPL.Open'],
high=df['AAPL.High'],
low=df['AAPL.Low'],
close=df['AAPL.Close']))
fig.show()
瀑布图#
瀑布图是一种用于展示数值数据中各项增减对总体变化的贡献的图表。它以垂直方向的条形表示数据的累积效果,展示了从一个起始点到最终结果的各个过程和因素的贡献。瀑布图通常用于呈现财务数据中的收入、支出、利润等变化。
go.Waterfall()
是 Plotly 中用于创建瀑布图的图表对象。主要参数包括:
measure
: 每个柱子的测量类型,可以是 “relative”(相对值,即相对于前一个柱的增量)或 “total”(总值,即当前柱的绝对值)。y
: 每个柱子的数值,代表各个因素对总体变化的贡献。name
: 该瀑布图的名称,用于在图例中标识。orientation
: 瀑布图的方向,可以是 “v”(垂直)或 “h”(水平)。x
: 每个柱子的标签,用于表示瀑布图中的各个过程或因素。textposition
: 柱子上文本标签的位置,可以是 “inside”(内部)或 “outside”(外部)。text
: 与每个柱子相关联的文本标签,用于显示在柱子的旁边。connector
: 连接线的样式,是一个包含 “line” 的字典。可以设置颜色等样式。
例:创建一个垂直方向的瀑布图,表示了不同因素对于损益表的贡献,包括销售额、咨询费用、净收入、采购成本、其他费用以及税前利润。
fig = go.Figure()
trace = go.Waterfall(
orientation = "v",
measure = ["relative", "relative", "total", "relative", "relative", "total"],
y = [60, 80, 0, -40, -20, 0],
x = ["Sales", "Consulting", "Net revenue", "Purchases", "Other expenses", "Profit before tax"],
textposition = "outside",
text = ["+60", "+80", "", "-40", "-20", "Total"],
connector = {"line":{"color": "rgb(63, 63, 63)"}},
)
fig.add_trace(trace)
fig.update_layout(
title = "Profit and loss statement 2018"
)
fig.show()