pyalgotrade的学习之broker模块

mac2025-01-09  17

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类。

最新回复(0)