mplfinance:Python中的K线图绘制神器

K线图 ,又称蜡烛图或阴阳图,是金融市场中常用的一种技术分析工具,主要用于显示一段时间内证券、外汇、期货等资产价格的变动情况。
K线图起源于18世纪的日本大米市场,后来逐渐在全球金融市场得到广泛应用。

K线图 是用图形表示一段时间内的开盘价、收盘价、最高价和最低价。每个K线代表一个时间周期,可以是分钟、小时、日、周等。
K线图阳线 表示该时段内收盘价高于开盘价,阴线则表示收盘价低于开盘价。

K线图 原本是matplotlib中的一个模块,后来随着其发展,功能越来越多,目前已经单独出来成为一个独立的模块。

安装很简单:

bash 复制代码
pip install --upgrade mplfinance

1. 数据准备

数据使用A股历史日交易数据,下载地址:

  1. 2023年日交易数据
  2. 2023年之前的日交易数据

下面的示例中使用2023年的数据:

python 复制代码
import pandas as pd
import numpy as np

import matplotlib
import matplotlib.pyplot as plt

# 为了显示中文
matplotlib.rcParams["font.sans-serif"] = ["Microsoft YaHei Mono"]
matplotlib.rcParams["axes.unicode_minus"] = False

# 读取数据
fp = "./data/2023/历史行情数据-东财-前复权-2023.zip"
df = pd.read_csv(fp, compression="zip")

# 将股票代码转成字符串并填充成 6 位
df["股票代码"] = df["股票代码"].apply(lambda x: str(x).zfill(6))

df

使用mplfinance绘制K线图时,对数据的列和索引有要求:

  1. 索引的名称必须是Date,且是DateTimeIndex类型
  2. 用于绘图的5个字段名称必须是OpenCloseLowHighVolume

所以,把上面的数据稍微整理下,变成下面的格式:

python 复制代码
# 修改列名
df = df.rename(
    {
        "日期": "Date",
        "开盘": "Open",
        "收盘": "Close",
        "最低": "Low",
        "最高": "High",
        "成交量": "Volume",
    },
    axis=1,
)

# 将 Date 列设为索引
df.index = df["Date"].astype("datetime64[ns]")
df = df.sort_index()

# 去除不需要的列
df = df.loc[:, ["股票代码", "Open", "Close", "Low", "High", "Volume"]]
df

2. 样式设置

有了上面的数据,就可以挑选其中一只股票,看看默认绘制的图形:

python 复制代码
# 全年数据太多,这里随便选了一支股票
data = df[df["股票代码"] == "601288"]

# 显示其中一段数据显示
mpf.plot(data.iloc[70:200])

默认的图形非常简约,和平时看到的K线图差别挺大的。

2.1. 内置样式

mplfinance内置了很多样式。

python 复制代码
>>> mpf.available_styles()

['binance',
 'binancedark',
 'blueskies',
 'brasil',
 'charles',
 'checkers',
 'classic',
 'default',
 'ibd',
 'kenan',
 'mike',
 'nightclouds',
 'sas',
 'starsandstripes',
 'tradingview',
 'yahoo']

随便挑选几个看看:

python 复制代码
mpf.plot(data.iloc[:50], type="candle", style="binance", title="style biance")
mpf.plot(data.iloc[100:150], type="candle", style="charles", title="sytle charles")
mpf.plot(data.iloc[150:200], type="candle", style="yahoo", title="style yahoo")



2.2. 自定义颜色

除了使用内置的样式,也可以自定义柱子的颜色,比如我不想用传统的红绿色,也可以阳线蓝色阴线黄色

python 复制代码
mc = mpf.make_marketcolors(up='b',down='y')
s  = mpf.make_mpf_style(marketcolors=mc)
mpf.plot(data.iloc[150:200], type="candle", style=s)

3. 绘图定制

经过这么多年的发展,mplfinance非常灵活,可以完成一些特殊的显示要求。

3.1. 特定值颜色

除了改变阳线和阴线的颜色,还可以标记出特定值的颜色。

比如,下面将收盘价(Close)最高和最低的3个值标记成不同的颜色。

