成功的量化交易 PART 6——自动化交易(2)


成功的量化交易 PART 6——自动化交易(2)

事件

要讨论的第一个组件是事件类层次结构。在此基础结构中,有四种类型的事件允许通过事件队列在上述组件之间进行通信。他们是MarketEvent, SignalEvent, OrderEvent 和 FillEvent.


层次结构中的父类称为事件。它是一个基类,不提供任何功能或特定的接口。由于在许多实现中,事件对象可能会开发出更大的复杂性,因此通过创建一个类层次结构来“保证未来”。

#!/usr/bin/python

# -*- coding: utf-8 -*-

# event.py from __future__ import print_function

class Event(object):

"""
事件是为所有后续(继承)事件提供接口的基类,

这将触发进一步的事件

在交易的基础设施中。

"""

pass


市场事件

当回溯测试系统的外部while循环开始一个新的“心跳”时,就会触发市场事件。当数据处理器对象接收到当前正在跟踪的任何品种的最新市场数据时,就会发生这种情况。它用于触发策略对象,生成新的交易信号。事件对象仅包含它是市场事件的标识,没有其他结构。

# event.py
class MarketEvent(Event):
"""
处理收到一个新的市场更新的事件
与相应的bar
"""
def __init__(self):
"""
初始化市场事件
"""
self.type = ’MARKET’


信号事件

策略对象使用市场数据来创建新的信号事件。信号事件包含一个策略ID、一个股票代码、生成它的时间戳、一个方向(多或空)和一个“强度”指示器(这对于均值回归策略非常有用)。使用信号事件作为对投资组合对象如何交易的建议。

# event.py
class SignalEvent(Event):
"""
处理从策略对象发送信号的事件。
这是由投资组合对象接收并执行的。
"""
def __init__(self, strategy_id, symbol, datetime, signal_type, strength):
"""
初始化信号事件。
参数:
strategy_id - 策略生成信号的唯一标示符。
symbol - 股票品种, e.g. ’GOOG’.
datetime - 生成信号的时间戳。.
signal_type - 多或空(’LONG’ or ’SHORT’).
strength - 一个调整因子“建议”,用于在投资组合水平上衡量数量。
对配对策略很有用。
"""
self.type = ’SIGNAL’
self.strategy_id = strategy_id
self.symbol = symbol
self.datetime = datetime
self.signal_type = signal_type
self.strength = strength


订单事件

当一个投资组合对象接收到信号事件时,它会在更广泛的投资组合上下文中根据风险和头寸规模对其进行评估。这最终会导致订单事件被发送到执行处理器。


订单事件比信号事件稍微复杂一些,因为除了前面提到的信号事件属性之外,它还包含一个数量字段。数量由投资组合约束决定。此外,订单事件还有一个print_order()方法,如果需要,该方法用于将信息输出到控制台。


# event.py
class OrderEvent(Event):
"""
处理向执行系统发送订单的事件。
订单包含一个品种(如GOOG),一个类型(市价或限价),
数量和方向。
"""
def __init__(self, symbol, order_type, quantity, direction):
"""
初始化订单类型,设置订单类型为
市场订单(' MKT ')或限价订单(' LMT ')
有一个数量(累计)和它的方向(“买”或“卖出”)。
参数:
symbol - 交易的品种.
order_type - ’MKT’ 或 ’LMT’ 作为市价或者限价.
quantity - 非负整数的数量.
direction - “买入”或“卖出”做多或做空.
"""
self.type = ’ORDER’
self.symbol = symbol


self.order_type = order_type
self.quantity = quantity
self.direction = direction
def print_order(self):
"""
输出订单中的值。
"""
print(
"Order: Symbol=%s, Type=%s, Quantity=%s, Direction=%s" %
(self.symbol, self.order_type, self.quantity, self.direction)
)


填充事件

当执行处理器接收到订单事件时,它必须处理该订单。一旦订单被处理,它将生成填充事件,该事件描述购买或销售的成本以及交易成本,如费用或滑点。


填充事件是最复杂的事件。它包含一个时间戳,表示订单何时完成、订单的符号、执行的交易所、交易的股票数量、购买的实际价格和产生的佣金。


佣金是使用交互式经纪人佣金计算的。对于美国API订单,每笔订单的佣金最低为1.30美元,根据交易规模在500股以下或以上,每股的佣金为0.013美元或0.08美元。

# event.py
class FillEvent(Event):
"""
封装了已填满的订单的概念,
即从中介返回的订单。
存储实际填充的工具数量和价格。
此外,存储交易的佣金来自经纪。
"""
def __init__(self, timeindex, symbol, exchange, quantity,
direction, fill_cost, commission=None):
"""
初始化FillEvent对象。设置品种,交换,
数量,方向,填充成本和可选
佣金。
如果未提供佣金,则填写对象将提供佣金
根据交易规模和互动性来计算
代理费用。
参数:
timeindex - 订单填写时的bar分辨率。
symbol - 填充的工具。
exchange - 订单填写的交易所。
quantity - 已填满的数量。
direction - 填充方向(‘买入’或‘卖出’)
fill_cost - 持有的美元价值。
commission - 从IB发送的可选佣金。
"""
self.type = ’FILL’
self.timeindex = timeindex
self.symbol = symbol
self.exchange = exchange
self.quantity = quantity
self.direction = direction


self.fill_cost = fill_cost
# Calculate commission
if commission is None:
self.commission = self.calculate_ib_commission()
else:
self.commission = commission
def calculate_ib_commission(self):
"""
根据API的交互式经纪人费用结构计算交易费用,
以美元为单位。
这并不包括交易所或ECN费用。
基于“美国API指令指令”:
https://www.interactivebrokers.com/en/index.php? f=commission&p=stocks2
"""
full_cost = 1.3
if self.quantity <= 500:
full_cost = max(1.3, 0.013 * self.quantity)
else: # Greater than 500
full_cost = max(1.3, 0.008 * self.quantity)
return full_cost


分享到:


相關文章: