查看全集:💎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
什么是直方图?直方图展示数据的“频率分布”,也就是某个值出现的次数。它用条形表示,让我们一眼看出数据集中在哪些范围。
示例:绘制 MSFT 股价的直方图
python
# 绘制 MSFT 股价的直方图,分成 20 个区间(bins)
plt.hist(data['MSFT'], bins=20)
plt.xlabel('价格') # X 轴标签
plt.ylabel('观察到的天数') # Y 轴标签
plt.title('2014 年 MSFT 股价的频率分布') # 图表标题
plt.show() # 显示图表
在金融中,我们很少直接看价格的分布,因为价格会一直变化(非平稳)。我们更关心的是“每日回报率”。什么是回报率? 用百分比变化表示价格变动:(今天价格 - 昨天价格) / 昨天价格。
示例:绘制 MSFT 回报的直方图
python
# 计算 MSFT 的每日回报率(移除第一行,因为第一天没有前一天数据)
R = data['MSFT'].pct_change()[1:]
# 绘制回报的直方图
plt.hist(R, bins=20)
plt.xlabel('回报率')
plt.ylabel('观察到的天数')
plt.title('2014 年 MSFT 回报的频率分布')
plt.show()
什么是累积直方图?它显示某个值及之前所有值的总数,条形高度永远不会下降(因为观察次数不会是负数)。
示例:绘制 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()
什么是散点图?散点图用点表示两组数据的关系,比如 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()
什么是折线图?折线图通过连接数据点展示随时间变化的趋势,非常适合追踪股价或回报随时间的变化。
示例:绘制 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 可视化数据的基本方法。继续练习,你会越来越熟练!