数据可视化(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,
})
下一步:股票数据获取 →