Python 金融编程第二版(三)(4)

简介: Python 金融编程第二版(三)

Python 金融编程第二版(三)(3)https://developer.aliyun.com/article/1559413


其他绘图样式

在二维绘图方面,线条和点图可能是金融中最重要的图表之一;这是因为许多数据集包含时间序列数据,通常通过这些图表进行可视化。第八章详细讨论了金融时间序列数据。然而,目前这一节还是采用了一个随机数的二维数据集,并且展示了一些备用的、对于金融应用有用的可视化方法。

第一种是散点图,其中一个数据集的值作为另一个数据集的x值。图 7-13 展示了这样一个图。例如,此类图用于绘制一个金融时间序列的回报与另一个金融时间序列的回报。对于此示例,我们将使用一个新的二维数据集以及一些更多的数据:

In [24]: y = np.random.standard_normal((1000, 2))  # ①
In [25]: plt.figure(figsize=(10, 6))
         plt.plot(y[:, 0], y[:, 1], 'ro')  # ②
         plt.xlabel('1st')
         plt.ylabel('2nd')
         plt.title('Scatter Plot');
         # plt.savefig('../../images/ch07/mpl_13')


创建一个包含随机数的较大数据集。

通过 plt.plot() 函数绘制散点图。


图 7-13. 通过 plot 函数绘制散点图

matplotlib 还提供了一个特定的函数来生成散点图。它基本上工作方式相同,但提供了一些额外的功能。图 7-14 展示了使用 plt.scatter() 函数生成的相应散点图,这次与 图 7-13 对应,:

In [26]: plt.figure(figsize=(10, 6))
         plt.scatter(y[:, 0], y[:, 1], marker='o')  # ①
         plt.xlabel('1st')
         plt.ylabel('2nd')
         plt.title('Scatter Plot');
         # plt.savefig('../../images/ch07/mpl_14')

通过 plt.scatter() 函数绘制的散点图。


图 7-14. 通过散点函数生成的散点图

例如,plt.scatter()  绘图函数允许添加第三个维度,可以通过不同的颜色来可视化,并且可以通过使用颜色条来描述。图 7-15  展示了一个散点图,其中第三个维度通过单个点的不同颜色来说明,并且有一个颜色条作为颜色的图例。为此,以下代码生成了一个具有随机数据的第三个数据集,这次是介于  0 到 10 之间的整数:

In [27]: c = np.random.randint(0, 10, len(y))
In [28]: plt.figure(figsize=(10, 6))
         plt.scatter(y[:, 0], y[:, 1],
                     c=c,  # ①
                     cmap='coolwarm',  # ②
                     marker='o')  # ③
         plt.colorbar()
         plt.xlabel('1st')
         plt.ylabel('2nd')
         plt.title('Scatter Plot');
         # plt.savefig('../../images/ch07/mpl_15')

包含了第三个数据集。

选择了颜色映射。

将标记定义为粗点。


图 7-15. 具有第三维的散点图

另一种类型的图表,直方图,在金融收益的背景下也经常被使用。图 7-16 将两个数据集的频率值放在同一个图表中相邻位置:

In [29]: plt.figure(figsize=(10, 6))
         plt.hist(y, label=['1st', '2nd'], bins=25)  # ①
         plt.legend(loc=0)
         plt.xlabel('value')
         plt.ylabel('frequency')
         plt.title('Histogram');
         # plt.savefig('../../images/ch07/mpl_16')

通过 plt.hist() 函数绘制直方图。


图 7-16. 两个数据集的直方图

由于直方图在金融应用中是如此重要的图表类型,让我们更近距离地看一下 plt.hist 的使用。以下示例说明了支持的参数:

plt.hist(x, bins=10, 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, **kwargs)

表 7-5 提供了 plt.hist 函数的主要参数的描述。

表 7-5. plt.hist() 的参数

参数 描述
x list 对象(s),ndarray 对象
bins 柱子数量
range 柱的下限和上限
normed 规范化,使积分值为 1
weights x 中每个值的权重
cumulative 每个柱包含低位柱的计数
histtype 选项(字符串):barbarstackedstepstepfilled
align 选项(字符串):leftmidright
orientation 选项(字符串):horizontalvertical
rwidth 条柱的相对宽度
log 对数刻度
color 每个数据集的颜色(类似数组)
label 用于标签的字符串或字符串序列
stacked 堆叠多个数据集

