python金融数据分析和可视化--06_03用mplfinance金融数据可视化(下)

本文介绍了如何使用mplfinance库创建符合中国股市习惯的金融数据可视化图表,包括自定义红绿颜色风格、调整图表尺寸、显示价格信息、添加完整移动平均线以及绘制MACD指标。通过示例代码详细展示了每个步骤的操作方法。
摘要由CSDN通过智能技术生成

05_02用mplfinance金融数据可视化(下)

用mplfinance实现全功能K线图

目标
在开始实际工作之前,需要确定我们需要达到的目标,以便一步步实现:

  • 符合中国习惯的配色风格——红涨绿跌自然是必须实现的第一步
  • 图表上要能显示股票代码和股票名称、以及价格信息
  • 图表上要显示完整的移动平均线
  • 在交易量的下方显示第三张图表,同步显示相关指标如MACD等

下面我们就来一一实现上面的功能,随着本文的逐步完善。

实现自定义风格和颜色

这肯定是上面的所有功能中最容易实现的一个。mplfinance提供了两个相关的函数:make_mpf_style 以及make_marketcolors。示例如下:

import mplfinance as mpf
# 设置mplfinance的蜡烛颜色,up为阳线颜色,down为阴线颜色
my_color = mpf.make_marketcolors(up='r',
                                 down='g',
                                 edge='inherit',
                                 wick='inherit',
                                 volume='inherit')
# 设置图表的背景色
my_style = mpf.make_mpf_style(marketcolors=my_color,
                              figcolor='(0.82, 0.83, 0.85)',
                              gridcolor='(0.82, 0.83, 0.85)')

在make_marketcolors函数中,几个不同的参数主要用于设置K线的颜色,up 和down都很明显,用于分别指定上涨K线和下跌K线的颜色。因此根据国内习惯自然应该设置up=‘r'也就是red红色,down自然就是’g'也就是‘green’绿色。不过需要注意的是这里仅仅设置K线的柱子的内部填充色,如果不指定边框、上下影线的颜色,他们都会是黑色,显示的效果就是黑色的边框、黑色的上下影线,挺难看的,因此还需要设置边框"edge"的颜色。此处设置为“in”或“inherit”代表“使用主配色“。也就是说,阳线(上涨)的柱子外框线跟阳线的内部填充色一致,那么如果阳线的颜色为红色,边框的颜色也是红色,如果阳线是绿色,则边框也是绿色。阴线也一样。
wick设置的就是上下影线的颜色,这里为了显眼,同样设置为”in“。
类似的,volume设置的是交易量柱子的颜色,也设置为”in“就可以了。

有朋友可能想问,如果我不喜欢标准的红绿色配色,觉得太鲜艳了,想改成自定义的RGB配色可不可以,当然可以,不过需要注意的是,在标准的matplotlib中,可以传入一个元组表示RGB配色,例如(0.5, 0.8, 0.6)然而mpf不能直接传递元组作为颜色代码,但可以接受一个表示元组的字符串,如上面代码中的figcolor='(0.82, 0.83, 0.85)'。

make_mpf_style()函数接受上面的参数,将所有的配置都存储在一个字典中,然后使用mpf的基本绘图方法,就可以生成一张符合中国股市习惯的K线图了。

准备数据:

import pandas as pd
import os
import numpy as np
import matplotlib # 注意这个也要import一次
import matplotlib.pyplot as plt
import talib


# 文件路径和名称
file_name = os.path.join(os.path.join(os.getcwd(), "datas/days"), "000012.SZ.csv")
# 读取CSV文件
df = pd.read_csv(file_name)
# 取需要的数据
df = df[['trade_date', 'open', 'close', 'high', 'low', 'vol', 'amount', 'pre_close', 'change', 'pct_chg']]
# 重命名
df.columns = ['date', 'open', 'close', 'high', 'low', 'volume', 'amount', 'pre_close', 'change', 'pct_chg']
# 涨停价
df['upper_lim'] = np.round(df['close'] * 1.10)
# 跌停价
df['lower_lim'] = np.round(df['close'] * 0.90)
df['average'] = np.round((df['high']+df['low']) / 2)
# 用talib计算MACD
df['macd_dif'], df['macd_dea'], df['macd_m'] = np.round(talib.MACD(df['close'], fastperiod=12,
                                                               slowperiod=26, signalperiod=9), 
                                                        2)
