🔴
入学要求
💯
能力测试
🛣️
课程安排
🕹️
研究资源

第5讲:数据可视化 (Plotting Data)

💡

查看全集:💎Quantopia量化分析56讲


为什么需要图形化表示数据?

将数据用图形展示出来,可以帮助我们更好地理解数据的行为,发现潜在的模式或问题。不过要小心!我们人类很容易只看到支持自己想法的证据,而图表特别容易让人产生这种“偏见”。

在这篇教程中,我们将学习几种常见的图表类型,并用苹果(AAPL)和微软(MSFT)的股价数据来练习。别担心,我们会一步步讲解,适合初学者!


开始之前:准备工作

我们需要用 Python 的工具来处理和绘制数据。以下是你需要导入的库:

python

# 导入数值处理的库
import numpy as np
# 导入绘图库,简称为 plt,这样我们可以用 plt 代替完整的名字
import matplotlib.pyplot as plt
# 导入 yfinance 库来获取股票数据
import yfinance as yf

获取数据

为了画图,我们需要一些真实的数据。我们将获取苹果(AAPL)和微软(MSFT)在 2014 年的股价数据。由于原教程使用的是 Quantopian 的 get_pricing() 函数,我们将改用更常见的 yfinance 库来获取数据。

代码示例:获取股价数据

python

# 设置时间范围
start = '2014-01-01'
end = '2015-01-01'

# 使用 yfinance 获取 AAPL 和 MSFT 的数据
data = yf.download(['AAPL', 'MSFT'], start=start, end=end)['Adj Close']

# 查看前几行数据
print(data.head())

输出结果(示例)

            AAPL      MSFT
Date
2014-01-02  79.034  37.145
2014-01-03  77.284  36.920
2014-01-06  77.709  36.130
2014-01-07  77.164  36.403
2014-01-08  77.626  35.750

理解数据结构

数据的“形状”和“格式”很重要!在这个例子中:

示例:查看 MSFT 的前几行

python

print(data['MSFT'].head())

输出

Date
2014-01-02    37.145
2014-01-03    36.920
2014-01-06    36.130
2014-01-07    36.403
2014-01-08    35.750
Name: MSFT, dtype: float64

图表 1:直方图(Histogram)

什么是直方图?直方图展示数据的“频率分布”,也就是某个值出现的次数。它用条形表示,让我们一眼看出数据集中在哪些范围。

示例:绘制 MSFT 股价的直方图

python

# 绘制 MSFT 股价的直方图,分成 20 个区间(bins)
plt.hist(data['MSFT'], bins=20)
plt.xlabel('价格')  # X 轴标签
plt.ylabel('观察到的天数')  # Y 轴标签
plt.title('2014 年 MSFT 股价的频率分布')  # 图表标题
plt.show()  # 显示图表

图表 2:回报的直方图

在金融中,我们很少直接看价格的分布,因为价格会一直变化(非平稳)。我们更关心的是“每日回报率”。什么是回报率? 用百分比变化表示价格变动:(今天价格 - 昨天价格) / 昨天价格。

示例:绘制 MSFT 回报的直方图

python

# 计算 MSFT 的每日回报率(移除第一行,因为第一天没有前一天数据)
R = data['MSFT'].pct_change()[1:]

# 绘制回报的直方图
plt.hist(R, bins=20)
plt.xlabel('回报率')
plt.ylabel('观察到的天数')
plt.title('2014 年 MSFT 回报的频率分布')
plt.show()

图表 3:累积直方图(Cumulative Histogram)

什么是累积直方图?它显示某个值及之前所有值的总数,条形高度永远不会下降(因为观察次数不会是负数)。

示例:绘制 MSFT 回报的累积直方图

python

# 计算 MSFT 的每日回报率
R = data['MSFT'].pct_change()[1:]

# 绘制累积直方图
plt.hist(R, bins=20, cumulative=True)
plt.xlabel('回报率')
plt.ylabel('观察到的天数')
plt.title('2014 年 MSFT 回报的累积分布')
plt.show()

图表 4:散点图(Scatter Plot)

什么是散点图?散点图用点表示两组数据的关系,比如 MSFT 和 AAPL 的价格或回报率。每个点代表一对对应的值。

示例 1:MSFT 和 AAPL 的股价散点图

python

plt.scatter(data['MSFT'], data['AAPL'])
plt.xlabel('MSFT')
plt.ylabel('AAPL')
plt.title('2014 年每日股价')
plt.show()

示例 2:MSFT 和 AAPL 的回报散点图

python

R_msft = data['MSFT'].pct_change()[1:]
R_aapl = data['AAPL'].pct_change()[1:]

plt.scatter(R_msft, R_aapl)
plt.xlabel('MSFT')
plt.ylabel('AAPL')
plt.title('2014 年每日回报')
plt.show()

图表 5:折线图(Line Graph)

什么是折线图?折线图通过连接数据点展示随时间变化的趋势,非常适合追踪股价或回报随时间的变化。

示例:绘制 MSFT 和 AAPL 的股价折线图

python

plt.plot(data['MSFT'], label='MSFT')  # 绘制 MSFT
plt.plot(data['AAPL'], label='AAPL')  # 绘制 AAPL
plt.ylabel('价格')
plt.legend()  # 添加图例
plt.show()

示例:绘制 MSFT 回报的折线图

python

R = data['MSFT'].pct_change()[1:]
plt.plot(R)
plt.ylabel('回报率')
plt.title('MSFT 回报')
plt.show()

重要提醒:不要过度依赖图表


完整代码汇总

以下是将所有步骤整合在一起的代码,初学者可以直接运行试试:

python

import numpy as np
import matplotlib.pyplot as plt
import yfinance as yf

# 获取数据
start = '2014-01-01'
end = '2015-01-01'
data = yf.download(['AAPL', 'MSFT'], start=start, end=end)['Adj Close']

# 直方图:MSFT 股价
plt.hist(data['MSFT'], bins=20)
plt.xlabel('价格')
plt.ylabel('观察到的天数')
plt.title('2014 年 MSFT 股价的频率分布')
plt.show()

# 直方图:MSFT 回报
R = data['MSFT'].pct_change()[1:]
plt.hist(R, bins=20)
plt.xlabel('回报率')
plt.ylabel('观察到的天数')
plt.title('2014 年 MSFT 回报的频率分布')
plt.show()

# 累积直方图:MSFT 回报
plt.hist(R, bins=20, cumulative=True)
plt.xlabel('回报率')
plt.ylabel('观察到的天数')
plt.title('2014 年 MSFT 回报的累积分布')
plt.show()

# 散点图:MSFT vs AAPL 回报
R_msft = data['MSFT'].pct_change()[1:]
R_aapl = data['AAPL'].pct_change()[1:]
plt.scatter(R_msft, R_aapl)
plt.xlabel('MSFT')
plt.ylabel('AAPL')
plt.title('2014 年每日回报')
plt.show()

# 折线图:MSFT 和 AAPL 股价
plt.plot(data['MSFT'], label='MSFT')
plt.plot(data['AAPL'], label='AAPL')
plt.ylabel('价格')
plt.legend()
plt.show()

结语

恭喜你完成了这个初学者友好的数据图形化教程!通过直方图、散点图和折线图,你已经掌握了用 Python 可视化数据的基本方法。继续练习,你会越来越熟练!

附:练习合集