图 7-17 展示了类似的图表;这次,两个数据集的数据在直方图中堆叠:

In [30]: plt.figure(figsize=(10, 6))
         plt.hist(y, label=['1st', '2nd'], color=['b', 'g'],
                     stacked=True, bins=20, alpha=0.5)
         plt.legend(loc=0)
         plt.xlabel('value')
         plt.ylabel('frequency')
         plt.title('Histogram');
         # plt.savefig('../../images/ch07/mpl_17')


图 7-17. 两个数据集的堆叠直方图

另一种有用的绘图类型是箱线图。类似于直方图,箱线图既可以简明地概述数据集的特征,又可以轻松比较多个数据集。图 7-18 展示了我们数据集的这样一个图:

In [31]: fig, ax = plt.subplots(figsize=(10, 6))
         plt.boxplot(y)  # ①
         plt.setp(ax, xticklabels=['1st', '2nd'])  # ②
         plt.xlabel('data set')
         plt.ylabel('value')
         plt.title('Boxplot');
         # plt.savefig('../../images/ch07/mpl_18')

通过plt.boxplot()函数绘制箱线图。

设置各个 x 标签。

最后一个示例使用了函数plt.setp(),它为一个(组)绘图实例设置属性。例如,考虑由以下代码生成的线图:

line = plt.plot(data, 'r')

下面的代码:

plt.setp(line, linestyle='--')

将线条样式更改为“虚线”。这样,您可以在生成绘图实例(“艺术家对象”)之后轻松更改参数。


图 7-18. 两个数据集的箱线图

作为本节的最后一个示例,请考虑一个在matplotlib 画廊中也可以找到的受数学启发的绘图。它绘制了一个函数并在图形上突出显示了函数下方的区域,从下限到上限  — 换句话说,函数在下限和上限之间的积分值突出显示为一个区域。要说明的积分值是∫ a b f ( x ) d x,其中f ( x ) = 1 2  · e x + 1,a = 1 2,b = 3 2。图 7-19 显示了结果图,并演示了matplotlib如何无缝处理数学公式的LaTeX类型设置以将其包含到绘图中。首先,函数定义,积分限制作为变量以及 x 和 y 值的数据集。

In [32]: def func(x):
             return 0.5 * np.exp(x) + 1  # ①
         a, b = 0.5, 1.5  # ②
         x = np.linspace(0, 2)  # ③
         y = func(x)  # ④
         Ix = np.linspace(a, b)  # ⑤
         Iy = func(Ix) # ⑥
         verts = [(a, 0)] + list(zip(Ix, Iy)) + [(b, 0)]  # ⑦

函数定义。

积分限制。

用于绘制函数的 x 值。

用于绘制函数的 y 值。

积分限制内的 x 值。

积分限制内的 y 值。

包含多个表示要绘制的多边形的坐标的list对象。

其次,由于需要明确放置许多单个对象,绘图本身有点复杂。

In [33]: from matplotlib.patches import Polygon
         fig, ax = plt.subplots(figsize=(10, 6))
         plt.plot(x, y, 'b', linewidth=2)  # ①
         plt.ylim(ymin=0)  # ②
         poly = Polygon(verts, facecolor='0.7', edgecolor='0.5')  # ③
         ax.add_patch(poly)  # ③
         plt.text(0.5 * (a + b), 1, r'$\int_a^b f(x)\mathrm{d}x$',
                  horizontalalignment='center', fontsize=20)  # ④
         plt.figtext(0.9, 0.075, '$x$')  # ⑤
         plt.figtext(0.075, 0.9, '$f(x)$')  # ⑤
         ax.set_xticks((a, b))  # ⑥
         ax.set_xticklabels(('$a$', '$b$'))  # ⑥
         ax.set_yticks([func(a), func(b)])  # ⑦
         ax.set_yticklabels(('$f(a)$', '$f(b)$'))  # ⑦
         # plt.savefig('../../images/ch07/mpl_19')
Out[33]: [<matplotlib.text.Text at 0x1066af438>, <matplotlib.text.Text at 0x10669ba20>]

将函数值绘制为蓝线。

定义纵坐标轴的最小 y 值。

以灰色绘制多边形(积分区域)。

