pyalgotrade的学习之broker模块

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值