Python金融大数据分析——第5章 数据可视化 笔记

逃离我推掉我的手 2022-05-21 00:35 217阅读 0赞

文章目录

      • 5.1.3 其他绘图样式
    • 5.2 金融学图表

#第5章 数据可视化
##5.1 二维绘图
###5.1.1 一维数据集
按照给定的x和y值绘图

  1. import matplotlib as mpl
  2. import matplotlib.pyplot as plt
  3. %matplotlib inline # 如果是在控制台上执行代码,这行如果报错,下面的图片显示一张,关闭后再执行下一张的显示,不然都会画到一张图上
  4. np.random.seed(1000)
  5. # 生成20个标准正态分布(伪)随机数, 保存在一个NumPy ndarray中
  6. y = np.random.standard_normal(20)
  7. x = range(len(y))
  8. plt.plot(x, y)
  9. plt.title('5-1 按照给定的x和y值绘图')

5-1 按照给定的x和y值绘图

按照给定的一维数组和附加方法绘图

  1. # 按照给定的一维数组和附加方法绘图
  2. plt.plot(y)
  3. plt.title('5-2 按照一维数组给出的数据绘图')

5-2 按照一维数组给出的数据绘图

按照给定的一维数组和附加方法绘图

  1. # 按照给定的一维数组和附加方法绘图
  2. plt.plot(y.cumsum())
  3. plt.title('5-3 按照给定的一维数组和附加方法绘图')

5-3 按照给定的一维数组和附加方法绘图

带有网络和紧凑坐标轴的图表

  1. # 带有网络和紧凑坐标轴的图表
  2. plt.plot(y.cumsum())
  3. plt.grid(True)
  4. plt.axis('tight')
  5. plt.title('5-4 带有网络和紧凑坐标轴的图表')

5-4 带有网络和紧凑坐标轴的图表
plt.axis选项






































参数 描述
Empty 返回当前坐标轴限值
off 关闭坐标轴和标签
equat 使用等刻度
scaled 通过尺寸变化平衡度量
tight 所有数据可见(缩小限值)
image 是所有数据可见(使用数据限值)
[xmin,xmax,ymin,ymax] 将设置限值为给定的一组值

使用自定义坐标轴限值绘制图表

  1. # 使用自定义坐标轴限值绘制图表
  2. plt.plot(y.cumsum())
  3. plt.grid(True)
  4. plt.xlim(-1, 20)
  5. plt.ylim(np.min(y.cumsum()) - 1, np.max(y.cumsum()) + 1)
  6. plt.title('5-5 使用自定义坐标轴限值绘制图表')

5-5 使用自定义坐标轴限值绘制图表
带有典型标签的图表

  1. # 带有典型标签的图表
  2. plt.figure(figsize=(7, 4))
  3. # the figsize parameter defines the size of the figure in (width,height)
  4. plt.plot(y.cumsum(),'b',lw=1.5)
  5. plt.plot(y.cumsum(),'ro')
  6. plt.grid(True)
  7. plt.axis('tight')
  8. plt.xlabel('index')
  9. plt.ylabel('value')
  10. plt.title('A Simple Plot')

5-6 带有典型标签的图表

标准颜色缩写










































字符 颜色
b
g 绿
r
c
m 品红
y
k
w

标准样式字符














































































































字符 象征
- 实现样式
短划线样式
-. 点实线样式
: 虚线样式
. 点标记
, 像素标记
o 圆标记
v 向下三角形标记
^ 向上三角形标记
< 向左三角形标记
> 向右三角形标记
1 Tri_down标记
2 Tri_up标记
3 Tri_left标记
4 Tri_right标记
s 方形标记
P 五边形标记
* 星号
h 六角形标记1
H 六角形标记2
+ 加好
x X标记
D 菱形标记
d 细菱形标记
| 垂直标记

###5.1.2 二维数据集
用两个数据集绘制图表

  1. # 用两个数据集绘制图表
  2. np.random.seed(2000)
  3. y = np.random.standard_normal((20, 2)).cumsum(axis=0)
  4. plt.figure(figsize=(7, 4))
  5. plt.plot(y, lw=1.5)
  6. plt.plot(y, 'ro')
  7. plt.grid(True)
  8. plt.axis('tight')
  9. plt.xlabel('index')
  10. plt.ylabel('value')
  11. plt.title('A Simple Plot')

