查看全课大纲(第 20 / 45 节)
- 1.课程简介
- 2.环境搭建
- 3.预备知识
- 4.pyecharts初体验
- 5.数据可视化概述
- 6.数据可视化的目标和作用
- 7.数据可视化工具对比分析
- 8.数据可视化基本流程
- 9.数据可视化设计原则
- 10.pyecharts简介
- 11.官方图表样例
- 12.常用图表的基本结构
- 13.数据格式
- 14.图表的分类
- 15.柱状图与条形图
- 16.其他对比图表
- 17.常用配置项(一)
- 18.常用配置项(二)
- 19.折线图 面积图
- 20.K线图
- 21.其他时间图表
- 22.常用配置项
- 23.散点图 气泡图
- 24.热力图
- 25.其他相关性图表
- 26.饼图
- 27.矩形树图
- 28.其他成分比例图表
- 29.箱型图与直方图
- 30.3D柱状图与折线图
- 31.其他统计图表
- 32.地图 Map
- 33.地理坐标系Geo
- 34.3D 地图
- 35.网络关系图
- 36.主题河流图
- 37.词云图
- 38.组合图表组件
- 39.仪表盘相关图表
- 40.项目介绍
- 41.数据准备
- 42.子图制作(一)
- 43.子图制作(二)
- 44.数据大屏制作
- 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线,都包含了四个关键价格信息:
- 开盘价 (Open):该时间段开始时的第一个成交价格。
- 收盘价 (Close):该时间段结束时的最后一个成交价格。
- 最高价 (High):该时间段内达到的最高成交价格。
- 最低价 (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)} 根")代码输出:
图表已生成,类型: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可能存在不兼容的情况,建议在指定环境下运行代码。
📝 动手练一练
数据顺序验证练习 假设你从某数据源获得了一个股票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 课程配套资源课程配套文件
