如何用Python的面向对象编程方法节约代码
admin
2023-07-10 06:04:11
0

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


在真格量化的API文档里我们经常遇到“bal.CashBalance”、“order.id”这类看起来非常诡异的变量写法。这都是些什么东西呢?
如何用Python的面向对象编程方法节约代码
如何用Python的面向对象编程方法节约代码

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

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

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

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

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

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

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

如何用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

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

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

子类的定义方法为:

class 子类名(父类名):

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

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

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

然后设定其价格:

op1.price=20

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

op1.displayContract()

输出为:

200

也就是20×10.

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

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

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

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

相关内容

热门资讯

美伊谈判濒临破裂之际,伊朗议长... 因为以色列持续对黎巴嫩进行军事打击,伊朗宣布暂停同美国的谈判。不过美国总统特朗普称,对话仍在继续。谈...
罕见!以军政策发生“重大转变” 新华社北京6月1日电 题:罕见纵深推进,以军对黎行动会否搅动美伊谈判新华社记者刘品然 阚静文 席玥以...
山西太原发现一处新石器遗址,出... 山西省太原市文物保护研究院协同相关科研机构,近期在太原市阳曲县西盘威村发现一处新石器时代重要遗址——...
伊媒发布穆杰塔巴罕见照片 伊朗塔斯尼姆通讯社6月1日发布了一张最高领袖穆杰塔巴的照片。照片中,穆杰塔巴面露笑容,抱着一个婴儿。...
福建“泡药杨梅”曝光后,浙江杨... 这两天,浙江本地杨梅少量进入市场。虽然受到此前福建 “泡药杨梅” 事件影响,市场整体销量相比去年同期...
尺素金声 | 前4月规上工业企... 5月27日,国家统计局发布最新数据显示,今年前4月,全国规上工业企业实现利润同比增长18.2%,增速...
郑丽文:台湾民众越来越了解“台... 针对台湾《联合报》民调显示,63%受访者民意希望维持现状,即将访美的中国国民党主席郑丽文1日表示,民...
美前副总统:共和党失去了方向,... 2026年是美国的中期选举年,共和党选情不利,可能在年底的选举中遭遇挫败。美国前副总统彭斯5月31日...
南枝原来去过中国?《给阿嬷的情... 《给阿嬷的情书》票房口碑双丰收,目前票房已突破13亿。凤凰卫视最新一期《问答神州》专访了该片导演蓝鸿...
法国海军扣押一艘俄“影子舰队”... 近日,法国海军在大西洋海域扣押了一艘据称从俄罗斯摩尔曼斯克出发的油轮,引发俄方强烈不满。俄新社6月1...