用两个数据集绘制图表
带有数据集的图表

  1. # 带有数据集的图表
  2. plt.figure(figsize=(7, 4))
  3. plt.plot(y[:, 0], lw=1.5, label='1st')
  4. plt.plot(y[:, 1], lw=1.5, label='2nd')
  5. plt.grid(True)
  6. plt.legend(loc=0)
  7. plt.axis('tight')
  8. plt.xlabel('index')
  9. plt.ylabel('value')
  10. plt.title('A Simple Plot')

带有数据集的图表
plt.legend选项


























































位置选项 描述
空白 自动
0 最佳
1 右上
2 左上
3 左下
4 右下
5
6 中左
7 中右
8 中下
9 中上
10

包含两个数据集、 两个y轴的图表

  1. # 包含两个数据集、 两个y轴的图表
  2. y[:, 0] = y[:, 0] * 10
  3. fig, ax1 = plt.subplots()
  4. plt.plot(y[:, 0], 'b', lw=1.5, label='1st')
  5. plt.plot(y[:, 0], 'ro')
  6. plt.grid(True)
  7. plt.legend(loc=8)
  8. plt.axis('tight')
  9. plt.xlabel('index')
  10. plt.ylabel('value 1st')
  11. plt.title('A Simple Plot')
  12. ax2 = ax1.twinx()
  13. plt.plot(y[:, 1], 'g', lw=1.5, label='2nd')
  14. plt.legend(loc=0)
  15. plt.ylabel('value 2nd')

包含两个数据集、 两个y轴的图表

带有两个子图的图表

  1. # 带有两个子图的图表
  2. plt.figure(figsize=(7, 5))
  3. plt.subplot(211)
  4. plt.plot(y[:, 0], 'b', lw=1.5, label='1st')
  5. plt.plot(y[:, 0], 'ro')
  6. plt.grid(True)
  7. plt.legend(loc=0)
  8. plt.axis('tight')
  9. plt.ylabel('value')
  10. plt.title('A Simple Plot')
  11. plt.subplot(212)
  12. plt.plot(y[:, 0], 'g', lw=1.5, label='2nd')
  13. plt.plot(y[:, 0], 'ro')
  14. plt.grid(True)
  15. plt.legend(loc=0)
  16. plt.axis('tight')
  17. plt.xlabel('index')
  18. plt.ylabel('value')

带有两个子图的图表

组合线、点子图和柱状子图

  1. # 组合线、点子图和柱状子图
  2. plt.figure(figsize=(9, 4))
  3. plt.subplot(121)
  4. plt.plot(y[:, 0], lw=1.5, label='1st')
  5. plt.plot(y[:, 0], 'ro')
  6. plt.grid(True)
  7. plt.legend(loc=0)
  8. plt.axis('tight')
  9. plt.xlabel('index')
  10. plt.ylabel('value')
  11. plt.title('1st Data Set')
  12. plt.subplot(122)
  13. plt.bar(np.arange(len(y)), y[:, 1], width=0.5, color='g', label='2nd')
  14. plt.grid(True)
  15. plt.legend(loc=0)
  16. plt.axis('tight')
  17. plt.xlabel('index')
  18. plt.title('2nd Data Set')

组合线、点子图和柱状子图

5.1.3 其他绘图样式

通过plot函数绘制散点图

  1. # 通过plot函数绘制散点图
  2. y = np.random.standard_normal((1000, 2))
  3. plt.figure(figsize=(7, 5))
  4. plt.plot(y[:, 0], y[:, 1], 'ro')
  5. plt.grid(True)
  6. plt.xlabel('1st')
  7. plt.ylabel('2nd')
  8. plt.title('Scatter Plot')

通过plot函数绘制散点图

通过scatter函数绘制散点图

  1. # 通过scatter函数绘制散点图
  2. plt.figure(figsize=(7, 5))
  3. plt.scatter(y[:, 0], y[:, 1], marker='o')
  4. plt.grid(True)
  5. plt.xlabel('1st')
  6. plt.ylabel('2nd')
  7. plt.title('Scatter Plot')

通过scatter函数绘制散点图

  1. # 具备第三维的散点图
  2. c = np.random.randint(0, 10, len(y))
  3. plt.figure(figsize=(7, 5))
  4. plt.scatter(y[:, 0], y[:, 1], c=c, marker='o')
  5. plt.colorbar()
  6. plt.grid(True)
  7. plt.xlabel('1st')
  8. plt.ylabel('2nd')
  9. plt.title('Scatter Plot')

具备第三维的散点图
两个数据集的直方图

  1. # 两个数据集的直方图
  2. plt.figure(figsize=(7, 5))
  3. plt.hist(y, label=['1st', '2nd'], bins=25)
  4. plt.grid(True)
  5. plt.legend(loc=0)
  6. plt.xlabel('value')
  7. plt.ylabel('frequency')
  8. plt.title('Histogram')

