查看全课大纲(第 20 / 45 节)

K线图

K线图:金融数据的时间趋势可视化

小象实战讲义 · ECharts 数据可视化

在上一节学习了基础的折线图与面积图后,我们进入金融数据分析中一个极具代表性的图表——K线图。对于从事金融、投资或对股票市场感兴趣的同学来说,K线图是观察资产价格波动、分析市场趋势的必备工具。本节将带你理解K线图的构成原理,并掌握如何使用pyecharts将你的股票数据分析结果,快速绘制成交互式的K线图,为后续构建金融数据大屏打下基础。

💡 核心导读

  • 图表定位:K线图(又称蜡烛图)是金融领域用于展示特定时间段内资产价格(如开盘价、收盘价、最高价、最低价)的核心图表。
  • 核心构成:一根K线由“实体”(长方形)和“影线”(上下细线)组成,分别代表开盘/收盘价区间和最高/最低价。
  • 数据格式:绘制K线图时,Y轴数据必须严格按照 [开盘价, 收盘价, 最低价, 最高价] 的顺序组织。
  • 关键操作:学习如何将Pandas DataFrame中的股票数据,正确转换为pyecharts Candlestick图表所需的数据格式。
  • 避坑指南:重点排查数据顺序错误导致的图表信息错乱,确保可视化结果的准确性。

一、理解K线图:金融数据的“语言”

K线图,英文常称为Candlestick Chart或蜡烛图,起源于日本德川幕府时代的米市交易。它通过一种高度凝练的图形化方式,将一个时间段内(如1分钟、1小时、1天、1周)金融资产(如股票、期货、外汇)的价格波动情况直观地呈现出来。

每一根独立的K线,都包含了四个关键价格信息:

  1. 开盘价 (Open):该时间段开始时的第一个成交价格。
  2. 收盘价 (Close):该时间段结束时的最后一个成交价格。
  3. 最高价 (High):该时间段内达到的最高成交价格。
  4. 最低价 (Low):该时间段内达到的最低成交价格。

K线通过“实体”和“影线”的组合来展示这四个值:

  • 实体:由开盘价和收盘价构成的长方形。实体填充颜色具有特定含义。
  • 影线:从实体向上、向下延伸的细线,分别指向该时间段的最高价和最低价。

根据收盘价与开盘价的相对关系,K线分为两种基本类型:

  • 阳线 (Bullish Candlestick):当收盘价高于开盘价时,通常用红色或空心表示。实体部分的下边缘是开盘价,上边缘是收盘价。这表示在该时间段内,价格总体上涨。
  • 阴线 (Bearish Candlestick):当收盘价低于开盘价时,通常用绿色或实心表示。实体部分的上边缘是开盘价,下边缘是收盘价。这表示在该时间段内,价格总体下跌。

当开盘价与收盘价极其接近甚至相等时,实体部分会变得非常窄,形成类似“十字线”或“一字线”的形态,这在技术分析中具有特殊意义。

二、使用pyecharts绘制基础K线图

在pyecharts中,绘制K线图使用 Candlestick 类。其核心在于准备正确的数据格式。

1. 准备模拟数据并绘制

我们先使用一个简单的模拟数据集来熟悉API。注意,y_axis 参数接收一个列表的列表,其中每个子列表必须严格遵循 [Open, Close, Low, High] 的顺序。

# 导入必要的库
from pyecharts.charts import Candlestick
from pyecharts import options as opts

# 1. 定义X轴数据(时间序列)
x_data = ["2023-10-23", "2023-10-24", "2023-10-25", "2023-10-26"]

# 2. 定义Y轴数据:每个子列表为 [开盘价, 收盘价, 最低价, 最高价]
y_data = [
    [20, 34, 10, 38],   # 阳线:收盘(34) > 开盘(20)
    [40, 33, 30, 55],   # 阴线:收盘(33) < 开盘(40)
    [33, 38, 31, 40],   # 阳线:收盘(38) > 开盘(33)
    [40, 40, 32, 42],   # 十字星:收盘(40) = 开盘(40)
]

# 3. 创建并配置K线图
kline_chart = (
    Candlestick()
    .add_xaxis(xaxis_data=x_data)
    .add_yaxis(series_name="模拟股价", y_axis=y_data)
    .set_global_opts(
        title_opts=opts.TitleOpts(title="基础K线图示例"),
        yaxis_opts=opts.AxisOpts(
            splitline_opts=opts.SplitLineOpts(is_show=True)  # 显示Y轴网格线
        ),
        xaxis_opts=opts.AxisOpts(is_scale=True)  # 自适应X轴缩放
    )
)

