跳到主内容
研究工具量化研究工具与数据基础 · 第1–5讲5/5模块导览 →
讲义

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

使用直方图、散点图、折线图和拟合线展示价格与收益数据,说明图形选择、坐标含义和数据对齐要求。

完成状态保存在当前浏览器,可随时取消。

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

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

  • 图表适合用来做什么? 帮助你提出假设(“我猜数据可能是这样的”)。

  • 图表不适合做什么? 直接用来验证假设(“这个图证明我是对的”)。

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


开始之前:准备工作#

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

python

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

获取数据#

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

代码示例:获取股价数据

python

code
# 设置时间范围
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())

输出结果(示例)

code
            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
  • 解释

    • 每一行是一个日期(时间戳)。

    • 每一列是一个股票(AAPL 或 MSFT),值是当天的调整后收盘价(Adjusted Close)。

    • 这是一个 Pandas DataFrame(二维表格),非常适合处理时间序列数据。


理解数据结构#

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

  • :日期(时间戳)。

  • :股票代码(AAPL 和 MSFT)。

  • 如果想单独看某一列(比如 MSFT),可以用 data['MSFT'],这会返回一个一维的 Series 对象。

示例:查看 MSFT 的前几行

python

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

输出

code
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
  • 解释:这是一个 Series,索引是日期,值是 MSFT 的股价。

图表 1:直方图(Histogram)#

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

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

python

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

    • 每个条的高度表示某个价格区间出现的次数。

    • 这就像一个“离散的概率密度函数”(PDF),告诉我们哪些价格更常见。


图表 2:回报的直方图#

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

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

python

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

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

    • 图中显示 MSFT 在 2014 年每天的回报率分布。

    • 例如,回报率超过 0.03 的天数不到 5 天。

    • 注意:过去的分布不代表未来会一样!


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

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

  • 用途:想知道数据累积的趋势时很有用。

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

python

code
# 计算 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

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

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

python

code
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 的回报是否有关联(比如一起涨或跌)。


图表 5:折线图(Line Graph)#

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

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

python

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

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

python

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

    • 折线图能清楚展示价格或回报随时间的变化。

    • 但要注意:点之间的“连接”可能会掩盖未记录的波动。


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

  • 图表的作用:帮你在分析初期探索数据、提出想法。

  • 图表的局限

    • 不能直接用来看假设是否正确(需要更严格的检验)。

    • 过去的趋势不一定适用于未来。

  • 建议:用图表启发模型,但验证模型时要用更专业的方法。


完整代码汇总

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

python

code
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()

结语

本节使用直方图、散点图和折线图展示数据分布、变量关系与时间变化。建议使用其他资产数据复现示例,并核对图形与统计量的对应关系。