现在位置: 首页 > Python 量化交易 > 正文

Python 量化股票 K 线图

我们可以通过 Python pyecharts 模块来绘制股票 K 线图。

pyecharts 是一个基于 ECharts 的 Python 数据可视化库,它允许用户使用 Python 语言生成各种类型的交互式图表和数据可视化。

Python pyecharts 模块内容查看:Python pyecharts 模块

在 pyecharts 中,可以使用 K 线图(Kline)来展示股票走势,K 线图主要用于展示金融数据,如股票的开盘价、收盘价、最高价、最低价等信息。

首先,确保你已经安装了 pyecharts:

pip install pyecharts

我们使用雅虎财经(Yahoo Finance)的数据获取近一年的股票数据,我们可以使用 yfinance 库:

pip install yfinance

K 线图使用

导入相关模块:

from pyecharts import options as opts
from pyecharts.charts import Kline

准备数据:

Kline 图的数据通常是一个包含开盘价、收盘价、最高价、最低价的二维数组,例如:

data = [
    [2320.26, 2320.26, 2287.3, 2362.94],
    [2300, 2291.3, 2288.26, 2308.38],
    # ...
]

配置 Kline 图:

kline = (
    Kline()
    .add_xaxis(xaxis_data=["2017-10-24", "2017-10-25", "2017-10-26", "2017-10-27"])
    .add_yaxis(series_name="Kline", y_axis=data)
    .set_global_opts(
        xaxis_opts=opts.AxisOpts(is_scale=True),
        yaxis_opts=opts.AxisOpts(is_scale=True),
        title_opts=opts.TitleOpts(title="Kline 示例"),
    )
)

在这里,使用了 add_xaxis 设置 x 轴的数据,使用 add_yaxis 添加 Kline 数据系列,set_global_opts 则用于设置全局配置,包括标题等。

渲染图表:

kline.render("kline_chart.html")

将 Kline 图渲染到 HTML 文件中。

实例

from pyecharts import options as opts
from pyecharts.charts import Kline

# 准备数据
data = [
    [2320.26, 2320.26, 2287.3, 2362.94],
    [2300, 2291.3, 2288.26, 2308.38],
    [2295.35, 2346.5, 2295.35, 2345.92],
    [2347.22, 2358.98, 2337.35, 2363.8],
    # ... more data
]

# 配置 Kline 图
kline = (
    Kline()
    .add_xaxis(xaxis_data=["2017-10-24", "2017-10-25", "2017-10-26", "2017-10-27"])
    .add_yaxis(series_name="Kline", y_axis=data)
    .set_global_opts(
        xaxis_opts=opts.AxisOpts(is_scale=True),
        yaxis_opts=opts.AxisOpts(is_scale=True),
        title_opts=opts.TitleOpts(title="Kline 示例"),
    )
)

# 渲染图表
kline.render("kline_chart.html")

说明:

  • 我们有一个名为 data 的数据集,其中包含每天的金融数据,包括开盘价、收盘价、最高价和最低价。
  • 我们创建了一个 Kline 实例,使用 add_xaxis 设置 x 轴数据(在这种情况下是日期),使用 add_yaxis 添加 Kline 数据系列。
  • 使用 set_global_opts 设置全局选项,例如 x 轴和 y 轴的缩放,以及图表标题。
  • 最后,我们使用 render 将图表渲染到一个 HTML 文件中。

当前目录会生成一个 kline_chart.html 文件,打开该文件图表显示如下:

下面是一个实例代码,演示如何获取贵州茅台的股票数据并生成 K 线图:

实例

import yfinance as yf
from pyecharts import options as opts
from pyecharts.charts import Kline

# 获取贵州茅台近三年的股票数据
symbol = '600519.SS'  # 600519.SS 为贵州茅台的股票代码
start_date = '2020-01-01'
end_date = '2022-12-31'

stock_data = yf.download(symbol, start=start_date, end=end_date)

# 提取 K 线图所需的数据格式
kline_data = []
for index, row in stock_data.iterrows():
    kline_data.append([row['Open'], row['Close'], row['Low'], row['High']])