将积分公式放置在图中。

放置轴标签。

放置 x 标签。

放置 y 标签。


图 7-19。指数函数、积分区域和 LaTeX 标签

静态 3D 绘图

在金融领域,确实没有太多领域真正受益于三维可视化。然而,一个应用领域是同时显示一系列到期时间和行权价的隐含波动率的波动率曲面。接下来,代码人工生成类似于波动率曲面的图形。为此,请考虑:

  • 50 到 150 之间的行权价值
  • 0.5 到 2.5 年的到期时间

这提供了一个二维坐标系。NumPynp.meshgrid()函数可以从两个一维ndarray对象生成这样的系统:

In [34]: strike = np.linspace(50, 150, 24)  # ①
In [35]: ttm = np.linspace(0.5, 2.5, 24)  # ②
In [36]: strike, ttm = np.meshgrid(strike, ttm)  # ③
In [37]: strike[:2].round(1)  # ③
Out[37]: array([[ 50. ,  54.3,  58.7,  63. ,  67.4,  71.7,  76.1,  80.4,  84.8,
                  89.1,  93.5,  97.8, 102.2, 106.5, 110.9, 115.2, 119.6, 123.9,
                 128.3, 132.6, 137. , 141.3, 145.7, 150. ],
                [ 50. ,  54.3,  58.7,  63. ,  67.4,  71.7,  76.1,  80.4,  84.8,
                  89.1,  93.5,  97.8, 102.2, 106.5, 110.9, 115.2, 119.6, 123.9,
                 128.3, 132.6, 137. , 141.3, 145.7, 150. ]])
In [38]: iv = (strike - 100) ** 2 / (100 * strike) / ttm  # ④
In [39]: iv[:5, :3]  # ④
Out[39]: array([[1.        , 0.76695652, 0.58132045],
                [0.85185185, 0.65333333, 0.4951989 ],
                [0.74193548, 0.56903226, 0.43130227],
                [0.65714286, 0.504     , 0.38201058],
                [0.58974359, 0.45230769, 0.34283001]])

ndarray对象中的行权价值。

ndarray 对象中的时间至到期值。

创建的两个二维ndarray对象(网格)。

虚拟的隐含波动率值。

由以下代码生成的图形显示在图 7-20 中:

In [40]: from mpl_toolkits.mplot3d import Axes3D  # ①
         fig = plt.figure(figsize=(10, 6))
         ax = fig.gca(projection='3d')  # ②
         surf = ax.plot_surface(strike, ttm, iv, rstride=2, cstride=2,
                                cmap=plt.cm.coolwarm, linewidth=0.5,
                                antialiased=True)  # ③
         ax.set_xlabel('strike')  # ④
         ax.set_ylabel('time-to-maturity')  # ⑤
         ax.set_zlabel('implied volatility')  # ⑥
         fig.colorbar(surf, shrink=0.5, aspect=5);  # ⑦
         # plt.savefig('../../images/ch07/mpl_20')

导入相关的 3D 绘图特性。

为 3D 绘图设置画布。

创建 3D 图。

设置 x 标签。

设置 y 标签。

设置 z 标签。

这将创建一个色标。


图 7-20。 (虚拟) 隐含波动率的三维曲面图

表 7-6 提供了plt.plot_surface()函数可以接受的不同参数的描述。

表 7-6。plot_surface的参数

参数 描述
X, Y, Z 数据值为 2D 数组
rstride 数组行跨度(步长)
cstride 数组列跨度(步长)
color 表面补丁的颜色
cmap 表面补丁的颜色映射
facecolors 各个补丁的面颜色
norm 用于将值映射到颜色的 Normalize 的实例
vmin 要映射的最小值
vmax 要映射的最大值
shade 是否着色面颜色

与二维图相似,线型可以由单个点或如下所示的单个三角形替代。图 7-21 将相同的数据绘制为 3D 散点图,但现在还使用 view_init() 方法设置了不同的视角:

In [41]: fig = plt.figure(figsize=(10, 6))
         ax = fig.add_subplot(111, projection='3d')
         ax.view_init(30, 60)  # ①
         ax.scatter(strike, ttm, iv, zdir='z', s=25,
                    c='b', marker='^')  # ②
         ax.set_xlabel('strike')
         ax.set_ylabel('time-to-maturity')
         ax.set_zlabel('implied volatility');
         # plt.savefig('../../images/ch07/mpl_21')

