
1) 【一句话结论】用Python(以Matplotlib结合mplfinance为例)绘制股票日K线图并添加5日和20日移动平均线,需通过数据获取(yfinance)、计算移动平均线(rolling)、绘制K线(基于开盘/收盘/最高/最低价的实体与影线)、图表优化(标题/标签/图例)实现,核心是确保K线图符合金融标准(包含实体和影线)。
2) 【原理/概念讲解】
K线图是金融核心图表,通过“实体”(开盘价-收盘价)和“影线”(最高价-最低价)展示价格波动:实体越长表示涨跌幅度越大,影线越长表示当日价格波动范围越广;移动平均线(MA)是价格的平均值序列,用于平滑短期波动,辅助判断趋势(5日均线反映短期趋势,20日均线反映中期趋势)。
Matplotlib是Python底层绘图库,可通过mplfinance插件实现标准K线图绘制(candlestick_ohlc函数),步骤包括:导入库→加载数据→计算均线→绘制K线(实体+影线)→添加均线→优化图表。类比:K线像“蜡烛”,实体长表示涨跌,影线表示波动;移动平均线像“平滑的均线”,过滤短期噪音,显示趋势方向。
3) 【对比与适用场景】
| 特性 | Matplotlib (静态) | Plotly (交互式) |
|---|---|---|
| 定义 | Python底层绘图库,功能全面 | 基于Web的交互式图表库 |
| 特性 | 代码简洁,适合固定布局图表 | 支持缩放、悬停提示、数据点交互 |
| 使用场景 | 学术报告、静态分析图表 | 实时监控、数据探索、演示 |
| 注意点 | 需手动设置交互,图表不可交互 | 代码稍复杂,可生成HTML文件 |
4) 【示例】
import pandas as pd
import yfinance as yf
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from mplfinance.original_flavor import candlestick_ohlc
# 1. 数据获取
data = yf.download('000001.SZ', start='2023-01-01', end='2023-12-31')
data['Date'] = data.index
data['Date'] = data['Date'].apply(mdates.date2num) # 转换日期为数值格式
# 2. 计算移动平均线
data['MA5'] = data['Close'].rolling(window=5).mean()
data['MA20'] = data['Close'].rolling(window=20).mean()
# 3. 绘制K线图
fig, ax = plt.subplots(figsize=(12, 6))
candlestick_ohlc(ax, data[['Date', 'Open', 'High', 'Low', 'Close']].values, width=0.6, colorup='green', colordown='red')
ax.plot(data['Date'], data['MA5'], color='r', label='5日均线')
ax.plot(data['Date'], data['MA20'], color='g', label='20日均线')
# 4. 优化图表
ax.set_title('股票日K线图(近一年)')
ax.set_xlabel('日期')
ax.set_ylabel('价格')
ax.legend()
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
5) 【面试口播版答案】
面试官您好,我来回答绘制股票日K线图并添加移动平均线的问题。首先,核心步骤是数据获取、计算移动平均线、绘制K线(包含实体和影线)、图表优化。具体来说,先用yfinance下载股票数据(假设股票代码是000001.SZ,获取2023年1月到12月的日数据),然后计算5日和20日移动平均线(用rolling函数对收盘价求均值),接着用mplfinance的candlestick_ohlc函数绘制K线(该函数会根据开盘、收盘、最高、最低价绘制实体和影线),最后优化图表:添加标题“股票日K线图(近一年)”,坐标轴标签“日期”和“价格”,图例标注5日和20日均线,调整日期刻度格式(如%Y-%m-%d),让图表更易读。这样就能得到包含K线和移动平均线的图表,辅助分析趋势。
6) 【追问清单】
fillna方法填充(如前向填充或均值填充),确保绘图时数据连续,避免图表断裂。go.Candlestick组件添加hover_data参数显示开盘、收盘等数据,并设置layout.hovermode='x unified'实现缩放和悬停提示。xlim、ylim或日期格式化器,确保日期标签不重叠,提高可读性。7) 【常见坑/雷区】
rolling函数参数错误。