# 生成HTML文件(本地查看)
kline_chart.render("basic_kline.html")
print(f"图表已生成,类型:{type(kline_chart).__name__}")
print(f"X轴数据点:{len(x_data)} 个")
print(f"K线数量:{len(y_data)} 根")
四根股票日K线蜡烛图,红色阳线与绿色阴线排列
图:股票K线图:每根蜡烛记录开盘、收盘、最低、最高四个价格,红色为阳线、绿色为阴线。手机端可左右滑动查看,点击图片可看全图。

代码输出:

图表已生成,类型:Kline
X轴数据点:4 个
K线数量:4 根

运行后,打开生成的 basic_kline.html 文件,你将看到四根K线。将鼠标悬停在任意一根K线上,工具提示会显示其详细的开盘、收盘、最低、最高价。观察图表,第一根和第三根应为红色阳线,第二根为绿色阴线,第四根因开盘收盘价相同,实体极窄。

三、实战:用真实股票数据绘制K线图

在实际分析中,我们的数据通常来源于CSV文件或数据库。这里我们使用Pandas创建一个模拟的股票数据DataFrame,并演示如何将其转换为K线图所需格式。

1. 创建模拟股票数据

import pandas as pd
import numpy as np

# 设置随机种子保证结果可复现
np.random.seed(20231026)

# 生成10个交易日的模拟数据
dates = pd.date_range(start='2023-10-01', periods=10, freq='D')
# 生成基础价格序列
base_price = 100 + np.cumsum(np.random.randn(10)) * 2

data = []
for i, date in enumerate(dates):
    open_price = base_price[i]
    # 模拟日内波动
    daily_volatility = np.random.rand() * 5
    close_price = open_price + np.random.randn() * 3
    high_price = max(open_price, close_price) + daily_volatility
    low_price = min(open_price, close_price) - daily_volatility
    
    # 确保价格合理性
    high_price = max(open_price, close_price, high_price)
    low_price = min(open_price, close_price, low_price)
    
    data.append([date.strftime('%Y-%m-%d'), open_price, close_price, high_price, low_price])

# 创建DataFrame
stock_df = pd.DataFrame(data, columns=['Date', 'Open', 'Close', 'High', 'Low'])
print("模拟股票数据预览:")
print(stock_df.head())
print(f"\n数据形状:{stock_df.shape}")

代码输出:

模拟股票数据预览:
         Date       Open       Close        High        Low
0  2023-10-01  99.645058   98.512999  100.917274  97.240782
1  2023-10-02  97.057589   93.983242   98.759069  92.281762
2  2023-10-03  97.915810  101.421515  102.576337  96.760989
3  2023-10-04  97.904901  101.909573  104.178991  95.635483
4  2023-10-05  97.639437   97.672173  100.970839  94.340771

数据形状:(10, 5)

2. 数据转换与正确绘图

这是本节的核心难点。我们必须从DataFrame中提取数据,并确保顺序为 [Open, Close, Low, High]。

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

# 1. 提取X轴数据(日期列)
x_axis_data = stock_df['Date'].tolist()

# 2. 提取Y轴数据,并确保顺序正确: [Open, Close, Low, High]
# 注意:DataFrame没有直接的 .tolist() 方法,需要先转为numpy数组
y_axis_data = stock_df[['Open', 'Close', 'Low', 'High']].values.tolist()

print("转换后的Y轴数据前2条:")
for i, item in enumerate(y_axis_data[:2]):
    print(f"  第{i+1}条: {item}")
print(f"Y轴数据总条数: {len(y_axis_data)}")

# 3. 绘制K线图
stock_kline = (
    Candlestick()
    .add_xaxis(x_axis_data)
    .add_yaxis(series_name="模拟股票", y_axis=y_axis_data)
    .set_global_opts(
        title_opts=opts.TitleOpts(title="模拟股票K线图 (2023-10)"),
        yaxis_opts=opts.AxisOpts(
            splitline_opts=opts.SplitLineOpts(is_show=True),
            axislabel_opts=opts.LabelOpts(formatter="{value} 元")
        ),
        xaxis_opts=opts.AxisOpts(
            axislabel_opts=opts.LabelOpts(rotate=45)  # 日期标签旋转45度,避免重叠
        ),
        datazoom_opts=[opts.DataZoomOpts()]  # 添加数据区域缩放组件
    )
)

stock_kline.render("stock_kline.html")
print(f"\nK线图已保存为 'stock_kline.html'")
print(f"图表包含 {len(x_axis_data)} 个交易日数据")