# 配置 Kline 图
kline = (
    Kline()
    .add_xaxis(xaxis_data=stock_data.index.strftime('%Y-%m-%d').tolist())
    .add_yaxis(series_name="Kline", y_axis=kline_data)
    .set_global_opts(
        xaxis_opts=opts.AxisOpts(is_scale=True),
        yaxis_opts=opts.AxisOpts(is_scale=True),
        title_opts=opts.TitleOpts(title="贵州茅台 Kline 图示例"),
        datazoom_opts=[opts.DataZoomOpts()],
        toolbox_opts=opts.ToolboxOpts(
            feature={
                "dataZoom": {"yAxisIndex": "none"},
                "restore": {},
                "saveAsImage": {},
            }
        ),
    )
)

# 渲染图表
kline.render("maotai_kline_chart.html")

当前目录会生成一个 maotai_kline_chart.html 文件,打开该文件图表显示如下:

绘制曲线图

我们也可以使用 pyecharts 绘制股票的简单曲线图,以茅台(600519.SH)为例:

实例

import yfinance as yf
from pyecharts import options as opts
from pyecharts.charts import Line
from datetime import datetime, timedelta

# 设置茅台股票代码
stock_code = "600519.SS"

# 获取当前日期
end_date = datetime.now().strftime('%Y-%m-%d')

# 计算三年前的日期
start_date = (datetime.now() - timedelta(days=3 * 365)).strftime('%Y-%m-%d')

# 使用yfinance获取股票数据
df = yf.download(stock_code, start=start_date, end=end_date)

# 提取数据中的日期和收盘价
dates = df.index.strftime('%Y-%m-%d').tolist()
closing_prices = df['Close'].tolist()

# 创建 Line 图表
line_chart = Line()
line_chart.add_xaxis(xaxis_data=dates)
line_chart.add_yaxis(series_name="茅台股价走势",
                     y_axis=closing_prices,
                     markline_opts=opts.MarkLineOpts(
                         data=[opts.MarkLineItem(type_="average", name="平均值")]
                     )
                     )
line_chart.set_global_opts(
    title_opts=opts.TitleOpts(title="茅台股价走势图(近三年)"),
    xaxis_opts=opts.AxisOpts(type_="category"),
    yaxis_opts=opts.AxisOpts(is_scale=True),
    datazoom_opts=[opts.DataZoomOpts(pos_bottom="-2%")],
)

# 渲染图表
line_chart.render("maotai_stock_trend_chart.html")

当前目录会生成一个 maotai_stock_trend_chart.html 文件,打开该文件图表显示如下:

可以考虑添加一些图表的工具,例如数据缩放、数据视图等,以提升用户的交互体验。

以下是优化后的代码,添加了数据缩放和数据视图的功能:

实例

import yfinance as yf
from pyecharts import options as opts
from pyecharts.charts import Line
from pyecharts.commons.utils import JsCode
from datetime import datetime, timedelta

# 设置茅台股票代码
stock_code = "600519.SS"

# 获取当前日期
end_date = datetime.now().strftime('%Y-%m-%d')

# 计算三年前的日期
start_date = (datetime.now() - timedelta(days=3 * 365)).strftime('%Y-%m-%d')

# 使用yfinance获取股票数据
df = yf.download(stock_code, start=start_date, end=end_date)

# 提取数据中的日期和收盘价
dates = df.index.strftime('%Y-%m-%d').tolist()
closing_prices = df['Close'].tolist()

# 创建 Line 图表
line_chart = Line()
line_chart.add_xaxis(xaxis_data=dates)
line_chart.add_yaxis(series_name="茅台股价走势",
                     y_axis=closing_prices,
                     markline_opts=opts.MarkLineOpts(
                         data=[opts.MarkLineItem(type_="average", name="平均值")]
                     )
                     )
line_chart.set_global_opts(
    title_opts=opts.TitleOpts(title="茅台股价走势图(近三年)"),
    xaxis_opts=opts.AxisOpts(type_="category"),
    yaxis_opts=opts.AxisOpts(is_scale=True),
    datazoom_opts=[
        opts.DataZoomOpts(
            pos_bottom="-2%",
            range_start=0,
            range_end=100,
            type_="inside"
        ),
        opts.DataZoomOpts(
            pos_bottom="-2%",
            range_start=0,
            range_end=100,
            type_="slider",
        ),
    ],
    toolbox_opts=opts.ToolboxOpts(
        feature={
            "dataZoom": {"yAxisIndex": "none"},
            "restore": {},
            "saveAsImage": {},
        }
    ),
)

# 渲染图表
line_chart.render("maotai_stock_trend_chart2.html")

当前目录会生成一个 maotai_stock_trend_chart2.html 文件,打开该文件图表显示如下: