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

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

第六章:面向对象编程

软件工程的目的是控制复杂性,而不是创建它。

Pamela Zave

介绍

面向对象编程(OOP)是当今最流行的编程范式之一。正确使用时,它与过程式编程相比提供了许多优势。在许多情况下,OOP  似乎特别适用于金融建模和实施金融算法。然而,也有许多对 OOP 持批评态度的人,对 OOP  的单个方面甚至整个范式表示怀疑。本章对此持中立态度,认为 OOP  是一个重要的工具,可能不是每个问题的最佳解决方案,但应该是程序员和从事金融工作的量化人员的手头工具之一。

随着 OOP 的出现,一些新的术语也随之而来。本书和本章的最重要术语是(更多细节如下):

对象类的抽象定义。例如,一个人类。

属性

类的特性(类属性)或类的实例(实例属性)的一个特征。例如,是哺乳动物或眼睛的颜色。

方法

可以在类上实现的操作。例如,行走。

参数

一个方法接受的输入参数以影响其行为。例如,三个步骤。

对象

类的一个实例。例如,有蓝眼睛的 Sandra。

实例化

创建基于抽象类的特定对象的过程。

转换为 Python 代码,实现人类示例的简单类可能如下所示。

In [1]: class HumanBeing(object):  # ①
            def __init__(self, first_name, eye_color):  # ②
                self.first_name = first_name  # ③
                self.eye_color = eye_color  # ④
                self.position = 0  # ⑤
            def walk_steps(self, steps):  # ⑥
                self.position += steps  # ⑦

类定义语句。

在实例化时调用的特殊方法。

名字属性初始化为参数值。

眼睛颜色属性初始化为参数值。

位置属性初始化为 0。

使用steps作为参数的步行方法定义。

给定steps值后改变位置的代码。

根据类定义,可以实例化并使用一个新的 Python 对象。

In [2]: Sandra = HumanBeing('Sandra', 'blue')  # ①
In [3]: Sandra.first_name  # ②
Out[3]: 'Sandra'
In [4]: Sandra.position  # ②
Out[4]: 0
In [5]: Sandra.walk_steps(5)  # ③
In [6]: Sandra.position  # ④
Out[6]: 5

实例化。

访问属性值。

调用方法。

访问更新后的position值。

有几个人类方面可能支持使用 OOP:

自然的思考方式

人类思维通常围绕着现实世界或抽象对象展开,比如汽车或金融工具。面向对象编程适合模拟具有其特征的这类对象。

降低复杂性

通过不同的方法,面向对象编程有助于降低问题或算法的复杂性,并逐个特征进行建模。

更好的用户界面

在许多情况下,面向对象编程可以实现更美观的用户界面和更紧凑的代码。例如,当查看NumPyndarray类或pandasDataFrame类时,这一点变得显而易见。

Python 建模的方式

独立于面向对象编程的优缺点,它只是 Python 中的主导范式。这也是“在 Python 中一切皆为对象。”这句话的由来。面向对象编程还允许程序员构建自定义类,其实例的行为与标准 Python 类的任何其他实例相同。

也有一些技术方面可能支持面向对象编程:

抽象化

使用属性和方法可以构建对象的抽象、灵活的模型——重点放在相关的内容上,忽略不需要的内容。在金融领域,这可能意味着拥有一个以抽象方式模拟金融工具的通用类。这种类的实例将是由投资银行设计和提供的具体金融产品,例如。

模块化

面向对象编程简化了将代码拆分为多个模块的过程,然后将这些模块链接起来形成完整的代码基础。例如,可以通过一个类或两个类来建模股票上的欧式期权,一个用于基础股票,另一个用于期权本身。

继承

继承指的是一个类可以从另一个类继承属性和方法的概念。在金融领域,从一个通用的金融工具开始,下一个级别可能是一个通用的衍生金融工具,然后是一个欧式期权,再然后是一个欧式看涨期权。每个类都可以从更高级别的类中继承属性和方法。

聚合

聚合指的是一个对象至少部分由多个其他对象组成,这些对象可能是独立存在的。模拟欧式看涨期权的类可能具有其他对象的属性,例如基础股票和用于贴现的相关短期利率。表示股票和短期利率的对象也可以被其他对象独立使用。

组合

组合与聚合类似,但是这里的单个对象不能独立存在。考虑一个定制的固定利率互换合同和一个浮动利率互换合同。这两个腿不能独立于互换合同本身存在。

多态性

多态性可以呈现多种形式。在 Python 上下文中特别重要的是所谓的鸭子类型。这指的是可以在许多不同类及其实例上实现标准操作,而不需要准确知道正在处理的特定对象是什么。对于金融工具类,这可能意味着可以调用一个名为 get_current_price() 的方法,而不管对象的具体类型是什么(股票、期权、互换等)。

封装

此概念指的是仅通过公共方法访问类内部数据的方法。模拟股票的类可能有一个属性 current_stock_price。封装将通过方法 get_current_stock_price() 提供对属性值的访问,并将数据隐藏(使其私有化)。这种方法可能通过仅使用和可能更改属性值来避免意外效果。但是,对于如何使数据在 Python 类中私有化存在限制。

在更高层面上,软件工程中的两个主要目标可以总结如下:

可重用性

继承和多态等概念提高了代码的可重用性,增加了程序员的效率和生产力。它们还简化了代码的维护。

非冗余性

与此同时,这些方法允许构建几乎不冗余的代码,避免双重实现工作,减少调试和测试工作以及维护工作量。它还可能导致更小的总体代码基础。

本章按如下方式组织:

“Python 对象概览”

下一节将通过面向对象编程的视角简要介绍一些 Python 对象。

“Python 类基础”

本节介绍了 Python 中面向对象编程的核心要素,并以金融工具和投资组合头寸为主要示例。

“Python 数据模型”

本节讨论了 Python 数据模型的重要元素以及某些特殊方法所起的作用。

Python 对象概览

本节通过面向对象编程程序员的眼光简要介绍了一些标准对象,这些对象在前一节中已经遇到过。

int

为了简单起见,考虑一个整数对象。即使对于这样一个简单的 Python 对象,主要的面向对象编程(OOP)特征也是存在的。

In [7]: n = 5  # ①
In [8]: type(n)  # ②
Out[8]: int
In [9]: n.numerator  # ③
Out[9]: 5
In [10]: n.bit_length()  # ④
Out[10]: 3
In [11]: n + n  # ⑤
Out[11]: 10
In [12]: 2 * n  # ⑥
Out[12]: 10
In [13]: n.__sizeof__()  # ⑦
Out[13]: 28

新实例 n

对象的类型。

一个属性。

一个方法。

应用 + 运算符(加法)。

应用 * 运算符(乘法)。

调用特殊方法__sizeof__()以获取内存使用情况(以字节为单位)。¹

列表

list对象有一些额外的方法,但基本上表现方式相同。

In [14]: l = [1, 2, 3, 4]  # ①
In [15]: type(l)  # ②
Out[15]: list
In [16]: l[0]  # ③
Out[16]: 1
In [17]: l.append(10)  # ④
In [18]: l + l  # ⑤
Out[18]: [1, 2, 3, 4, 10, 1, 2, 3, 4, 10]
In [19]: 2 * l  # ⑥
Out[19]: [1, 2, 3, 4, 10, 1, 2, 3, 4, 10]
In [20]: sum(l)  # ⑦
Out[20]: 20
In [21]: l.__sizeof__()  # ⑧
Out[21]: 104

新实例l

对象的类型。

通过索引选择元素。

一个方法。

应用+运算符(连接)。

应用*运算符(连接)。

应用标准 Python 函数sum()

调用特殊方法__sizeof__()以获取内存使用情况(以字节为单位)。

ndarray

intlist对象是标准的 Python 对象。NumPyndarray对象是一个来自开源包的“自定义”对象。

In [22]: import numpy as np  # ①
In [23]: a = np.arange(16).reshape((4, 4))  # ②
In [24]: a  # ②
Out[24]: array([[ 0,  1,  2,  3],
                [ 4,  5,  6,  7],
                [ 8,  9, 10, 11],
                [12, 13, 14, 15]])
In [25]: type(a)  # ③
Out[25]: numpy.ndarray

导入numpy

新实例a

对象的类型。

尽管ndarray对象不是标准对象,但在许多情况下表现得就像是一个标准对象——这要归功于下文中解释的 Python 数据模型。

In [26]: a.nbytes  # ①
Out[26]: 128
In [27]: a.sum()  # ②
Out[27]: 120
In [28]: a.cumsum(axis=0)  # ③
Out[28]: array([[ 0,  1,  2,  3],
                [ 4,  6,  8, 10],
                [12, 15, 18, 21],
                [24, 28, 32, 36]])
In [29]: a + a  # ④
Out[29]: array([[ 0,  2,  4,  6],
                [ 8, 10, 12, 14],
                [16, 18, 20, 22],
                [24, 26, 28, 30]])
In [30]: 2 * a  # ⑤
Out[30]: array([[ 0,  2,  4,  6],
                [ 8, 10, 12, 14],
                [16, 18, 20, 22],
                [24, 26, 28, 30]])
In [31]: sum(a)  # ⑥
Out[31]: array([24, 28, 32, 36])
In [32]: np.sum(a)  # ⑦
Out[32]: 120
In [33]: a.__sizeof__()  # ⑧
Out[33]: 112

一个属性。

一个方法(聚合)。

一个方法(没有聚合)。

应用+运算符(加法)。

应用*运算符(乘法)。

应用标准 Python 函数sum()

应用NumPy通用函数np.sum()

调用特殊方法__sizeof__()以获取内存使用情况(以字节为单位)。

DataFrame

最后,快速查看pandasDataFrame对象,因为其行为大多与ndarray对象相同。首先,基于ndarray对象实例化DataFrame对象。

In [34]: import pandas as pd  # ①
In [35]: df = pd.DataFrame(a, columns=list('abcd'))  # ②
In [36]: type(df)  # ③
Out[36]: pandas.core.frame.DataFrame

导入pandas

新实例df

对象的类型。

其次,查看属性、方法和操作。

In [37]: df.columns  # ①
Out[37]: Index(['a', 'b', 'c', 'd'], dtype='object')
In [38]: df.sum()  # ②
Out[38]: a    24
         b    28
         c    32
         d    36
         dtype: int64
In [39]: df.cumsum()  # ③
Out[39]:     a   b   c   d
         0   0   1   2   3
         1   4   6   8  10
         2  12  15  18  21
         3  24  28  32  36
In [40]: df + df  # ④
Out[40]:     a   b   c   d
         0   0   2   4   6
         1   8  10  12  14
         2  16  18  20  22
         3  24  26  28  30
In [41]: 2 * df  # ⑤
Out[41]:     a   b   c   d
         0   0   2   4   6
         1   8  10  12  14
         2  16  18  20  22
         3  24  26  28  30
In [42]: np.sum(df)  # ⑥
Out[42]: a    24
         b    28
         c    32
         d    36
         dtype: int64
In [43]: df.__sizeof__()  # ⑦
Out[43]: 208

一个属性。

一个方法(聚合)。

一个方法(无聚合)。

应用+运算符(加法)。

应用*运算符(乘法)。

应用NumPy通用函数np.sum()

调用特殊方法__sizeof__()以获取以字节为单位的内存使用情况。


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

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