df['macd_macd'] = 2 * df['macd_m']
# 分别计算5日、10日、20日、60日的移动平均线
ma_list = [5, 10, 20, 60]
# 计算简单算术移动平均线MA
for ma in ma_list:
    df['MA' + str(ma)] = np.round(talib.SMA(df['close'], ma),2)
# 转换Date为日期格式
df['date'] = pd.to_datetime(df['date'])
# 设置Date为索引
df.set_index('date', inplace=True)
out_file_name = os.path.join(os.path.join(os.getcwd(), "datas/days"), "000012.csv")
df.to_csv(out_file_name)
# 文件路径和名称
file_name = os.path.join(os.path.join(os.getcwd(), "datas/days"), "000012.csv")
# 读取CSV文件
data = pd.read_csv(file_name)
# 转换Date为日期格式
data['date'] = pd.to_datetime(data['date'])
# 设置Date为索引
data.set_index('date', inplace=True)

绘制K线图

mpf.plot(data.iloc[100:200], style=my_style, type='candle', volume=True)

输出结果:

上面的代码从本地读取测试数据后,将其中一部分显示在K线图中,如上图所示,红涨绿跌。这就是符合国内习惯的K线图了。

图表尺寸调整、相关信息的显示

有了符合中国股市习惯配色风格的K线图,接下来需要调整图表尺寸,同时显示价格信息。
在mplfinance的默认设置下,K线图会显示两张图表,K线图在上,交易量柱状图在下。实际上在大多数情况下,还需要第三张图表以显示一些相关的指标如KDJ,MACD等等,另外,图表的顶部应该预留出一些区域用于显示价格。
因此我们必须对图表的尺寸和位置进行精确控制,然而mplfinance的基础用法是不允许我们控制每一个图表的位置的,因此就必须使用mplfinance提供的另一种用法“External Axes Mode“,在这种模式下,我们可以像使用matplotlib一样直接控制画布上的每一个图标元素和文字元素,获得更大的操作自由。
为了实现自由控制,需要获取图表的figure对象,然后手动在figure上放置图表Axes和文字Text,文字和图表的位置、大小、格式完全自定义,下面是代码:

# data是测试数据,可以直接下载后读取,在下例中只显示其中100个交易日的数据
plot_data = data.iloc[-100:]
# 读取显示区间最后一个交易日的数据
last_data = plot_data.iloc[-1]
# 使用mpf.figure()函数可以返回一个figure对象,从而进入External Axes Mode,从而实现对Axes对象和figure对象的自由控制
fig = mpf.figure(style=my_style, figsize=(12, 8), facecolor=(0.82, 0.83, 0.85))
# 添加三个图表,四个数字分别代表图表左下角在figure中的坐标,以及图表的宽(0.88)、高(0.60)
ax1 = fig.add_axes([0.06, 0.25, 0.88, 0.60])
# 添加第二、三张图表时,使用sharex关键字指明与ax1在x轴上对齐,且共用x轴
ax2 = fig.add_axes([0.06, 0.15, 0.88, 0.10], sharex=ax1)
ax3 = fig.add_axes([0.06, 0.05, 0.88, 0.10], sharex=ax1)
# 设置三张图表的Y轴标签
ax1.set_ylabel('price')
ax2.set_ylabel('volume')
ax3.set_ylabel('macd')
# 在figure对象上添加文本对象,用于显示各种价格和标题
fig.text(0.50, 0.94, '513100.SH - 纳指ETF:')
fig.text(0.12, 0.90, '开/收: ')
fig.text(0.14, 0.89, f'{np.round(last_data["open"], 3)} / {np.round(last_data["close"], 3)}')
fig.text(0.14, 0.86, f'{
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值