嗨,我是花姐。
前几天,一个刚入门的粉丝私信我问:“花姐,K线图怎么用Python画?是不是很难?”
作为最宠粉丝的花姐,今天必须给我们这位粉丝安排上一期Python绘制K线的教程。
行情数据我们还是用老搭档xtquant+MiniQMT。具体代码如下:
import pandas as pd
from xtquant import xtdata
def get_hq(code,start_date='19900101',period='1d',dividend_type='front',count=-1):
'''
基于xtquant下载某个股票的历史行情
盘中运行最后一个K里存了最新的行情
period 1m、5m、1d
dividend_type - 除权方式,用于K线数据复权计算,对tick等其他周期数据无效
none 不复权
front 前复权
back 后复权
front_ratio 等比前复权
back_ratio 等比后复权
'''
xtdata.enable_hello = False
if period not in['1m','5m','1d'] and 'm' in period:
# 除了1m和5m的其它级别的需要先下载5m的
xtdata.download_history_data(stock_code=code, period='5m', incrementally=True,start_time=start_date)
else:
xtdata.download_history_data(stock_code=code, period=period, incrementally=True,start_time=start_date)
history_data = xtdata.get_market_data_ex([], [code], period=period, count=count, dividend_type=dividend_type,start_time=start_date,fill_data=False)
df = history_data[code]
if 'd' in period:
df.index = pd.to_datetime(df.index.astype(str), format='%Y%m%d')
if 'm' in period:
df.index = pd.to_datetime(df.index.astype(str), format='%Y%m%d%H%M%S')
df['time'] = df.index
# 将列名 'date' 改为 'time'
df.rename(columns={'time': 'date'}, inplace=True)
return df
1️⃣ mplfinance:最“正宗”的那一个
说mplfinance之前,先问个问题——你听过matplotlib吧?对,就是那个最古老的画图工具。mplfinance其实就是它的“股票分支”。
你可能在想,那不就老古董了吗?
还真不是。虽然它长得老气,但胜在稳、清晰、社区活跃。如果你想追求那种传统交易软件风格的K线图,它是首选。
怎么安装:
pip install mplfinance
来看个例子:
import mplfinance as mpf
df = get_hq('000001.SZ',start_date='20240101',period='1d')
# 直接开画
mpf.plot(df, type='candle', volume=True, style='charles')
是不是有点意外?一行就搞定。图表那叫一个清清爽爽,交易量也一并带上了,适合搞策略的时候对照用。
很多朋友第一次用 mplfinance
画出来的K线图,发现颜色是默认的——绿涨红跌,看着就别扭。因为我们中国股民看惯了 红涨绿跌,这点“文化差异”属实影响观感😂
那么——mplfinance 可以改颜色吗?能!而且很简单!
# 直接开画
import mplfinance as mpf
import pandas as pd
df = get_hq('000001.SZ',start_date='20240101',period='1d')
# 自定义红涨绿跌的颜色风格
my_style = mpf.make_mpf_style(
base_mpf_style='charles', # 继承基础风格
marketcolors=mpf.make_marketcolors(
up='red', # 涨:红色
down='green', # 跌:绿色
edge='inherit', # K线边框颜色(inherit 表示继承 up/down 颜色)
wick='inherit', # 上下影线颜色
volume='inherit' # 成交量颜色
)
)
# 绘图
mpf.plot(df, type='candle', style=my_style, volume=True)
2️⃣ plotly:帅!炫!高端局必备
我本人对plotly体感一直很好,因为它酷到发光。鼠标一点,图表能动,能缩放,能弹窗。你在网页上一丢,专业感直接拉满。
安装:
pip install plotly
看代码:
import plotly.graph_objects as go
import pandas as pd
df = get_hq('000001.SZ',start_date='20240101',period='1d')
fig = go.Figure(data=[go.Candlestick(
x=df['date'],
open=df['open'],
high=df['high'],
low=df['low'],
close=df['close']
)])
fig.show()
是不是有点像Web前端的味道?是的,它是前端出生的。如果你想搞个web版本的量化系统,强烈推荐plotly
plotly也是默认是 绿色涨、红色跌,这跟我们大A市场的“红涨绿跌”正好相反,观感怪怪的。
不过好消息是,我们可以用 increasing_line_color
和 decreasing_line_color
参数,就能搞定!
fig = go.Figure(data=[go.Candlestick(
x=df['date'],
open=df['open'],
high=df['high'],
low=df['low'],
close=df['close'],
increasing_line_color='red', # 涨 = 红
decreasing_line_color='green' # 跌 = 绿
)])
3️⃣ pyecharts:爱国者必备国产包,颜值高,还能上大屏!
如果你是做量化报告或者要在公司里搞个展示,pyecharts真的适合你。国产出品,文档中文,全套Echarts功能打包奉上。配上Flask一跑,老板都得点赞。
来,贴个例子:
from pyecharts.charts import Kline
from pyecharts.options import TitleOpts, TooltipOpts
import pandas as pd
df = get_hq('000001.SZ',start_date='20240101',period='1d')
kline = Kline()
kline.add_xaxis(list(df['date']))
kline.add_yaxis("K线图", df[['open', 'close', 'low', 'high']].values.tolist())
kline.set_global_opts(title_opts=TitleOpts(title="股票K线图"), tooltip_opts=TooltipOpts(trigger="axis"))
kline.render("kline.html")
你没看错,顺序是 open、close、low、high。和其他包不一样,是的,挺魔性🤣。
但美是真美!不光能动,还能上大屏,动效拉满,适合场面活儿。
详细教程你可以参考花姐之前写的文章: 《用 Python 画 K 线图,做量化的朋友一定要掌握的技能》
4️⃣ finplot:量化圈的隐藏高手
我之前在逛外国论坛时才发现它,速度快到飞起,专门为金融数据优化的,特别适合画超大数据量的K线图。最骚的是,它能嵌入PyQt界面,用起来有点像专业交易软件。
安装:
pip install finplot
安装包的时候会自动安装pyQT等依赖
代码是这样的:
import finplot as fplt
import pandas as pd
df = get_hq('000001.SZ',start_date='20240101',period='1d')
fplt.candlestick_ochl(df[['open', 'close', 'high', 'low']])
fplt.show()
那么问题来了……该选哪个?
我来拍板:搞量化策略的话,mplfinance 是最合适的。
为啥?
✅ 稳定可靠 ✅ 数据结构友好(Pandas直接喂) ✅ 图清晰,能加均线、交易量、画标记 ✅ 没有太多学习成本,适合直接用
当然,如果你想搞炫酷的网页展示,plotly 、 pyecharts 更合适,搞windows界面,一定要用finplot。但搞策略——清爽简洁第一位。别被动效迷了眼。
如果你看到这儿,说明你真的是个有心的读者。那就顺手给我点个“在看”吧,不然我可就耍脾气不更新啦😂
我们下篇见👋
—— 花姐