当前位置: 首页 > 工具软件 > AKShare > 使用案例 >

akshare、pyecharts、pandas实现指定A股股票K线、成交量图(可缩放、可指定日期)

闾丘正志
2023-12-01

用pyecharts画出股票K线图和成交量的方法

—————————————————————————————————————————————
在金融市场中,K线图是一种用来表现股票价格波动情况的图表。它通过表示股票开盘价、收盘价、最高价和最低价来描绘一段时间内的股票变化趋势。

本篇文章将要介绍如何使用 Python 的 pyecharts 库来绘制指定股票日期内的 K 线图和成交量图,并添加移动平均线。

首先需要安装需要的库:

pip install akshare pandas pyecharts

ps:如果下载慢请看pip命令镜像源、镜像源、pip安装库、python、python镜像源、清华镜像源配置

关于akshare

  1. akshare是一个基于Python的开源金融数据接口库,提供了对股票、基金、期货、债券、外汇等金融市场数据的获取和处理功能,同时还包括宏观经济数据和区块链相关数据等。

  2. 使用akshare,用户可以通过简单的Python代码轻松获取各种金融数据,并进行相应的数据处理和分析。akshare所提供的数据接口都来自于一些公开的金融数据平台,如新浪财经、东方财富等。

  3. 除此之外,akshare还提供了一些常用的数据可视化工具,例如K线图、面积图、条形图等,方便用户对所获取的数据进行图表展示。同时,akshare还支持多种数据格式的导入和导出,如CSV、Excel等,便于用户将数据集成到自己的工作流程中。
    导入相关库:

关于pyecharts

  1. pyecharts是一个基于Python的开源可视化库,用于生成各种类型的交互式图表。它是由Apache ECharts团队开发的,因此所有的图表都使用ECharts作为底层渲染引擎,可以生成高质量、美观、交互性强的可视化图表。

  2. pyecharts支持多种图表类型,包括折线图、柱状图、散点图、饼图、雷达图、地图等。此外,pyecharts还支持自定义主题和样式,使得用户可以轻松实现自己需要的图表效果。

  3. 在数据方面,pyecharts支持多种数据格式的导入,如CSV、Excel、JSON等,同时还支持与pandas等数据处理库集成,方便用户快速生成可视化图表。

  4. 在交互方面,pyecharts提供了鼠标悬停、点击、缩放、平移等功能,用户可以通过这些交互方式更加直观地理解数据。

关于pandas

  1. pandas是一个基于Python的强大数据处理库,它提供了高效的数据操作和分析工具,能够方便地处理各种结构化数据。

  2. pandas主要包含两个核心数据结构:Series和DataFrame。其中,Series用于表示一维数组,类似于Python中的列表,但支持更多的数据类型和操作;而DataFrame则是一个二维表格,每列可以有不同的数据类型,并且可以进行行列索引以及基于标签、位置等方式的数据选择和操作。

  3. 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")
 类似资料: