如何用Python的面向对象编程方法节约代码

如何用对象继承来减少量化策略代码量



在真格量化的API文档里我们经常遇到“bal.CashBalance”、“order.id”这类看起来非常诡异的变量写法。这都是些什么东西呢?

这得从“面向对象”(Object Oriented)的编程思想说起。

首先,”对象“可以是我们想研究的任何事物,从一个自然数到一个星系,都可以视为对象。它不仅可以是具体的事物,比如一吨大豆,还可以是更抽象的规则,比如大豆期货合约。

其次,对象具有状态和行为。我们可以用各种数值来描述对象的状态,如对于大豆期货合约,可以有合约乘数、交割日期、当前价格等等。对象也有对应的行为,或者操作,比如对于大豆期货合约,我们可以买入、卖出、开仓、平仓、交割等等。我们可以把这些状态和行为都和这个对象关联起来。

再次,对于具有相近特性、类似行为的对象,我们可以将其归为一类,比如豆粕期货合约在很多属性和行为上与大豆期货合约颇为相似。我们可以将它们都归为“期货合约”这个类别。豆粕期货合约、大豆期货合约等等合约的抽象就是期货合约这个“类”。“期货合约”这个类的具体化,可以是大豆期货或者豆粕期货这个“对象”。

最后,我们可以通过各种“方法”(比如期货合约的买卖、查询)来对对象进行操作,并且获取各种“信息”(比如合约乘数、买卖状态)。

还是以期货合约为例,我们要用Python创建一个“期货合约”的“类”:

其中init()方法是一种特殊的方法,被称为类的初始化方法,当创建了这个类的实例时就会调用该方法。

有了期货合约“Contract”这个类,我们可以在这个类里通过“初始化方法”(即输入合约名和合约乘数)创建几个对象,也就是具体的期货合约:

比如我们用以下语句创建了三个期货合约对象:

con1=Contract("M.DCE",10)

con2=Contract("IF.CFFEX",300)

con3=Contract("TA.CZCE",5)

现在我们可以调用displayContrac方法就能显示这些合约的名称和合约乘数(我们用“.”来连接对象名和其属性或方法,也就是”对象名.属性“或者”对象名.方法“):

con1.displayContract()

con2.displayContract()

con3.displayContract()

结果显示为:

Contract Name : M.DCE , multiplier: 10

Contract Name : IF.CFFEX , multiplier: 300

Contract Name : TA.CZCE , multiplier: 5

我们还可以通过Contract.ContractCount来访问“类变量”,这里是对合约数量的计数:

print "total contracts %d" % Contract.ContractCount

结果显示为:

3

因为我们一共建立了3个合约对象。

对于期货合约这个类在初始化时还没有的属性,我们也可以轻易地增加,比如我们设定合约1也就是con1的价格为2555:

con1.price=2555

然后我们可以用getattr(对象名,属性名)来访问这个属性,或者更简洁地,用”变量名.属性名“来直接访问:

print "price is %d" % getattr(con1,‘price‘)

或者

print "price is %d" % con1.price

结果都是

price is 2555

我们还可以通过GetContractValue方法来计算合约的价值(合约价格乘以合约乘数):

print con1.GetContractValue()

结果为:

25550

面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。比如我们可以再定义一个“期权合约”类来作为”期货合约“类的“子类”:

子类的定义方法为:

class 子类名(父类名):

............

我们可以先创建一个期权合约对象(创建时包含合约代码、合约乘数、对应期货合约代码):

op1=Options("OM.DCE",10,"M.DCE")

然后设定其价格:

op1.price=20

然后可以直接调用GetContractValue方法来求合约价值:

op1.displayContract()

输出为:

200

也就是20×10.

虽然我们并未在期权合约类中去定义GetContractValue方法,但是期权合约类从期货合约类直接继承了GetContractValue方法,不劳我们写一行代码(这对程序员来说是绝佳的体验),可以说是非常省事了!

知道了Python面向对象的编程方法,下次您再看到“context.accounts["回测期货"].GetOrder(order.id)”该不会犯晕了吧?

原文地址:https://blog.51cto.com/14258357/2376816

时间: 2024-07-30 08:30:52

如何用Python的面向对象编程方法节约代码的相关文章

Python 3面向对象编程

这篇是计算机类的优质预售推荐>>>><Python 3面向对象编程> 编辑推荐 本书不是Python 的入门书籍,适合具有Python 基础经验的开发人员阅读.如果你拥有其他面向对象语言的经验,你会更容易理解本书的内容. 内容简介 Python 是一种面向对象的解释型语言,面向对象是其非常重要的特性.本书通过Python 的数据结构.语法.设计模式,从简单到复杂,从初级到高级,一步步通过例子来展示了Python 中面向对象的概念和原则.本书不是Python 的入门书籍,

python的面向对象编程

面向对象编程是一种程序的范式,它把程序看成是对不同对象的相互调用,对现实世界建立的一种模型. 面向对象编程的基本思想,类和实例.类用于定义抽象对象,实例根据类的定义被创建出来. 在python当中我们使用下面的方法来定义类(按照 Python 的编程习惯,类名以大写字母开头,紧接着是(object),表示该类是从哪个类继承下来的.): class Python(object): pass 我们实例化方法的话呢就使用: xaioming = Python() 在面向对象之后呢我们要进行属性的设置.

python 之面向对象编程

面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行.为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数通过切割成小块函数来降低系统的复杂度. 而面向对象的程序设计把计算机程序视为一组对象的集合,而每个对象都可以接收其他对象发过来的消息,并处理这些消息,计算机程序的执行就是一系列消息在各个对象

Python基础----面向对象编程介绍、类和对象

面向对象变成介绍 面向过程编程 核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西.主要应用在一旦完成很少修改的地方,如linux内核.git.apache服务器等 优点:极大的降低了程序的设计复杂度 缺点:可扩展性差,改动一个地方很可能要改多个地方,牵一发而动全身 面向对象编程:不是编程的全部,只是用来解决软件可扩展性的 核心是对象(上帝式思维),对象作为程序的基本单元,一个对象包含了数据和操作数据的函数.面向对象就是把计算

深入理解javascript中实现面向对象编程方法

介绍Javascript中面向对象编程思想之前,需要对以下几个概念有了解: 1. 浅拷贝和深拷贝:程序在运行过程中使用的变量有在栈上的变量和在堆上的变量,在对象或者变量的赋值操作过程中,大多数情况先是复制栈上的信息,这样就会出现以下情况,如果变量是对象,那么这一操作,复制的只是真正对象所在 的堆内存空间的起始地址,这就是所谓的浅拷贝,如果是深拷贝,则是在内存堆空间中重新分配一个内存,并把分配的内存的起始地址复制过去. 2. 引用类型数据和值类型数据:谈到引用类型数据和值类型数据,自然而然的联想到

python基础-面向对象编程

面向对象编程 OOP编程是利用"类"和"对象"来创建各种模型来实现对真实世界的描述,使用面向对象编程的原因一方面是因为它可以使程序的维护和扩展变得更简单,并且可以大大提高程序开发效率 ,另外,基于面向对象的程序可以使它人更加容易理解你的代码逻辑,从而使团队开发变得更从容. 面向对象的几个核心特性如下 Class 类一个类即是对一类拥有相同属性的对象的抽象.蓝图.原型.在类中定义了这些对象的都具备的属性(variables(data)).共同的方法 Object 对象

PyTorch框架+Python 3面向对象编程学习笔记

一.CNN情感分类中的面向对象部分 sparse.py 1 super(Embedding, self).__init__() 表示需要父类初始化,即要运行父类的_init_(),如果没有这个,则要自定义初始化 1 self.weight = Parameter(torch.Tensor(num_embeddings, embedding_dim)) Parameter跳转 1 class Parameter(Variable): 2 """A kind of Variabl

python 中面向对象编程简单总结3--定制类

声明:资源来自慕课网python学习课程,以下只是个人学习总结,仅供参考 1.Python类的特殊方法 特征:以  __ 开头并结尾的方法,比如用于print的__str__() , __getattr__(),__setattr__()等   不需要在代码中直接调用, Python的某些函数和操作符会自动调用. 可以自己定制实现,如__str__()方法 class Person(object): def __init__(self,name,gender): self.name = name

python之面向对象编程

1.面向对象编程的含义,可百度 2.类:class   对比现实世界来说就是一个种类,一个模型. 3.实例化:把模型做成实际东西的过程叫做实例化 4.实例/对象:就是具体造出来的东西,通过类实例化的东西 比如: class Car():#造车,需要模型,也就是类 def run(self): print('汽车在跑...') bus = Car() ##把模型做成实际的一个汽车,这个过程叫做实例化#bus是一个实例/对象bus.run() #造好汽车后,想让汽车跑直接调用函数就行 编程操作.笔记