两个数据集的直方图

plt.hist所支持的参数:
plt.hist(x, bins=None, range=None, normed=False, weights=None, cumulative=False, bottom=None, histtype=‘bar’, align=‘mid’, orientation=‘vertical’, rwidth=None, log=False, color=None, label=None, stacked=False, hold=None, data=None, **kwargs)

plt.hist参数


































































参数 描述
x 列表对象,ndarray对象
bins 数据组(bin)数
range 数据组的上界和下界
normed 规范化为整数
weights x轴上每个值的权重
cumulative 每个数据组包含较低组别的计数
histtype 选项(字符串): bar, barstacked, step, stepfilled
align 选项(字符串): lef, mid, right
orientation 选项(字符串): horizontal, vertical
rwidth 条块的相对宽度
log 对数刻度
color 每个数据集的颜色(类似数组)
label 标签所用的字符席或者字符串序列
stacked 堆叠多个数据集

两个数据集堆叠的直方图

  1. # 两个数据集堆叠的直方图
  2. plt.figure(figsize=(7, 4))
  3. plt.hist(y, label=['1st', '2nd'], color=['b', 'g'], stacked=True, bins=20)
  4. plt.grid(True)
  5. plt.legend(loc=0)
  6. plt.xlabel('value')
  7. plt.ylabel('frequency')
  8. plt.title('Histogram')

两个数据集堆叠的直方图

两个数据集的箱形图

  1. # 两个数据集的箱形图
  2. fig, ax = plt.subplots(figsize=(7, 4))
  3. plt.boxplot(y)
  4. plt.grid(True)
  5. plt.setp(ax, xticklabels=['1st', '2nd'])
  6. plt.xlabel('data set')
  7. plt.ylabel('value')
  8. plt.title('Boxplot')

两个数据集的箱形图

指数函数、积分面积和LaTeX标签

  1. # 指数函数、积分面积和LaTeX标签
  2. from matplotlib.patches import Polygon
  3. def func(x):
  4. return 0.5 * np.exp(x) + 1
  5. a, b = 0.5, 1.5
  6. x = np.linspace(0, 2)
  7. y = func(x)
  8. fig, ax = plt.subplots(figsize=(7, 5))
  9. plt.plot(x, y, 'b', linewidth=2)
  10. plt.ylim(ymin=0)
  11. Ix = np.linspace(a, b)
  12. Iy = func(Ix)
  13. verts = [(a, 0)] + list(zip(Ix, Iy)) + [(b, 0)]
  14. poly = Polygon(verts, facecolor='0.7', edgecolor='0.5')
  15. ax.add_patch(poly)
  16. plt.text(0.5 * (a + b), 1, r"$\int_a^b f(x)\mathrm{d}x$", horizontalalignment='center', fontsize=20)
  17. plt.figtext(0.9, 0.075, '$x$')
  18. plt.figtext(0.075, 0.9, '$x$')
  19. ax.set_xticks((a, b))
  20. ax.set_xticklabels(('$a$', '$b$'))
  21. ax.set_yticks([func(a), func(b)])
  22. ax.set_yticklabels(('$f(a)$', '$f(b)$'))
  23. plt.grid(True)

指数函数、积分面积和LaTeX标签

5.2 金融学图表

金融数据的蜡烛图

  1. """
  2. # import matplotlib.finance as mpf # 这个方法过期了
  3. # MatplotlibDeprecationWarning: The finance module has been deprecated in mpl 2.0 and will be removed in mpl 2.2. Please use the module mpl_finance instead. warnings.warn(message, mplDeprecation, stacklevel=1)
  4. # 要用下面的方法 import mpl_finance as mpf
  5. # 安装方法: >pip install https://github.com/matplotlib/mpl_finance/archive/master.zip
  6. """
  7. import mpl_finance as mpf
  8. # start = (2014, 5, 1)
  9. # end = (2014, 6, 30)
  10. # quotes = mpf._quotes_historical_yahoo('GDAXI', start, end)
  11. # 由于伟大的墙,调取不到国外的数据,这里用tushare获取600118中国卫星的数据
  12. import tushare as ts
  13. import datetime
  14. from matplotlib.pylab import date2num
  15. start = '2018-05-01'
  16. end = '2018-06-30'
  17. k_d = ts.get_k_data('600118', start, end, ktype='D')
  18. k_d.head()
  19. k_d.date = k_d.date.map(lambda x: date2num(datetime.datetime.strptime(x, '%Y-%m-%d')))
  20. quotes = k_d.values
  21. fig, ax = plt.subplots(figsize=(8, 5))
  22. fig.subplots_adjust(bottom=0.2)
  23. mpf.candlestick_ochl(ax, quotes, width=0.6, colorup='r', colordown='g', alpha=0.8)
  24. plt.grid(True)
  25. ax.xaxis_date()
  26. # dates on the x-axis
  27. ax.autoscale_view()
  28. plt.setp(plt.gca().get_xticklabels(), rotation=30)

