工欲善其事,必先利其器。上篇布林带——泡泡玛特中,大量笔墨耗费在了“账户”和“交易”之上,而二者在量化交易中,几乎时时刻刻都要用到。接下来,会花两篇文章分别将二者封装。
什么叫封装?
好比一辆汽车,它的组成元素有很多。发动机、变速器、刹车系统、电路系统、悬挂系统……这些所有的零部件经过精密的组装,最终形成了一辆汽车。那么,组装的过程就叫“封装”,而组装而成的汽车就等同于“账户”或者“交易”。
为什么要封装?
想想看,如果没有封装,岂不是每一次想驾车出行,都得把零部件汇集后给它组装好才能出发。
“账户”和“交易”也是如此,总不能每次用它的时候,都怼上一堆繁琐的代码,耗时耗力不说,还会让文章变得十分冗余。
一旦将其封装,只需掌握它的接口,知道怎么用就够了。对于汽车而言,方向盘、档位、刹车、油门……这些就是接口,只要掌握这些接口,就掌握了汽车的使用。
言归正传,上篇谈到用3个DataFrame数据描述一个账户,分别表示资产详情、持仓、订单记录。
一个账户的相关信息,是随着行情波动及交易不断变化的,为保证代码复用,本着面向对象编程的原则,将有关账户的所有操作进行封装,代码如下:
"""
Account类,实现对账户的管理
"""
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
class Account(object):
def __init__(self, capital):
# capital 账户初始本金
self.capital = capital
self.init_account()
def init_account(self):
## 初始化账户
# 资产详情 (日期、总资产、现金、股票资产、收益、收益率)
self.asset = pd.DataFrame(
columns = ['date','total', 'cash', 'stock', 'profit', 'profit_rate'])
self.asset = self.asset.append({
'date' : np.nan,
'total' : self.capital,
'cash