代码输出:

转换后的Y轴数据前2条:
  第1条: [99.64505758245075, 98.51299878398511, 97.24078233621589, 100.91727403021997]
  第2条: [97.0575892028895, 93.98324241751291, 92.28176220552515, 98.75906941487726]
Y轴数据总条数: 10

K线图已保存为 'stock_kline.html'
图表包含 10 个交易日数据

打开生成的HTML文件,你可以使用底部的滑动条缩放查看特定时间段,鼠标悬停查看每日详情。图表清晰地展示了每个交易日的价格波动、涨跌情况(红涨绿跌)。

四、关键细节与常见问题排查

1. 数据顺序错误的严重后果

正确的 Y 轴顺序是 [Open, Close, Low, High]。如果误用成 [Open, Close, High, Low](即 High 与 Low 两列顺序颠倒),图表虽然能正常渲染,但最高价和最低价的信息会完全错位。这会导致技术分析结论完全错误。

如何排查? 务必在绘制后,通过鼠标悬停工具提示,核对显示的价格信息是否与你的原始数据一致。这是验证数据顺序是否正确的最直接方法。

2. Pandas数据转换的正确姿势

  • 单列Series转列表:直接使用 .tolist()。
  • 多列DataFrame转嵌套列表:必须先使用 .values 获取NumPy数组,再使用 .tolist()。
# 正确做法
y_data = df[['Open', 'Close', 'Low', 'High']].values.tolist()

# 错误做法(DataFrame没有.tolist()方法)
# y_data = df[['Open', 'Close', 'Low', 'High']].tolist()  # 会报错

3. 关于pyecharts版本的说明

本课程使用 pyecharts==2.1.0,其底层加载的ECharts资源版本为6.x。该版本下的 Candlestick 图表稳定,API清晰。请注意,不同大版本间的API可能存在不兼容的情况,建议在指定环境下运行代码。

📝 动手练一练

  1. 数据顺序验证练习 假设你从某数据源获得了一个股票DataFrame df_exercise,其列顺序为 ['Date', 'High', 'Low', 'Open', 'Close']。请写出将其转换为pyecharts K线图所需 x_axis_data 和 y_axis_data 的代码片段。

    点击查看参考答案
    # 假设 df_exercise 已定义
    x_axis_data = df_exercise['Date'].tolist()
    # 关键:按 [Open, Close, Low, High] 顺序提取并转换
    y_axis_data = df_exercise[['Open', 'Close', 'Low', 'High']].values.tolist()
    </details>

2.  **识别K线形态**
    观察你在“实战”部分生成的 `stock_kline.html` 图表,找出其中实体部分最长的一根阳线和一根阴线,并记录它们的开盘价和收盘价。这反映了哪两天的价格波动最为剧烈?

    <details>
    <summary> 点击查看参考答案</summary>

    (答案因随机数据而异,此处为示例)
    例如,可能发现:
    - **最长阳线**:2023-10-10,开盘价 95.0,收盘价 102.5,实体长度 7.5。
    - **最长阴线**:2023-10-03,开盘价 105.0,收盘价 98.0,实体长度 7.0。
    这反映了在这两天,市场出现了强烈的单边走势,波动剧烈。
    </details>

## 本章小结

本节我们深入学习了金融数据分析中的利器——K线图。你不仅理解了其背后“开盘、收盘、最高、最低”四价合一的编码逻辑,以及“阳线”与“阴线”所代表的市场情绪,更重要的是掌握了将Pandas中的股票数据,通过正确的格式转换,利用pyecharts `Candlestick` 类绘制成交互式Web图表的核心技能。记住,**数据顺序是绘制K线图的第一要务**,错误的顺序会导致完全错误的市场信号。

### 📋 行动清单
- [ ] **理解与记忆**:能清晰复述一根K线如何用实体和影线表示四个价格,以及阳线/阴线的定义。
- [ ] **代码实践**:成功运行本节所有代码,并能在自己的环境中,使用另一份股票CSV数据(列名可能不同)独立绘制出正确的K线图。
- [ ] **排查验证**:养成绘制后通过悬停工具提示,核对图表信息与原始数据是否一致的习惯,确保可视化结果的准确性。

掌握了K线图,你便拥有了分析金融市场时间趋势的基础能力。在接下来的章节中,我们将学习更多用于展示时间趋势的图表变体,并探索如何将它们组合到复杂的数据大屏中。

—— 小象教研组

配套资料 · 直接下载

课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。

  • stock.csv · ECharts 课程配套资源
    课程配套文件
    下载