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

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

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

pip install --upgrade mplfinance

1. 数据准备

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

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

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

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

image.png

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

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

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

# 修改列名
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

image.png

2. 样式设置

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

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

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

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

2.1. 内置样式

mplfinance内置了很多样式。

>>> mpf.available_styles()

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

随便挑选几个看看:

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")

image.png
image.png
image.png

2.2. 自定义颜色

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

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)

image.png

3. 绘图定制

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

3.1. 特定值颜色

除了改变阳线和阴线的颜色,还可以标记出特定值的颜色。
比如,下面将收盘价(Close)最高和最低的3个值标记成不同的颜色。

# 紫色和金黄色
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)

image.png

3.2. 添加新的图形

K线图上除了绘制阳线和阴线的蜡烛图,还可以添加自定义的曲线。
比如,添加一条曲线,表示每天最大值和最小值的平均值。

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

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

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

mpf.plot(cdata, type="candle", style="yahoo", addplot=lines, volume=True)

image.png

4. 动态绘制

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

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")

1.gif

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

5. 总结

mplfinance库是一个功能强大且易于使用的Python库,适用于金融数据的可视化,特别是K线图的绘制。
它的高度可定制化可以让我们方便的把各种分析指标和K线图结合起来显示。

---------------------------END---------------------------

题外话

感谢你能看到最后,给大家准备了一些福利!

感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。


👉CSDN大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

img

二、Python兼职渠道推荐*

学的同时助你创收,每天花1-2小时兼职,轻松稿定生活费.
在这里插入图片描述

三、最新Python学习笔记

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

img

四、实战案例

纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

img

👉CSDN大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)

若有侵权,请联系删除

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