—————————————————————————————————————————————
在金融市场中,K线图是一种用来表现股票价格波动情况的图表。它通过表示股票开盘价、收盘价、最高价和最低价来描绘一段时间内的股票变化趋势。
本篇文章将要介绍如何使用 Python 的 pyecharts 库来绘制指定股票日期内的 K 线图和成交量图,并添加移动平均线。
首先需要安装需要的库:
pip install akshare pandas pyecharts
ps:如果下载慢请看pip命令镜像源、镜像源、pip安装库、python、python镜像源、清华镜像源配置
akshare是一个基于Python的开源金融数据接口库,提供了对股票、基金、期货、债券、外汇等金融市场数据的获取和处理功能,同时还包括宏观经济数据和区块链相关数据等。
使用akshare,用户可以通过简单的Python代码轻松获取各种金融数据,并进行相应的数据处理和分析。akshare所提供的数据接口都来自于一些公开的金融数据平台,如新浪财经、东方财富等。
除此之外,akshare还提供了一些常用的数据可视化工具,例如K线图、面积图、条形图等,方便用户对所获取的数据进行图表展示。同时,akshare还支持多种数据格式的导入和导出,如CSV、Excel等,便于用户将数据集成到自己的工作流程中。
导入相关库:
pyecharts是一个基于Python的开源可视化库,用于生成各种类型的交互式图表。它是由Apache ECharts团队开发的,因此所有的图表都使用ECharts作为底层渲染引擎,可以生成高质量、美观、交互性强的可视化图表。
pyecharts支持多种图表类型,包括折线图、柱状图、散点图、饼图、雷达图、地图等。此外,pyecharts还支持自定义主题和样式,使得用户可以轻松实现自己需要的图表效果。
在数据方面,pyecharts支持多种数据格式的导入,如CSV、Excel、JSON等,同时还支持与pandas等数据处理库集成,方便用户快速生成可视化图表。
在交互方面,pyecharts提供了鼠标悬停、点击、缩放、平移等功能,用户可以通过这些交互方式更加直观地理解数据。
pandas是一个基于Python的强大数据处理库,它提供了高效的数据操作和分析工具,能够方便地处理各种结构化数据。
pandas主要包含两个核心数据结构:Series和DataFrame。其中,Series用于表示一维数组,类似于Python中的列表,但支持更多的数据类型和操作;而DataFrame则是一个二维表格,每列可以有不同的数据类型,并且可以进行行列索引以及基于标签、位置等方式的数据选择和操作。
pandas支持从各种数据源读取数据,如CSV、Excel、SQL数据库、JSON等,同时也支持将数据写入这些数据源。除此之外,pandas还提供了强大的数据处理和分析功能,如数据清洗、合并、排序、聚合、透视等,以及时间序列数据分析和统计建模等高级分析工具。
import time
import akshare as ak
import pandas as pd
from pyecharts.charts import *
from pyecharts import options as opts
import datetime
在这个示例中,我们将绘制股票代码为“002318”、起始日期为60天前到当前日期的K线图和成交量图。
now = datetime.datetime.now()
yyyymmdd = '%04d%02d%02d'%(now.year,now.month,now.day)
last_month = datetime.datetime.today()-datetime.timedelta(days=60)
l_yyyymmdd = '%04d%02d%02d'%(last_month.year,last_month.month,last_month.day)
df = ak.stock_zh_a_hist(symbol="002318", start_date=f'{l_yyyymmdd}', end_date=f'{yyyymmdd}', adjust="qfq").iloc[:, [0,1,2,3,4,5,7]]
akshare 库提供了一个名为 stock_zh_a_hist 的函数,用于获取 A 股历史行情数据。我们将从60天前(last_month)到现在(now)获取股票代码为 “002318” 的历史行情数据,该数据经过前复权处理( adjust (调整) =“qfq”)。
接下来,对数据进行处理,设置 index (指数) 并新建列:
# 把date作为日期索引
df.index = pd.to_datetime(df.date)
df.index = df.index.strftime('%Y%m%d')
df = df.sort_index()
df['sma'] = df.close.rolling(5).mean()
df['lma'] = df.close.rolling(10).mean()
df['lma20'] = df.close.rolling(20).mean()
df['lma30'] = df.close.rolling(30).mean()
df['lma60'] = df.close.rolling(60).mean()
将 date (日期) 列设为 DataFrame 的 index (指数) ,并把日期格式转换成 %Y%m%d 的字符串格式。然后按日期排序,添加五种不同的移动平均线:MA5、MA10、MA20、MA30 和 MA60。
接下来,我们将使用 pyecharts 创建 K 线图及均线。
kline = (
Kline(init_opts=opts.InitOpts(width="600px", height="300px"))
.add_xaxis(xaxis_data=list(df.index)) # X轴数据
.add_yaxis(
series_name="klines", # 序列名称
y_axis=df[["open", "close", "low", "high"]].values.tolist(), # Y轴数据
itemstyle_opts=opts.ItemStyleOpts(color="#ec0000", color0="#00da3c"),
markpoint_opts=opts.MarkPointOpts(
data=[ # 添加标记符
opts.MarkPointItem(type_='max', name='最大值',value_index=4),
opts.MarkPointItem(type_='min', name='最小值',value_index=3), ],
# symbol='circle',
# symbol_size=[100,30]
),
)
.set_global_opts(
title_opts=opts.TitleOpts(title="K线及均线", pos_left='45%'), # 标题位置
legend_opts=opts.LegendOpts(pos_right="35%", pos_top="5%"), # 图例位置
# legend_opts=opts.LegendOpts(is_show=True, pos_bottom=10, pos_left="center"),
datazoom_opts=[
opts.DataZoomOpts(
is_show=False,
type_="inside", # 内部缩放
xaxis_index=[0, 1], # x轴和y轴都缩放 range_start=0, # 起始位置为0% range_end=100, # 结束位置为100% ), yaxis_opts= opts (选择) .AxisOpts(is_scale=True), # Y轴刻度自适应 ) )
添加 MA5 ,MA10,MA20,MA30,MA60折线图
line_ma5 = ( Line().add_xaxis(xaxis_data=list(df.index )).add_yaxis( series_name="MA5", y_axis=df['sma'].values.tolist(), is_smooth=True, linestyle_opts= opts.LineStyleOpts( width =2, opacity=0.5), label_opts= opts.LabelOpts(is_show=False), ) )
line_ma10 = ( Line().add_xaxis(xaxis_data=list(df.index )).add_yaxis( series_name="MA10", y_axis=df['lma'].values.tolist(), is_smooth=True, linestyle_opts= opts.LineStyleOpts( width =2, opacity=0.5), label_opts= opts.LabelOpts(is_show=False), ) )
line_ma20 = ( Line().add_xaxis(xaxis_data=list(df.index )).add_yaxis( series_name="MA20", y_axis=df['lma20'].values.tolist(), is_smooth=True, linestyle_opts= opts.LineStyleOpts( width =2, opacity=0.5), label_opts= opts.LabelOpts(is_show=False), ) )
line_ma30 = ( Line().add_xaxis(xaxis_data=list(df.index )).add_yaxis( series_name="MA30", y_axis=df['lma30'].values.tolist(), is_smooth=True, linestyle_opts= opts.LineStyleOpts( width =2, opacity=0.5), label_opts= opts.LabelOpts(is_show=False), ) )
画出成交量柱状图,并将所有图添加到grid中生成最后的html
bar = (
Bar()
.add_xaxis(xaxis_data=list(df.index)) # X轴数据
.add_yaxis(
series_name="volume",
y_axis=df["volume"].tolist(), # Y轴数据
xaxis_index=1,
yaxis_index=1,
label_opts=opts.LabelOpts(is_show=False),
itemstyle_opts=opts.ItemStyleOpts(color='#ef232a' # '#14b143'
),
)
.set_global_opts(
xaxis_opts=opts.AxisOpts(
type_="category", # 坐标轴类型-离散数据
grid_index=1,
axislabel_opts=opts.LabelOpts(is_show=False),
),
legend_opts=opts.LegendOpts(is_show=False),
)
.overlap(line_ma5)
.overlap(line_ma10)
.overlap(line_ma20)
)
# 图像排列
grid_chart = Grid(
init_opts=opts.InitOpts(
width="1600px", # 显示图形宽度
height="800px",
animation_opts=opts.AnimationOpts(animation=False), # 关闭动画
)
)
grid_chart.add( # 加入均线图
kline,
grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", height="30%"),
)
grid_chart.add( # 加入成交量图
bar,
grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", pos_top="40%", height="20%"),
)
grid_chart.render("volume.html")