实现一个本地的模拟交易所(一)

论坛 期权论坛 期权     
期权匿名问答   2022-9-26 10:34   7934   0
我希望尽可能精细地做回测,把那些可能存在的滑点也尽可能测出来。因此,我需要实现一个在本地运行的模拟交易所。
模拟交易所有两个层次。
第一个层次是“单主体交易模拟”,即,给定真实交易所的逐笔数据,可知在某个价格和方向挂单时,最大可成交量是多少,由此避免那些由于交易量导致的不切实际的成交。这样,回测时可以构建更精细的订单控制过程,不同的挂单方式下的滑点也可通过回测得到。此外,只做maker的策略也可以通过这一层次的模拟交易所进行回测。
第二个层次是“多主体交易模拟”,即,多个主体共同参与交易,且主体的行为将会影响模拟过程中的价格。第一层是利用历史数据做回测,交易行为并不会影响用于回测的价格数据,然而,在真实市场中,参与交易的主体,其行为对价格或多或少是有影响的。这一层将考虑这种影响。
目前,以第一个层次的模拟交易所为实现目标,将设计对应的系统;首先用Python实现,然后用C/C++做性能优化
参与交易涉及的对象

交易的过程简单来说是,交易所将最新价格数据推送给交易者,交易者挂单,交易所处理所有的订单,撮合可能的部分,并将更新的订单状态、资产状态返回给交易者。
所以,这其中涉及到几个基本的对象:
交易的最基本的行为:买/卖
class Action(Enum):
    Buy = 0
    Sell = 1有时人们会用空、多相关的概念,即开多、开空、平多、平空,本质上可以将这四种行为归结为买和卖两种。开多、平空都对应于买,平多、开空对应于卖。使用开多、开空、平多、平空的好处是可以确保平仓时仓位只减不增——设想,如果你买入10单位的标的,现在你想要把它们卖出,由于某些意料之外的原因,该10单位标的只剩下8单位,而本地的程序认为仍然持有10单位,那么卖出10单位后,此时的仓位是-2单位,而我们预期的仓位应是0单位。如果通过开多10单位买入,平多10单位卖出,即使遇到了上述情况,也能确保平多后的仓位是0。然而,某些交易所的接口中,订单的“只减仓”这一参数也可以实现相同的效果。因此,在底层上,只采用买和卖两个交易行为,而将开平仓的行为映射到买和卖上。
class ActionBidir(Enum):
    OpenLong = 2
    OpenShort = 3
    CloseLong = 4
    CloseShort = 5

action_mapping = {
    ActionBidir.OpenLong: Action.Buy,
    ActionBidir.CloseShort: Action.Buy,
    ActionBidir.OpenShort: Action.Sell,
    ActionBidir.CloseShort: Action.Sell
}订单、订单类型、订单状态
一个订单包含的最基本信息包括交易的标的、交易量、订单状态,对于限价单而言还包含交易价格,对于停止单而言还包含触发价格,订单通常会被一个编号唯一标记,且订单挂单和更新的时间戳也会被记录下来。
class Order:
    target: str
    p: float
    q: float
    ts_create: int
    ts_update: int
    a: Action
    type: OrderType
    status: OrderStatus
    q_crossed: float
    p_stop: float
    id: int
    def __init__(self, target, p, q, ts_create, a, type, q_crossed = 0, status = OrderStatus.Submitting, p_stop = None, id = None, ts_update = None):
        self.target = target
        self.p = p
        self.q = q
        self.q_crossed = 0
        self.a = a
        self.ts_create = ts_create
        self.ts_update = ts_create if ts_update is None else ts_update
        self.type = type
        self.id = id订单的状态包括提交中、已提交、已撮合、已部分撮合、已拒单、已撤销
class OrderStatus(Enum):
    Submitting = -1
    Submitted = 0
    Fixed = 1
    PartiallyFixed = 2
    Rejected = 3
    Canceled = 4订单类型包括市价单、限价单、止损单、止盈单、限价做市单、止损做市单、止盈做市单
class OrderType(Enum):
    Limit = 0
    Stop = 1
    TakeProfit = 2
    Market = 3
    LimitMaker = 4
    StopMaker = 5
    TakeProfitMaker = 6交易所的行为
交易所的行为包括产生和推送市场行情、推送交易者的资产信息、撮合订单、推送订单状态、推送交易结果
调度程序
为了实现本地的模拟交易所,需要根据历史逐笔数据模拟实际的市场行情推送行为,同时本地的策略代理根据推送的数据进行相关的响应,进行挂撤单等操作,挂撤单行为的时间与行情数据时间如何协调,以保证时序正确,是调度程序要做的事。
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:400157
帖子:80032
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP