pyalgotrade的学习之broker模块
0.前言
pyalgotrade是一款成熟的事件驱动的量化回测系统,特点是灵活且回测速度快,支持tick,秒,分钟,日频及以上的回测,可扩展性较强,本文主要分析broker模块的具体组成和功能作用,作为自我学习和借鉴作用,是一篇学习日志。
1.broker模块的继承关系
broker模块的继承关系如下图所示,backtesting.Broker继承自Broker.broker,Broker.broker继承自observer.Subject。
-
1.1 observer.Subject
该模块是任务类,是在调度器中用来调度任务使用的,该类的成员有:
__dispatchPrio:调度器中的优先级
该类的方法有:
def start(self): 抽象方法,由下级继承并完善
def stop(self):抽象方法,由下级继承并完善
def join(self):抽象方法,由下级继承并完善
def eof(self):抽象方法,由下级继承并完善
def dispatch(self):抽象方法,由下级继承并完善
def peekDateTime(self):抽象方法,由下级继承并完善
def getDispatchPriority(self):获取任务的优先级,确定在任务队列中的位置。
def setDispatchPriority(self, dispatchPrio):设置任务优先级。
def onDispatcherRegistered(self, dispatcher):当任务被一个调度器注册是被调度。 -
1.2 Broker.broker
该类是经纪类充当经纪的角色,该类的成员有:
__dispatchPrio:继承自父类
__orderEvent:订单事件类
该类的方法有:
def getDispatchPriority(self):取得该任务的优先级
def notifyOrderEvent(self, orderEvent):订单驱动队列中执行订单事件类
def getOrderUpdatedEvent(self):返回订单驱动类
def getInstrumentTraits(self, instrument):抽象类,有子类进行完善
def getCash(self, includeShort=True):抽象类,有子类进行完善
def getShares(self, instrument):抽象类,有子类进行完善
def getPositions(self):抽象类,有子类进行完善
def getActiveOrders(self, instrument=None):抽象类,有子类进行完善
def submitOrder(self, order):抽象类,有子类进行完善
def createMarketOrder(self, action, instrument, quantity, onClose=False):抽象类,有子类进行完善
def createLimitOrder(self, action, instrument, limitPrice, quantity):抽象类,有子类进行完善
def createStopOrder(self, action, instrument, stopPrice, quantity):抽象类,有子类进行完善
def createStopLimitOrder(self, action, instrument, stopPrice, limitPrice, quantity):抽象类,有子类进行完善
def cancelOrder(self, order):抽象类,有子类进行完善
2.broker模块的成员
该模块的成员如下:
__cash:现金成员。
__commission:交易费模型。
__shares:字典以及买多或者卖空的股票字典,关键字是证券号,值是证券手数。
__useAdjustedValues:是否使用调整后的价格。
__started:该模块是否开始运作。
__barFeed:feed类,数据种子类,提供每bar交易时必要的数据。
__activeOrders:字典,活跃订单的字典,关键字是数字,值是订单类例如MarkerOrder类。
__allowNegativeCash:布尔值,是否允许借债。
__nextOrderId:下需要处理订单的Id。
__logger:日志类,用于输出日志的功能。
__orderEvent:继承自父类。
__dispatchPrio:调度器中的优先级,继承自父类。
__fillstrategy:填单策略类,选择对于订单处理时的方法。
__instrumentPrice:字典,关键字是证券号,值是证券价格。
3.broker模块的方法
1.def _getNextOrderId(self):
函数说明:
输出成员__nextOrderId的值,即下一单的订单号。
输入:
无
输出:
ret:下一单的订单号。
2.def _getBar(self, bars, instrument):
函数说明:
输出该交易时间的instrument证券号的bar类
输入:
instrument证券号
输出:
ret:该交易时间的instrument证券号的bar类。
3.def _registerOrder(self, order):
函数说明:
将order类放入成员__activeOrders队列中,即注册订单行为。
输入:
order是一个订单类
输出:
无
4.def _unregisterOrder(self, order):
函数说明:
删除成员__activeOrders队列中的order类。
输入:
order是一个订单类
输出:
无
5.def getLogger(self):
函数说明:
返回日志类。
输入:
无
输出:
成员__logger类,即日志类
6.def setAllowNegativeCash(self, allowNegativeCash):
函数说明:
设置成员__allowNegativeCash的值,表示是否允许借贷。
输入:
allowNegativeCash 布尔类是否允许借债
输出:
无
7.def getCash(self, includeShort=True):
函数说明:
计算净现金量,包括持有的现金和借出的证券。
输入:
includeShort 布尔类,默认为True。
输出:
ret输出现金持有数包括借出的股票。
8.def setCash(self, cash):
函数说明:
设置成员__cash的数值。
输入:
cash float,即现金数量。
输出:
无。
9.def getCommission(self):
函数说明:
获取交易费用模型。
输入:
无
输出:
__commission:交易费模型。
10.def setCommission(self, commission):
函数说明:
设置成员__commission:交易费模型。
输入:
commission,即交易费用类。
输出:
无。
11.def setFillStrategy(self, strategy):
函数说明:
设置成员__fillstrategy:填单策略类。
输入:
strategy,填单策略类。
输出:
无。
12.def getFillStrategy(self):
函数说明:
返回成员__fillstrategy:填单策略类。
输入:
无。
输出:
__fillstrategy:填单策略类。
13.def getUseAdjustedValues(self):
函数说明:
返回成员__useAdjustedValues:是否使用复权调整数据。
输入:
无。
输出:
成员__useAdjustedValues:是否使用复权调整数据。
14.def setUseAdjustedValues(self, useAdjusted):
函数说明:
设置成员__useAdjustedValues:是否使用复权调整数据。
输入:
useAdjusted:布尔类,是否使用复权调整数据。
输出:
无
15.def getActiveOrders(self, instrument=None):
函数说明:
输出成员__activeOrders中证券号为instrument的元素。
输入:
instrument:证券号。
输出:
列表:成员__activeOrders中证券号为instrument的元素。
16.def _getCurrentDateTime(self):
函数说明:
从__barFeed数据种子类中获取现在的交易时间。
输入:
无。
输出:
返回现在的交易时间。
17.def getInstrumentTraits(self, instrument):
函数说明:
获取类的整数类型。
输入:
instrument:证券号。
输出:
获取类的整数类型。
18.def getShares(self, instrument):
函数说明:
从字典成员__shares中获取相应证券号instrument的持股数。
输入:
instrument:证券号。
输出:
从字典成员__shares中获取相应证券号instrument的持股数。
19.def setShares(self, instrument, quantity, price):
函数说明:
设置字典成员__shares中的关键字instrument的值为quantity,同时设置字典成员__instrumentPrice中的关键字instrument的值为price。
输入:
instrument:证券号,quantity:持股数量,price:是证券价格。
输出:
无。
20.def getPositions(self):
函数说明:
返回字典成员__shares。
输入:
i无。
输出:
字典成员__shares
21.def getActiveInstruments(self):
函数说明:
从字典成员__shares中获取持股数不为0的证券号列表。
输入:
无。
输出:
从字典成员__shares中获取持股数不为0的证券号列表。
22.def _getPriceForInstrument(self, instrument):
函数说明:
从字典成员__instrumentPrice中获取证券号为instrument的证券价格。
输入:
instrument:证券号。
输出:
从字典成员__instrumentPrice中获取证券号为instrument的证券价格。
23.def getEquity(self):
函数说明:
获取组合价值和持有现金之和(__cash和__sahres中证券价值之和)。
输入:
无
输出:
ret:组合价值和持有现金之和。
24.def commitOrderExecution(self, order, dateTime, fillInfo):
函数说明:
订单执行后对于经纪类的成员的影响,1.首先从填单信息中获取交易价格和交易量,得到交易成本,更新__cash成员;2.其次更新__share成员,将交易的证券信息更新到字典中;3.通知经纪类该单以经成交;4.同时更新在订单事件中的状态,并取消订单(实际是成交了,但完成状态更新后取消了)。
输入:
order:证券单,dateTime:交易时间,fillInfo:填单信息
输出:
无
25.def submitOrder(self, order):
函数说明:
提交订单的方法:1.首先将订单的状态改为已经初始化;2.然后设置提交订单的id和时间;3,将订单的状态改为已提交。3.通知订单驱动类该订单已经提交。
输入:
order:证券单。
输出:
无
26.def preProcessOrder(self, order, bar):
函数说明:
订单的预处理:1.如果订单不是等待直到成交,那么判断截止状态,如果bar_的时间大于订单接收时间则为True,否则为False;2.如果bar_的时间大于订单接收时间,则ret为False,注销该订单,将该订单转台设为取消,并通知订单事件类该订单过期。
输入:
order:证券单,bar:与订单相关的那一bar
输出:
ret:布尔值
27.def postProcessOrder(self, order, bar):
函数说明:
订单的后处理:1.如果订单不是等待直到成交,那么判断截止状态为False,如果交易频率大于日级别则截止状态为bar_的日期是否大于订单可接受日期;如果订单超过了可执行日期则注销该订单,将该订单转台设为取消,并通知订单事件类该订单过期。
输入:
order:证券单,bar:与订单相关的那一bar
输出:
ret:布尔值
28.def processOrder(self, order, bar):
函数说明:
订单的处理:1.首先进行订单的预处理;2.然后执行订单的成交策略,并得到成交信息;3.如果订单任然活跃执行后处理。
输入:
order:证券单,bar:与订单相关的那一bar
输出:
无
29.def __onBarsImpl(self, order, bars):
函数说明:
每一bar的执行:1.首先从bars类中获得证券号为order证券号的bar_2.判断订单是否被提交,如果已提交设置可接受成交日期,并将订单状态设置为可接受,通知订单事件类可接受;3.如果订单活跃调用__processOrder函数。
输入:
order:证券单,bars:交易数据bars类
输出:
无
30.def onBars(self, dateTime, bars):
函数说明:
每一bar的订单交易活动:1.调用填单策略类的onBars函数;2.对于每一个成员__activeOrders中的活跃订单执行__onBarsImpl函数进行撮合。
输入:
order:证券单,bars:交易数据bars类
输出:
无
31.def start(self):
函数说明:
类开始运作的方法
输入:
无
输出:
无
32.def stop(self):
函数说明:
类停止运作的方法
输入:
无
输出:
无
33.def join(self):
函数说明:
将经纪最为一个线程的join方法
输入:
无
输出:
无
34.def eof(self):
函数说明:
输出成员__barFeed的停止符,判断经纪类的运行是否应该停止。
输入:
无
输出:
eof:停止符号。
35.def dispatch(self):
函数说明:
调度方法。
输入:
无
输出:
无。
36.def peekDateTime(self):
函数说明:
峰值时间方法。
输入:
无
输出:
无。
37.def createMarketOrder(self, action, instrument, quantity, onClose=False):
函数说明:
调用MarketOrder类,并通过输入的参数初始化。
输入:
action:是否活跃, instrument:证券号, quantity:交易数量, onClose:是否使用收盘价
输出:
order。
38.def createLimitOrder(self, action, instrument, limitPrice, quantity):
函数说明:
调用LimitOrder类,并通过输入的参数初始化。
输入:
action:是否活跃, instrument:证券号, limitPrice:限价单报价,quantity:交易数量
输出:
order。
39.def createStopOrder(self, action, instrument, stopPrice, quantity):
函数说明:
调用StopOrder类,并通过输入的参数初始化。
输入:
action:是否活跃, instrument:证券号, stopPrice:指损单报价,quantity:交易数量
输出:
order。
40.def createStopLimitOrder(self, action, instrument, stopPrice, limitPrice, quantity):
函数说明:
调用StopLimitOrder类,并通过输入的参数初始化。
输入:
action:是否活跃, instrument:证券号, stopPrice:指损单报价,limitPrice:限价单报价,quantity:交易数量
输出:
order。
41.def cancelOrder(self, order):
函数说明:
首先从成员__activeOrders中取出order相应订单的单子;然后解注册单子,并将单子的状态设置为取消。并通知订单驱动类该单已经取消。
输入:
order:订单
输出:
无。
4.结束语
经纪模块的主要任务是进行订单撮合,包括市价单,限价单,止损单和限价止损单等,是回测平台重要的组成模块,下一章学习一下feed类。