pyalgotrade是一款成熟的事件驱动的量化回测系统,特点是灵活且回测速度快,支持tick,秒,分钟,日频及以上的回测,可扩展性较强,本文主要分析broker模块的具体组成和功能作用,作为自我学习和借鉴作用,是一篇学习日志。
broker模块的继承关系如下图所示,backtesting.Broker继承自Broker.broker,Broker.broker继承自observer.Subject。
该模块的成员如下: __cash:现金成员。 __commission:交易费模型。 __shares:字典以及买多或者卖空的股票字典,关键字是证券号,值是证券手数。 __useAdjustedValues:是否使用调整后的价格。 __started:该模块是否开始运作。 __barFeed:feed类,数据种子类,提供每bar交易时必要的数据。 __activeOrders:字典,活跃订单的字典,关键字是数字,值是订单类例如MarkerOrder类。 __allowNegativeCash:布尔值,是否允许借债。 __nextOrderId:下需要处理订单的Id。 __logger:日志类,用于输出日志的功能。 __orderEvent:继承自父类。 __dispatchPrio:调度器中的优先级,继承自父类。 __fillstrategy:填单策略类,选择对于订单处理时的方法。 __instrumentPrice:字典,关键字是证券号,值是证券价格。
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:订单 输出: 无。
经纪模块的主要任务是进行订单撮合,包括市价单,限价单,止损单和限价止损单等,是回测平台重要的组成模块,下一章学习一下feed类。