设置视角。

创建 3D 散点图。


图 7-21. (虚拟的) 隐含波动率的 3D 散点图


Python 金融编程第二版(三)(5)https://developer.aliyun.com/article/1559415

相关文章
|
1月前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!
|
1月前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
22天前
|
Unix Linux 程序员
[oeasy]python053_学编程为什么从hello_world_开始
视频介绍了“Hello World”程序的由来及其在编程中的重要性。从贝尔实验室诞生的Unix系统和C语言说起,讲述了“Hello World”作为经典示例的起源和流传过程。文章还探讨了C语言对其他编程语言的影响,以及它在系统编程中的地位。最后总结了“Hello World”、print、小括号和双引号等编程概念的来源。
106 80
|
11天前
|
Python
[oeasy]python055_python编程_容易出现的问题_函数名的重新赋值_print_int
本文介绍了Python编程中容易出现的问题,特别是函数名、类名和模块名的重新赋值。通过具体示例展示了将内建函数(如`print`、`int`、`max`)或模块名(如`os`)重新赋值为其他类型后,会导致原有功能失效。例如,将`print`赋值为整数后,无法再用其输出内容;将`int`赋值为整数后,无法再进行类型转换。重新赋值后,这些名称失去了原有的功能,可能导致程序错误。总结指出,已有的函数名、类名和模块名不适合覆盖赋新值,否则会失去原有功能。如果需要使用类似的变量名,建议采用其他命名方式以避免冲突。
33 14
|
21天前
|
分布式计算 大数据 数据处理
技术评测:MaxCompute MaxFrame——阿里云自研分布式计算框架的Python编程接口
随着大数据和人工智能技术的发展,数据处理的需求日益增长。阿里云推出的MaxCompute MaxFrame(简称“MaxFrame”)是一个专为Python开发者设计的分布式计算框架,它不仅支持Python编程接口,还能直接利用MaxCompute的云原生大数据计算资源和服务。本文将通过一系列最佳实践测评,探讨MaxFrame在分布式Pandas处理以及大语言模型数据处理场景中的表现,并分析其在实际工作中的应用潜力。
57 2
|
1月前
|
小程序 开发者 Python
探索Python编程:从基础到实战
本文将引导你走进Python编程的世界,从基础语法开始,逐步深入到实战项目。我们将一起探讨如何在编程中发挥创意,解决问题,并分享一些实用的技巧和心得。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供有价值的参考。让我们一起开启Python编程的探索之旅吧!
49 10
|
1月前
|
机器学习/深度学习 人工智能 数据挖掘
探索Python编程的奥秘
在数字世界的海洋中,Python如同一艘灵活的帆船,引领着无数探险者穿梭于数据的波涛之中。本文将带你领略Python编程的魅力,从基础语法到实际应用,一步步揭开Python的神秘面纱。
45 12
|
1月前
|
IDE 程序员 开发工具
Python编程入门:打造你的第一个程序
迈出编程的第一步,就像在未知的海洋中航行。本文是你启航的指南针,带你了解Python这门语言的魅力所在,并手把手教你构建第一个属于自己的程序。从安装环境到编写代码,我们将一步步走过这段旅程。准备好了吗?让我们开始吧!
|
1月前
|
关系型数据库 开发者 Python
Python编程中的面向对象设计原则####
在本文中,我们将探讨Python编程中的面向对象设计原则。面向对象编程(OOP)是一种通过使用“对象”和“类”的概念来组织代码的方法。我们将介绍SOLID原则,包括单一职责原则、开放/封闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。这些原则有助于提高代码的可读性、可维护性和可扩展性。 ####
|
1月前
|
人工智能 数据挖掘 开发者
探索Python编程之美:从基础到进阶
本文是一篇深入浅出的Python编程指南,旨在帮助初学者理解Python编程的核心概念,并引导他们逐步掌握更高级的技术。文章不仅涵盖了Python的基础语法,还深入探讨了面向对象编程、函数式编程等高级主题。通过丰富的代码示例和实践项目,读者将能够巩固所学知识,提升编程技能。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供有价值的参考和启示。让我们一起踏上Python编程的美妙旅程吧!