(说明以下, portfolio类的逻辑是最复杂的!很难理解, 需要花费最多的精力)
在之前的文章中,基于事件驱动的回测我们考虑了如何构建一个Strategy类结构。策略在这里定义是用来生成信号,该信号被portfolio使用来做决策关于是否发送订单。所以在之前它是自然的来创建一个Portfolio的抽象基类(ABC)这里所有的随后的子类继承自这个基类。
本文描述一个NaivePortfolio对象如何跟踪仓位在portfolio中炳生成一个订单,该订单有一个综合数量的股票组成基于signals. 然后portfolio对象将包括更多复杂的风险管理工具并且会是后边文章的主题。
仓位跟踪和订单管理
portfolio的订单管理系统是可能最复杂的组件关于一个事件驱动的回测。它的作用是保持对所有市场仓位的跟踪以及该仓位的市场价值(也就是"持有”)。这是简单的一个预测关于该仓位的流动价值,然后从数据处理的部分延申过来的。
除了仓位和持股的管理外, portfolio必须同样考虑到风险因素和仓位大小技术从而优化订单,在订单要被发给一个brokerage或者市场资产的其他形式。
继续在该事件类结构的链条中,一个Portfolio对象必须可以处理SignalEvent对象,生成OrderEvent对象并且把FillEvent集成到更新仓位。从而它毫不怀疑就是Portfolio对象是最大的事件驱动的组件,在整个代码链条中(LOC).
实现
我们创建了一个新的文件portfolio.py 然后引入必需的一些库。这些和之前那些抽象基类都是类似的。我们需要引入基础的方法从math库里从而生成整数类型的订单大小,我们同样需要FillEvent和OrderEvent当portfolio同时处理它们。
import datetime
import numpy as np
import pandas as pd
import Queue
from abc import ABCMeta, abstractmethod
from math import floor
from event import FillEvent, OrderEvent
如之前那样我们创建了一个Portfolio的ABC类,然后有两个纯虚函数update_signal和update_fill. 那么之前的处理新的交易信号已经获取到从事件队列然后后边的处理fills从一个执行处理的对象中获取
本文章的中心主题是NaivePortfolio类。它被设计来处理仓位大小和当前持仓,但会以一种'dumb‘的形式执行交易订单,通过简单的传送他们到brokerage通过一个事先定义好的固定的数量打消,包括现金持有。这些所有的假设,但是他们帮助规划出一个portfolio订单管理系统(OMS)函数在一个事件驱动的模式中
NaivePortfolio要求一个初始化的资本值,这里我们设置为缺省的100,000美元。同样也要求一个开始的时间。
这个Portfolio包含了一个all_positions和current_positions函数。前边的函数存储一个列表关于所有前边的仓位记录在这个市场data事件的时间戳。一个仓位是简单的资产的数量。负的仓位表示改资产已经被看空。后边的函数存储一个词典包含当前的仓位对于最后的市场bar更新。
除了仓位,portfolio还存储持