Skip to main content

数据可视化(Matplotlib)

Matplotlib 是 Python 最基础的数据可视化库,能够绘制各种金融图表:K 线图、均线图、成交量图等。


Matplotlib 基础

import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import pandas as pd
import numpy as np

# 设置中文字体(避免中文乱码)
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS', 'SimHei']
plt.rcParams['axes.unicode_minus'] = False

折线图:股票价格走势

# 模拟数据
dates = pd.date_range('2024-01-01', periods=100, freq='B')
prices = 100 + np.random.randn(100).cumsum()

plt.figure(figsize=(12, 6))
plt.plot(dates, prices, label='收盘价', color='#1890ff', linewidth=1.5)
plt.title('股票价格走势', fontsize=16)
plt.xlabel('日期')
plt.ylabel('价格')
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()

均线图

df = pd.DataFrame({
'close': 100 + np.random.randn(200).cumsum()
}, index=pd.date_range('2024-01-01', periods=200, freq='B'))

df['ma5'] = df['close'].rolling(5).mean()
df['ma20'] = df['close'].rolling(20).mean()
df['ma60'] = df['close'].rolling(60).mean()

fig, ax = plt.subplots(figsize=(14, 7))
ax.plot(df.index, df['close'], label='收盘价', color='#333', alpha=0.6)
ax.plot(df.index, df['ma5'], label='MA5', color='#1890ff', linewidth=1)
ax.plot(df.index, df['ma20'], label='MA20', color='#f5222d', linewidth=1)
ax.plot(df.index, df['ma60'], label='MA60', color='#faad14', linewidth=1)
ax.set_title('股价与均线系统', fontsize=16)
ax.legend(loc='upper left')
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()

K 线图(蜡烛图)

from mplfinance.original_flavor import candlestick_ohlc

# 准备 OHLC 数据(Open, High, Low, Close)
df_ohlc = df[['open', 'high', 'low', 'close']].reset_index()
df_ohlc['date'] = df_ohlc['index'].map(mdates.date2num)

# 绘制 K 线图
fig, ax = plt.subplots(figsize=(15, 8))
candlestick_ohlc(ax, df_ohlc.values, width=0.6,
colorup='red', colordown='green')
ax.xaxis_date()
ax.set_title('K 线图', fontsize=16)
ax.set_xlabel('日期')
ax.set_ylabel('价格')
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()

子图布局:多维度展示

在量化分析中,通常需要同时查看价格、成交量和指标:

fig, (ax1, ax2, ax3) = plt.subplots(3, 1, figsize=(14, 12),
gridspec_kw={'height_ratios': [3, 1, 1]})

# 上图:K 线 + 均线
candlestick_ohlc(ax1, df_ohlc.values, width=0.6,
colorup='red', colordown='green')
ax1.plot(df.index, df['ma5'], label='MA5', alpha=0.7)
ax1.plot(df.index, df['ma20'], label='MA20', alpha=0.7)
ax1.set_title('股票分析面板', fontsize=16)
ax1.legend(loc='upper left')
ax1.grid(True, alpha=0.3)

# 中图:成交量
ax2.bar(df.index, df['volume'], color='#1890ff', alpha=0.6)
ax2.set_ylabel('成交量')
ax2.grid(True, alpha=0.3)

# 下图:RSI 指标
delta = df['close'].diff()
gain = delta.clip(lower=0).rolling(14).mean()
loss = (-delta.clip(upper=0)).rolling(14).mean()
rs = gain / loss
df['rsi'] = 100 - (100 / (1 + rs))
ax3.plot(df.index, df['rsi'], color='#722ed1')
ax3.axhline(y=70, color='r', linestyle='--', alpha=0.5)
ax3.axhline(y=30, color='g', linestyle='--', alpha=0.5)
ax3.set_ylabel('RSI')
ax3.grid(True, alpha=0.3)

plt.tight_layout()
plt.show()

样式美化

# 使用内置样式
plt.style.use('seaborn-v0_8-darkgrid')

# 或自定义
plt.rcParams.update({
'figure.facecolor': 'white',
'axes.facecolor': '#fafafa',
'axes.grid': True,
'grid.alpha': 0.3,
'font.size': 12,
})

下一步股票数据获取 →