Артефакт визуализации Plotly играет с биржевыми диаграммами
Эта статья является седьмой частью артефакта визуализации Plotly Drawing, в которой объясняется, как использовать Plotly для рисования графиков, связанных с фондовым рынком, таких как базовые графики K-line, графики OHLC и т. д.
Теплое напоминание⚠️:Фондовый рынок рискован, инвестиции должны быть осторожными, это не мешает всем учитьсяPlotly
навыки рисования!
Расширенное чтение
Статьи Plotly образуют последовательную серию. Первые шесть статей о визуализации Plotly:
- Прохладный! 36 картинок влюбляются в продвинутый артефакт визуализации Plotly_Express
- Играйте с точечными диаграммами с помощью Plotly
- Сюжетные игры с круговыми диаграммами
- Сюжетное развлечение с воронкообразными диаграммами
- Сюжетные игры с гистограммами
- Сюжетные игры с пузырьковыми диаграммами
библиотека импорта
import pandas as pd
import numpy as np
# 两个接口
import plotly_express as px
import plotly.graph_objects as go
график фондового рынка
Ниже приводится краткое введение в два графика, связанных с фондовым рынком:
- К-линейный график
- Диаграмма OHLC
К-линейный график
K строка поЦена открытия, цена закрытия, высокая цена, низкая ценаОн состоит из четырех ценовых категорий. Цена открытия ниже цены закрытияЯнсянь, иначе его называют Yinxian.
Прямоугольник посередине называетсяорганизация, тонкая линия над объектом называетсяверхняя тень, тонкая линия под объектом называетсянижняя тень.
1. Красные всходы:
2. Зеленый водопад
3. Плоский статус
В соответствии с циклом расчета K-линии ее можно разделить на: ежедневную K-линию, недельную K-линию, месячную K-линию и годовую K-линию.
Линейная диаграмма OHLC
выдержка изВикипедияВведение в:
America Line** (английский: график Open-High-Low-Close,OHLC chart), представленный вертикальными линиямискладИзменение цены может быть представлено как «цена открытия, самая высокая цена, самая низкая цена и цена закрытия». Вертикальная линия представляет собой разницу в цене между самой высокой и самой низкой ценой. Горизонтальная линия слева представляет цену открытия, а горизонтальная линия справа представляет цену закрытия.
Постройте диаграмму OHLC
данные графика
Многие графики в этой статье основаны на стандартных данных об Apple AAPL, которые поставляются с Plotly.Давайте посмотрим, как выглядят конкретные данные: Используйте pandas для чтения онлайн-файла csv веб-сайта.
# 读取在线的csv文件
df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/finance-charts-apple.csv')
df.head() # 显示前5行数据
Размер данных:
df.shape
# 结果
(506,11)
Все поля:
df.columns
# 结果
Index(['Date', 'AAPL.Open', 'AAPL.High', 'AAPL.Low', 'AAPL.Close',
'AAPL.Volume', 'AAPL.Adjusted', 'dn', 'mavg', 'up', 'direction'],
dtype='object')
базовый рисунок
# The 'close' property is an array that may be specified as a tuple, list, numpy array, or pandas Series
fig = go.Figure(data=go.Ohlc(
x=df['Date'],
open=df['AAPL.Open'], # 字段数据必须是元组、列表、numpy数组、或者pandas的Series数据
high=df['AAPL.High'],
low=df['AAPL.Low'],
close=df['AAPL.Close']
))
fig.update(layout_xaxis_rangeslider_visible=False)
fig.show()
Добавление текстовой информации и заметок
fig = go.Figure(data=go.Ohlc(
x=df['Date'], # 日期和四组数据
open=df['AAPL.Open'],
high=df['AAPL.High'],
low=df['AAPL.Low'],
close=df['AAPL.Close']
))
fig.update_layout(
title="苹果公司股票走势图", # 标题
yaxis_title="股票价格", # y轴名称
shapes = [dict( # 显示形状的位置和线宽等信息
x0='2015-06-01', x1='2016-05-13', # x的取值
y0=0, y1=1, # y的取值
xref='x', yref='paper',
line_width=2)],
annotations=[dict( # 备注信息
x='2015-06-01', y=0.05,
xref='x', yref='paper',
showarrow=False,
xanchor='left',
text='下降阶段')]
)
fig.show()
К изображению выше добавлены выделения и примечания в рамках
нестандартный цвет
Приведенный выше график — это цвет, который поставляется с Plotly:Вверху красный, внизу зеленый, рисунок ниже станет синим
fig = go.Figure(data=[go.Ohlc(
x=df['Date'], # 日期
open=df['AAPL.Open'], # 4组数据
high=df['AAPL.High'],
low=df['AAPL.Low'],
close=df['AAPL.Close'],
increasing_line_color= 'blue', # 上升趋势颜色
decreasing_line_color= 'green' # 下降趋势颜色
)])
fig.show()
График OHLC на определенные даты
Графики вышеПоследовательная дата (в зависимости от месяца)График OHLC, ниже описано, как рисоватьопределенные датыграфика OHLC
# 如何生成一个datetime时间对象
import plotly.graph_objects as go
from datetime import datetime
datetime(year=2013, month=10, day=10)
# 绘制的4份数据
open_data = [133.0, 133.3, 133.5, 133.0, 134.1]
high_data = [133.1, 133.3, 133.6, 133.2, 134.8]
low_data = [132.7, 132.7, 132.8, 132.6, 132.8]
close_data = [133.0, 132.9, 133.3, 133.1, 133.1]
# 绘图的5个日期:指定年、月、日
dates = [datetime(year=2019, month=10, day=10),
datetime(year=2019, month=11, day=10),
datetime(year=2019, month=12, day=10),
datetime(year=2020, month=1, day=10),
datetime(year=2020, month=2, day=10)]
# 绘图:传入时间和数据
fig = go.Figure(data=[go.Ohlc(
x=dates,
open=open_data,
high=high_data,
low=low_data,
close=close_data)])
fig.show()
Добавить информацию о наведении
Информация при наведенииЭто означает, что сами данные на графике не видны, при подведении курсора к графику мы видим соответствующие данные.
Или возьмем в качестве примера данные по акциям Apple:
hovertext=[] # 添加悬停信息
for i in range(len(df['AAPL.Open'])): # <br>表示
hovertext.append('Open: '+str(df['AAPL.Open'][i])+'<br>Close: '+str(df['AAPL.Close'][i]))
# 结果表现形式
['Open: 127.489998<br>Close: 127.830002',
'Open: 127.629997<br>Close: 128.720001',
'Open: 128.479996<br>Close: 128.449997']
Красная часть на рисунке выше — это информация о наведении.
на основе временного ряда
данные графика
Ниже приведено введение в то, как рисовать биржевую графику на основе временных рядов, используя биржевые данные, поставляемые с Plotly:
stocks = px.data.stocks()
stocks.head() # 显示前5行数据
Первое поле — дата и время, остальные — разные названия компаний: Google, Apple, Amazon и т. д.
Реализация на базе px
Мы используем plotly_express для рисования базовой графики, и выбранная компания — FB: Facebook.
# 绘制FB股票走势
fig = px.line(
stocks,
x='date',
y='FB'
)
fig.update_layout(title={
'text':'Facebook股票走势',
'x':0.52,
'y':0.96,
'xanchor':'center',
'yanchor':'top'
})
fig.show()
Реализация на основе go
На основе метода go реализовано следующее:
import pandas as pd
import numpy as np
# 两个接口
import plotly_express as px
import plotly.graph_objects as go
# 基于go
fig = go.Figure([go.Scatter(
x=stocks['date'],
y=stocks['FB'])])
fig.update_layout(title={
'text':'Facebook股票走势',
'x':0.52,
'y':0.96,
'xanchor':'center',
'yanchor':'top'
})
fig.show()
Общая хронология
import plotly.express as px
stock = px.data.stocks(indexed=True) - 1 # 将原始数据减掉1
stock.head()
fig = px.bar(
stock, # 数据
x=stock.index, # x轴
y="GOOG" # y轴
)
fig.show()
Фасетные графики имеют общую временную шкалу
fig = px.area(
stock,
facet_col="company", # 根据公式显示不同的元素
facet_col_wrap=3 # 每行显示的图形数量
)
fig.show()
Измените параметры для отображения 2 графиков в строке:
fig = px.area(
stock,
facet_col="company",
facet_col_wrap=2 # 每行显示的图形数量
)
fig.show()
Индивидуальные настройки ярлыка ярлыка
fig = px.line(
df4, # 绘图数据
x="date", # x轴标签
y=df4.columns,
hover_data={"date": "|%B %d, %Y"}, # 悬停信息设置
title='标签个性化设置-居中' # 图标题
)
fig.update_xaxes(
dtick="M1", # 表示one month:每个月显示一次
tickformat="%b\n%Y", # 日期显示模式
ticklabelmode='instant' # ticklabelmode模式:居中 'instant', 'period'
)
fig.show()
Реализация временных рядов на основе гистограмм
import plotly.express as px
import plotly.graph_objects as go
import pandas as pd
# 读取在线csv文件
df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/finance-charts-apple.csv')
fig = px.histogram( # 直方图
df,
x="Date",
y="AAPL.Open",
histfunc="avg", # 直方图函数
title="时间轴的直方图实现")
fig.update_traces(xbins_size="M1") # 按月显示
fig.update_xaxes(
showgrid=False,
dtick="M1", # 按月显示
ticklabelmode="period", # instant period
tickformat="%b\n%Y" # 标签显示模式
)
fig.update_layout(bargap=0.1)
fig.show()
Выше приведена простая гистограмма, и на ее основе ее можно объединить с точечной диаграммой для отображения:
import plotly.express as px
import plotly.graph_objects as go
import pandas as pd
df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/finance-charts-apple.csv')
# 1、生成直方图
fig = px.histogram(
df,
x="Date",
y="AAPL.Open",
histfunc="avg",
title="直方图+散点图")
# 2、更新轨迹:按月显示
fig.update_traces(xbins_size="M1") # 每个柱子显示几个月的数据:M1显示一个月 M2表示2个月
# 3、设置x轴
fig.update_xaxes(
showgrid=True,
dtick="M1", # 按月显示
ticklabelmode="period", # instant period
tickformat="%b\n%Y"
)
# 4、每个柱状图间隔
fig.update_layout(bargap=0.1)
# 5、红色轨迹的设置
fig.add_trace(go.Scatter(
mode="lines", # ['lines', 'markers', 'text']
x=df["Date"], # 两个轴的数据
y=df["AAPL.Open"],
name="daily")) # 轨迹名称
fig.show()
назначенный торговый день
import plotly.graph_objects as go
import pandas as pd
df = pd.DataFrame(dict(
# 横轴
date=["2019-01-10",
"2019-02-10",
"2019-03-10",
"2019-04-10",
"2019-05-10",
"2019-06-10"
],
# 纵轴
value=[10,12,13,11,12,13]
))
df
# 添加画布
fig = go.Figure()
# 添加不同的轨迹
fig.add_trace(go.Scatter( # 散点图
name="轨迹1", # 轨迹名称
mode="markers+lines", # 轨迹模式 :标记+折线
x=df["date"], # 两个轴的数据
y=df["value"],
marker_symbol="star" # 标记符号:星星star
))
fig.add_trace(go.Scatter(
name="轨迹2",
mode="markers+lines",
x=df["date"],
y=df["value"],
xperiod="M1", # x轴时间阶段显示模式:以1个月为基准
xperiodalignment="start" # start左边 middle中间 end右边
))
fig.add_trace(go.Scatter(
name="轨迹3",
mode="markers+lines",
x=df["date"],
y=df["value"],
xperiod="M1",
xperiodalignment="middle"
))
fig.add_trace(go.Scatter(
name="轨迹4",
mode="markers+lines",
x=df["date"],
y=df["value"],
xperiod="M1",
xperiodalignment="end"
))
fig.add_trace(go.Bar( # 柱状图
name="轨迹5",
x=df["date"],
y=df["value"],
xperiod="M1",
xperiodalignment="middle"
))
fig.update_xaxes(showgrid=True, ticklabelmode="period")
fig.show()
Укажите торговый диапазон
Постройте временной интервал, опять же на примере акций Apple:
# px 实现
import plotly.express as px
import pandas as pd
# 苹果公司数据
df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/finance-charts-apple.csv')
fig = px.line(df,
x='Date', # x轴
y='AAPL.High', # y轴
range_x=['2015-07-01','2016-8-31']) # 指定交易时间范围
fig.show()
Рисование с ползунком интервала
import plotly.express as px
import pandas as pd
df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/finance-charts-apple.csv')
fig = px.line(df,
x='Date',
y='AAPL.Open',
title='带有区间滑块绘图')
fig.update_xaxes(rangeslider_visible=True) # 开启区间滑块
fig.show()
Комбинация ползунка и кнопки времени
Помимо ползунка, мы также можем установить кнопки в графике для выбора:
import plotly.express as px
import pandas as pd
df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/finance-charts-apple.csv')
fig = px.line(
df,
x='Date',
y='AAPL.High',
title='带有滑块和按钮的时间序列绘图')
fig.update_xaxes(
rangeslider_visible=True, # 开始显示
rangeselector=dict(
buttons=list([
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.show()
Скрыть выходные и торговые дни
1. Сначала посмотрите, как будет выглядеть график, если мы не будем обрабатывать неторговые дни в конкретный период времени?
# 默认形式
import plotly.express as px
import pandas as pd
df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/finance-charts-apple.csv')
fig = px.scatter(
df,
x='Date',
y='AAPL.High',
range_x=['2015-12-01', '2016-01-31'], # 指定绘图时间范围
title="非交易日(隐藏)")
fig.show()
2. Укажите время скрытия: это может быть неделя или конкретный день
# 隐藏周末和节假日
fig = px.scatter(
df,
x='Date', y='AAPL.High',
range_x=['2015-12-01', '2016-01-15'],
title="隐藏周末和节假日(指定日期)")
fig.update_xaxes(
rangebreaks=[
dict(bounds=["sat", "mon"]), # 隐藏周六、周一
dict(values=["2015-12-25", "2016-01-01"]) # 隐藏具体日期
]
)
fig.show()
Скрыть неторговые часы
В сутках нет 24 часов торговли, нам нужно скрыть неторговый период:
import plotly.express as px
import pandas as pd
import numpy as np
np.random.seed(1)
work_week_40h = pd.date_range(
start='2020-03-01',
end='2020-03-07',
freq="BH" # 数据产生的频率:按照小时
)
work_week_40h
df5 = pd.DataFrame(dict(
date = work_week_40h,
value = np.cumsum(np.random.rand(40)-0.5)
))
fig = px.scatter(df5,
x="date",
y="value",
title="排除非交易时间段")
fig.update_xaxes(
rangebreaks=[ # 排除时间段
dict(bounds=[17, 9], pattern="hour"), # 排除下午5点(17点)到上午9点的时间h
]
)
fig.show()
Практический случай
Давайте на самом деле изобразим 3 акции в А-акциях ниже:
- Пинг Ан
- Пинг Банк
- Фуцзянь Цзиньсен
tushare
tushareЭто веб-сайт, который предоставляет финансовые данные, в том числе: акции, облигации, фьючерсы, фонды и т. д. Основные функции:
- Богатые данные: богатое содержание данных, таких как акции, фонды, фьючерсы, цифровая валюта и другие рыночные данные, финансы компании, управляющий фондом и другие фундаментальные данные.
- Легко получить: комплект разработки SDK поддерживает языки и предоставляет интерфейсы HTTP Restful, что в наибольшей степени удобно для разных групп людей.
- Простота реализации: предоставьте различные методы хранения данных, такие как Oracle, MySQL, MongoDB, HDF5, CSV и т. д., чтобы гарантировать производительность при сборе данных.
Чтобы использовать эти данные, нам нужно установить библиотеку tushare:
pip install tushare # 下图显示安装成功
получить данные
В качестве примера возьмем данные, полученные от Ping An: 14 полей включают цену открытия, максимальную цену и т. д.; стандарты сбора данных каждой организацией веб-сайта разные, и данные в этой статье предназначены только для справки и обучения. .
import pandas as pd
import tushare as ts
pingan = ts.get_hist_data("603018") # 股票代码要事先准备
pingan # 数据显示总共607行,14个字段
Добавьте два поля к данным:
pingan = pingan.reset_index()
pingan["code_name"] = "中国平安"
pingan["code"] = "603018"
# 全部字段
Index(['date', 'open', 'high', 'close', 'low', 'volume', 'price_change',
'p_change', 'ma5', 'ma10', 'ma20', 'v_ma5', 'v_ma10', 'v_ma20',
'turnover', 'code_name', 'code'],
dtype='object')
Таким же способом можно получитьПинг БанкиФуцзянь Цзиньсенбиржевые данные
чертеж OHLC
fig = go.Figure(data=go.Ohlc(
x=pingan['date'], # 传入日期
open=pingan['open'], # 传入4份数据
high=pingan['high'],
low=pingan['low'],
close=pingan['close']
))
fig.update(layout_xaxis_rangeslider_visible=False) # 隐藏滑块
fig.update_xaxes(
rangebreaks=[ # 设置隐藏数据
dict(bounds=["sat", "sun"]), # 隐藏周六、周日
]
)
fig.show()
Включите ползунок отображения:fig.update(layout_xaxis_rangeslider_visible=True)
Комбинированный график данных
Мы объединяем данные трех акций, а затем строим график, используя функцию concat:
# tushare_data
td = pd.concat([pingan,pinganbank,jinsen],axis=0).reset_index(drop=True) # 指定横纵axis=0上的合并数据
td
График OHLC для 3 акций:
fig = go.Figure()
fig.add_trace(go.Scatter(
x=pingan['date'],
y=pingan['open'],
mode='lines',
name='中国平安'
))
fig.add_trace(go.Scatter(
x=pinganbank['date'],
y=pinganbank['open'],
mode='lines',
name='平安银行'
))
fig.add_trace(go.Scatter(
x=jinsen['date'],
y=jinsen['open'],
mode='lines',
name='福建金森'
))
fig.update_xaxes(
rangeslider_visible=True, # 开启显示滑块
rangeselector=dict(
buttons=list([
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.show()
Выход на фондовый рынок в течение 7 лет, единственный опыт: не спекулировать акциями, не спекулировать акциями, не спекулировать акциями?
Расширенное чтение
- Прохладный! 36 картинок влюбляются в продвинутый артефакт визуализации Plotly_Express
- Играйте с точечными диаграммами с помощью Plotly
- Сюжетные игры с круговыми диаграммами
- Сюжетное развлечение с воронкообразными диаграммами
- Сюжетные игры с гистограммами
- Сюжетные игры с пузырьковыми диаграммами
Юэр Коттедж, уютный коттедж. Хозяин хижины, стремится выжить одной рукой кода, а одной рукой наслаждается жизнью, добро пожаловать в гости?