Plotly中绘制三种经典的
股票交易图表(含视频讲解)
大家好,我是 Lemon 。
背景
股票价格曲线,带可调节的时间条的图怎么绘制?
今天 Lemon 来详细的分享下,这类图如何绘制,一共会讲解 3 类图形,分别是 面积曲线图、蜡烛图、OHLC图。这三种类型的图在投资中会经常遇到。
Lemon 录制了一个视频,来说明通过本文绘制的图表效果:
数据来源
本文的数据来自开源项目 tushare, 从 tushare 中获取数据,首先要进行注册获取 token(一串字母和数字组成的文本),然后才可以获取到数据,大家可以通过以下链接来注册(也可以点击文末的“阅读原文”):
https://tushare.pro/register?reg=129033
数据获取
在 tushare
中注册后,通过 “个人主页”——“接口TOKEN” 可以找到自己的 token 值,界面如下:
tushare
复制 token 值,然后在代码中进行如下设置:
代码语言:javascript复制# 设置 token
# tushare 注册地址:https://tushare.pro/register?reg=129033
# 以上方法只需要在第一次或者token失效后调用,完成调取tushare数据凭证的设置,正常情况下不需要重复设置。
ts.set_token('你的token值')
pro = ts.pro_api()
在设置好 token 值后,我们就可以开始获取数据,这里以获取沪深300指数为例,来演示三种类型的图形绘制。
数据获取及初步整理如下:
代码语言:javascript复制# plotly-fin-candlestick.ipynb
# 获取沪深300指数行情数据, asset='I', I 表示 index,即指数
# d_today = dt.date.today().strftime('%Y%m%d')
df_300 = ts.pro_bar(
ts_code='000300.SH',
asset='I',
start_date='20180101',
# end_date=d_today,
end_date='20210119'
)
# 设置时间格式
df_300['trade_date'] = pd.to_datetime(df_300['trade_date'])
df_300 = df_300.set_index('trade_date')
df_300
面积曲线图
在常见的股票软件时,查看分时图,大部分是使用的面积曲线图,这类图形是展示股票数据常用的类型之一。
默认的面积曲线图
在 Plotly 中,可以使用 plotly express 的 area
图来绘制面积曲线图。
代码如下:
代码语言:javascript复制# 面积曲线图
area_chart = px.area(df_300['close'], title = '沪深300')
area_chart.update_xaxes(title_text = '日期')
area_chart.update_yaxes(
title_text = '沪深300收盘价',
# tickprefix = '$'
)
area_chart.update_layout(showlegend = False)
# Pycharm,VS Code, Spider 等模式下
# Jupyter Notebook 下也可以用
# plot(area_chart,filename='tmp/hushen300-area.html')
# 在 Jupyter Notebook 中,直接使用 show() 来查看结果
area_chart.show()
绘制效果如下:
这里说明下:
show()
的作用是使绘制的图形在 Jupyter notebook 中显示;- 如果想在浏览器中使用,可以使用代码
plot(area_chart,filename='tmp/hushen300-area.html')
,该代码可以在 Jupyter notebook 、PyCharm、VS Code 等编辑器中使用。
对面积曲线图进行个性化修改
对于上面的面积曲线图,我们也可以对其进行一些个性化的修改,比如标题居中、添加可以调节的时间栏、设置y轴数值范围等。
具体代码如下:
代码语言:javascript复制# 面积曲线图,个性化修改
y_min = df_300['close'].min()
y_max = df_300['close'].max()
c_area = px.area(df_300['close'], title = '沪深300')
c_area.update_xaxes(
title_text = '日期',
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'),
dict(count = 1, label = 'YTD', step = 'year', stepmode = 'todate'),
dict(count = 1, label = '1Y', step = 'year', stepmode = 'backward'),
dict(step = 'all')])))
c_area.update_yaxes(
title_text = '沪深300收盘价',
# tickprefix = '¥'
)
c_area.update_layout(showlegend = False,
title=dict(
text='沪深300',
font=dict(
size=28,),
x=0.5),
yaxis=dict(range=[y_min*0.9,y_max*1.05]), # 设置 y 轴的范围
)
# Pycharm,VS Code, Spider 等模式下
# Jupyter Notebook 下也可以用
# plot(c_area,filename='tmp/hushen300_area_update.html')
c_area.show()
上述代码的绘制效果如下:
上图中:
- 可调节的时间栏是通过在
update_xaxes
中设置参数rangeslider_visible = True
来实现的; - 左上角的时间快速选择按钮,是通过在
update_xaxes
中设置参数rangeselector
来实现的; - 标题居中和y轴数值范围设置,是通过在
update_layout
中分别设置参数 'title' 和 'yaxis' 来实现的。
蜡烛图
蜡烛图又名 k线图、日本线 或者 日本K线图。
这种图表通常用作交易工具,用来显示和分析证券、衍生工具、外汇货币、股票、债券等商品随着时间的价格变动。
蜡烛图通过使用烛台式的符号来显示多种价格信息,例如开盘价、收盘价、最高价和最低价,每个代表单一时间段(每分钟、每小时、每天或每月)的交易活动。每个烛台符号沿着 X 轴上的时间刻度绘制,显示随着时间推移的交易活动。
蜡烛图的示意图如下:
默认的蜡烛图
在 Plotly 中,可以使用 candlestick
图来绘制蜡烛图。
具体代码如下:
代码语言:javascript复制# 蜡烛图,又称 K线 或 日本线
candlestick = go.Figure(data = [go.Candlestick(x = df_300.index,
open = df_300['open'],
high = df_300['high'],
low = df_300['low'],
close = df_300['close'])])
candlestick.update_layout(xaxis_rangeslider_visible = False, title = '沪深300')
candlestick.update_xaxes(title_text = '日期')
candlestick.update_yaxes(title_text = '沪深300价格')
# plot(candlestick,filename='tmp/hushen300_candlestick.html')
candlestick.show()
绘制效果如下:
需要说明下,上图中的颜色,对应的是红跌绿涨,跟咱们国家通常的红涨绿跌刚好是相反的。后面将提到的 OHLC 图,在 Plotly 中也是 红跌绿涨,这个习惯跟美国、香港等区域是一致的。
对蜡烛图进行个性化修改
同样的,我们可以对蜡烛图进行一些个性化的修改,同样涉及标题、可调节的时间栏、y轴数值范围等。
具体代码如下:
代码语言:javascript复制# 蜡烛图,个性化修改
c_candlestick = go.Figure(data = [go.Candlestick(x = df_300.index,
open = df_300['open'],
high = df_300['high'],
low = df_300['low'],
close = df_300['close'])])
c_candlestick.update_xaxes(
title_text = '日期',
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'),
dict(count = 1, label = 'YTD', step = 'year', stepmode = 'todate'),
dict(count = 1, label = '1Y', step = 'year', stepmode = 'backward'),
dict(step = 'all')])))
c_candlestick.update_layout(
title = {
'text': '沪深300',
'y':0.9,
'x':0.5,
# 'xanchor': 'center',
# 'yanchor': 'top'
})
c_candlestick.update_yaxes(title_text = '沪深300价格')
# plot(c_candlestick,filename='tmp/hushen300_candlestick_update1.html')
c_candlestick.show()
绘制效果如下:
各个设置参数的说明,与前面提到的面积曲线图是类似的,这里不再赘述。
对于上面这个图,有一个地方需要说明下,当我们把时间范围缩小,比如最近1个月,会发现蜡烛图是不连续的,其中有周六日和假期是跳跃的。
在绘制股票曲线时经常会遇到这类问题,我们需要绘制的图形只包含交易日,这样的图表才是符合实际情况的。因此,我们需要在 Plotly 中也实现这个功能。
可以通过在 update_xaxes
设置参数 rangebreaks
来实现,实现的代码如下:
c_candlestick.update_xaxes(
rangebreaks=[
dict(bounds=["sat", "mon"]), # 隐藏周六、周日
dict(values=["2021-01-01",] holidays) # 隐藏特定假期
]
)
这里需要提醒下,
- 上面的
bounds
和values
都是list 类型; values
中的元素,字符串格式为%Y-%m-%d
,比如 "2021-01-01" 。
结合标题、时间栏、y轴数值范围、隐藏节假日一起的完整代码如下:
代码语言:javascript复制# 蜡烛图,个性化修改,隐藏周六日以及节假日
c_candlestick = go.Figure(data = [go.Candlestick(x = df_300.index,
open = df_300['open'],
high = df_300['high'],
low = df_300['low'],
close = df_300['close'])])
c_candlestick.update_xaxes(
title_text = '日期',
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'),
dict(count = 1, label = 'YTD', step = 'year', stepmode = 'todate'),
dict(count = 1, label = '1Y', step = 'year', stepmode = 'backward'),
dict(step = 'all')])))
c_candlestick.update_layout(
title = {
'text': '沪深300',
'y':0.9,
'x':0.5,
# 'xanchor': 'center',
# 'yanchor': 'top'
})
c_candlestick.update_yaxes(title_text = '沪深300价格')
# 2020年国庆假期 2020.10.1-10.8
holidays = [ dt.date(2020,10,x).strftime('%Y-%m-%d') for x in range(1,9)]
print(holidays)
c_candlestick.update_xaxes(
rangebreaks=[
dict(bounds=["sat", "mon"]), # 隐藏周六、周日
dict(values=["2021-01-01",] holidays) # 隐藏特定假期
]
)
# plot(c_candlestick,filename='tmp/hushen300_candlestick_update2.html')
c_candlestick.show()
OHLC 图
OHLC 图 也称为「美国线」或「价格图」。
美国线 (Open-high-low-close Charts) 通常用作交易工具,显示和分析证券、货币、股票、债券等商品随时间的价格变动。OHLC 图有助于解释市场日常走势,并通过研究所形成的模式预测未来价格变化。
OHLC 图上的 Y 轴用作价格标尺,X 轴是时间刻度。在每个时段内,OHLC 图中会出现一个符号,以代表两个范围:交易的最高价和最低价,以及该时间段(例如一天)中的开盘价和收盘价。在这个范围符号上,最高和最低价的范围由主垂直线的长度所表示;而开盘和收盘价则分别在垂直线左右两边以一小段水平线代表。
示意图如下:
默认的OHLC图
在 Plotly 中,可以使用 ohlc
图来绘制蜡烛图。
具体代码如下:
代码语言:javascript复制# OHLC图,又称 美国线,或 价格图
ohlc = go.Figure(data = [go.Ohlc(x = df_300.index,
open = df_300['open'],
high = df_300['high'],
low = df_300['low'],
close = df_300['close'])])
ohlc.update_layout(xaxis_rangeslider_visible = False, title = '沪深300')
ohlc.update_xaxes(title_text = '日期')
ohlc.update_yaxes(title_text = '沪深300价格')
# plot(ohlc,filename='tmp/hushen300_ohlc.html')
ohlc.show()
绘制效果如下:
对OHLC图进行个性化设置
与蜡烛图类似,我们也可以进行个性化修改,具体代码如下:
代码语言:javascript复制# # OHLC图,个性化修改
c_ohlc = go.Figure(data = [go.Ohlc(x = df_300.index,
open = df_300['open'],
high = df_300['high'],
low = df_300['low'],
close = df_300['close'])])
c_ohlc.update_xaxes(
title_text = '日期',
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'),
dict(count = 1, label = 'YTD', step = 'year', stepmode = 'todate'),
dict(count = 1, label = '1Y', step = 'year', stepmode = 'backward'),
dict(step = 'all')])))
c_ohlc.update_layout(
title = {
'text': '沪深300',
'y':0.9,
'x':0.5,
# 'xanchor': 'center',
# 'yanchor': 'top'
})
c_ohlc.update_yaxes(title_text = '沪深300价格')
# 2020年国庆假期 2020.10.1-10.8
holidays = [ dt.date(2020,10,x).strftime('%Y-%m-%d') for x in range(1,9)]
print(holidays)
c_ohlc.update_xaxes(
rangebreaks=[
dict(bounds=["sat", "mon"]), # 隐藏周六、周日
dict(values=["2021-01-01",] holidays) # 隐藏特定假期
]
)
# plot(c_ohlc,filename='tmp/hushen300_ohlc_update.html')
c_ohlc.show()
绘制效果如下:
上面这张大图里看不出美国线的显示效果,我们可以选择今年以来的图来查看下:
本文完整的代码,请在公众号后台回复 Plotly
获取。