python 复制代码
# 紫色和金黄色
mc = mpf.make_marketcolors(up="m", down="gold")
cdata = data.iloc[150:200]

# 收盘价最高和最低的3个值
nmax = cdata["Close"].nlargest(3)
nmin = cdata["Close"].nsmallest(3)

mco = [None]*len(cdata)
for i in range(len(mco)):
    if cdata.iloc[i].name in nmax or cdata.iloc[i].name in nmin:
        mco[i] = mc

mpf.plot(cdata, type="candle", style="yahoo", marketcolor_overrides=mco)

3.2. 添加新的图形

K线图 上除了绘制阳线和阴线的蜡烛图,还可以添加自定义的曲线。

比如,添加一条曲线,表示每天最大值和最小值的平均值。

python 复制代码
lines = [
    mpf.make_addplot((cdata["Low"]+cdata["High"])/2, color="b", width=1),
]
mpf.plot(cdata, type="candle", style="yahoo", addplot=lines)

图中蓝色的线就是每天最大值和最小值的平均值的曲线。

此外,K线图 上可以简单的通过设置参数 volume=True,显示每天交易量的变化。

python 复制代码
mpf.plot(cdata, type="candle", style="yahoo", addplot=lines, volume=True)

4. 动态绘制

最后,再介绍一个动态绘制K线图的方法。

python 复制代码
import matplotlib.animation as animation

s = mpf.make_mpf_style(
    base_mpf_style="yahoo",
    rc={"font.family": "Microsoft YaHei Mono"},
)
pkwargs = dict(type="candle", style=s)

fig, axes = mpf.plot(
    data.iloc[0:200],
    returnfig=True,
    volume=True,
    figsize=(11, 8),
    panel_ratios=(2, 1),
    title="动态显示K线图",
    **pkwargs
)
ax1 = axes[0]
ax2 = axes[1]


def animate(ival):
    cdata = data.iloc[0 : (200 + ival)]
    ax1.clear()
    ax2.clear()
    mpf.plot(cdata, ax=ax1, volume=ax2, **pkwargs)


ani = animation.FuncAnimation(fig, animate, interval=200, frames=10)
ani.save("./ani.gif")

如果你需要实时或者定时(时间间隔比较短)显示股票的信息,那么动态绘制就是你需要的功能。

5. 总结

mplfinance库是一个功能强大且易于使用的Python库,适用于金融数据的可视化,特别是K线图 的绘制。

它的高度可定制化可以让我们方便的把各种分析指标和K线图结合起来显示。

相关推荐
belldeep2 小时前
python:reportlab 将多个图片合并成一个PDF文件
python·pdf·reportlab
FreakStudio4 小时前
全网最适合入门的面向对象编程教程:56 Python字符串与序列化-正则表达式和re模块应用
python·单片机·嵌入式·面向对象·电子diy
丶21364 小时前
【CUDA】【PyTorch】安装 PyTorch 与 CUDA 11.7 的详细步骤
人工智能·pytorch·python
_.Switch5 小时前
Python Web 应用中的 API 网关集成与优化
开发语言·前端·后端·python·架构·log4j
一个闪现必杀技5 小时前
Python入门--函数
开发语言·python·青少年编程·pycharm
小鹿( ﹡ˆoˆ﹡ )6 小时前
探索IP协议的神秘面纱:Python中的网络通信
python·tcp/ip·php
卷心菜小温6 小时前
【BUG】P-tuningv2微调ChatGLM2-6B时所踩的坑
python·深度学习·语言模型·nlp·bug
陈苏同学6 小时前
4. 将pycharm本地项目同步到(Linux)服务器上——深度学习·科研实践·从0到1
linux·服务器·ide·人工智能·python·深度学习·pycharm
唐家小妹6 小时前
介绍一款开源的 Modern GUI PySide6 / PyQt6的使用
python·pyqt
羊小猪~~7 小时前
深度学习项目----用LSTM模型预测股价(包含LSTM网络简介,代码数据均可下载)
pytorch·python·rnn·深度学习·机器学习·数据分析·lstm