k_d.head()输入的结果:


































































  date open close high low volume code
77 2018-05-02 23.05 22.45 23.10 22.25 90673.0 600118
78 2018-05-03 22.30 22.52 22.58 21.71 78948.0 600118
79 2018-05-04 22.50 22.35 22.58 22.21 58511.0 600118
80 2018-05-07 22.49 22.70 22.71 22.30 58248.0 600118
81 2018-05-08 22.80 23.07 23.45 22.75 115629.0 600118

最后的图片:
金融数据的烛柱图
金融数据每日摘要图表

  1. # 金融数据每日摘要图表
  2. fig, ax = plt.subplots(figsize=(8, 5))
  3. fig.subplots_adjust(bottom=0.2)
  4. mpf._plot_day_summary(ax, quotes, colorup='r', colordown='g')
  5. plt.grid(True)
  6. ax.xaxis_date()
  7. # dates on the x-axis
  8. ax.autoscale_view()
  9. plt.setp(plt.gca().get_xticklabels(), rotation=30)
  10. plt.title('金融数据每日摘要图表')

金融数据每日摘要图表

蜡烛图和成交量柱状图组合而成的图表

  1. # 蜡烛图和成交量柱状图组合而成的图表
  2. fig, (ax1, ax2) = plt.subplots(2, sharex=True, figsize=(8, 6))
  3. mpf.candlestick_ochl(ax1, quotes, width=0.6, colorup='r', colordown='g', alpha=0.8)
  4. ax1.set_title('中国卫星')
  5. ax1.set_ylabel('index level')
  6. plt.grid(True)
  7. ax1.xaxis_date()
  8. plt.bar(quotes[:,0],quotes[:,5],width=0.5)
  9. ax2.set_ylabel('volume')
  10. ax2.grid(True)
  11. plt.setp(plt.gca().get_xticklabels(), rotation=30)

蜡烛图和成交量柱状图组合而成的图表

##5.3 3D绘图
(模拟)隐含波动率的 3D 曲面图

  1. #
  2. strike = np.linspace(50, 150, 24)
  3. ttm = np.linspace(0.5, 2.5, 24)
  4. strike, ttm = np.meshgrid(strike, ttm)
  5. iv = (strike - 100) ** 2 / (100 * strike) / ttm
  6. # generate fake implied volatilities
  7. from mpl_toolkits.mplot3d import Axes3D
  8. fig = plt.figure(figsize=(9, 6))
  9. ax = fig.gca(projection='3d')
  10. surf = ax.plot_surface(strike, ttm, iv, rstride=2, cstride=2, cmap=plt.cm.coolwarm, linewidth=0.5, antialiased=True)
  11. ax.set_xlabel('strike')
  12. ax.set_ylabel('time-to-maturity')
  13. ax.set_zlabel('implied volatility')
  14. fig.colorbar(surf, shrink=0.5, aspect=5)

(模拟)隐含波动率的 3D 曲面图

plot_surface参数














































参数 描述
X,Y,Z 2D数组形式的数据值
rstride 数组行距(步长大小)
cstride 数组列距(步长大小)
color 曲面块颜色
cmap 曲面块颜色映射
facecolors 单独曲面块表面颜色
norm 将值映射为颜色的 Nonnalize实例
vmin 映射的最小值
vmax 映射的最大值

(模拟)隐含波动率的 3D 散点图

  1. #(模拟)隐含波动率的 3D 散点图
  2. fig = plt.figure(figsize=(8, 5))
  3. ax = fig.add_subplot(111,projection='3d')
  4. ax.view_init(30,60)
  5. ax.scatter(strike, ttm, iv, zdir='z',s=25,c='b',marker='^')
  6. ax.set_xlabel('strike')
  7. ax.set_ylabel('time-to-maturity')
  8. ax.set_zlabel('implied volatility')

这里写图片描述

end

发表评论

表情:
评论列表 (有 0 条评论,217人围观)

还没有评论,来说两句吧...

相关阅读