量化交易策略系列(一):Market Making

在这里插入图片描述

Market Making策略

Market Making (MM) 策略的核心思路:不持仓的情况下保持每笔交易盈利。特点是,在交易盘口上争夺成交机会和利润,高频交易,薄利多销。美股著名的最大做市商(曾经)如:Knight Capital Group 2009年在Equity的交易达到9.8亿笔,平均每小时60万笔交易,不过平均每笔交易收益.01% – .10%,即盘口价差的量级(注:盘口价差,即Spread,为(卖一价 - 买一价)/公允价格)。

数字货币领域的量化交易,缺乏行业标准,没有严格的Trader/Broker/Clearing House/Exchange 的区分,各个角色目前都是由各个交易所全权代表。好处是,交易员无需像传统金融领域那样受到各个环节的监管和剥削,可以直接面对市场;糟糕的是,正因为是直接面对市场,风险常常是不可控的。尤其是面对一个被有限的几个“鲸鱼”账户掌控的数字资产交易领域。

然而,传统金融领域的交易策略,大部分都可以直接迁移到数字资产交易领域。其中包括Market Making策略。

成交中的对手方

一笔成交中,必定有一个Maker,一个Taker。Maker是询价方,即提供一定数量的资产在某一价格上出售(或购买)。Taker则是购买者(或出售者)。之所以有Maker/Taker之区分,是因为Maker作为询价方,为这笔交易提供了“流动性”,使得Taker能够如愿以偿。

各个交易所对于一笔交易中的Maker/Taker通常采取不同的手续费规则。规则的不同来自于对该交易所“流动性”的调控。在流动性不足的交易所或市场,通常会采用降低或者返还手续费的方式来激励Maker单,即询价订单,使得“流动性”在数量上得到保障。

目前采用Maker手续费返还策略的数字资产交易所有:

  1. BitMEX 合约(返万2.5)
  2. WBFex 现货(返万2)

MM策略介绍

BitMEX Trading API
WBFex Trading API

设想一下,如果能够预测下一个Taker卖单的到来时刻,并且能预测该订单的数量,那么Maker可以从容的在现有的买一之上几个Tick的价差上开出自己的新的询价单,即新的买一价,抢在旧的买一之前与这个Taker订单成交。在有返佣的交易所,这一笔交易会带来相对于成交量万2左右的收益。

成交后,MM策略会立刻预测下一个Taker买单大到来,并且在刚刚的成交价之上几个Tick处(同时比现有的卖一单低几个Tick)挂出卖单,静候Taker来成交。如果成交,会带来另外一个万2的收益,而手中持有仓位为0。

这是个理想场景,即MM策略能够 从容 的低买高卖,赚取价差和手续费返还。各式各样的MM策略所做的都是不断的趋近与这个理想场景,在软件上使用人工智能算法,或随机动态规划算法;在硬件上使用更快的计算集群以及和交易所共谋一个更快速的网络连接渠道 (co-location)。

赚取手续费$

薄利多销的高频MM做市策略里,手续费减免尤其重要。这通常是因为,短期内(毫秒或微秒)低买高卖的利润,通常是在万一~千一的的量级,因此手续费必须低于这个量级,才能保持MM策略的持续盈利。因此,不论是传统金融交易所,如NASDAQNYSE,还是数字资产交易所,如BitMEXWBFex,都采用了Maker减免甚至负费率的措施,鼓励Maker订单,满足交易所其他用户的交易需求。

BitMEX Trading API
WBFex Trading API

MM交易代码

    def place_orders(self):
        """Create order items for use in convergence."""

        buy_orders = []
        sell_orders = []
        # Create orders from the outside in. This is intentional - let's say the inner order gets taken;
        # then we match orders from the outside in, ensuring the fewest number of orders are amended and only
        # a new order is created in the inside. If we did it inside-out, all orders would be amended
        # down and a new order would be created at the outside.
        for i in reversed(range(1, settings.ORDER_PAIRS + 1)):
            if not self.long_position_limit_exceeded():
                buy_orders.append(self.prepare_order(-i))
            if not self.short_position_limit_exceeded():
                sell_orders.append(self.prepare_order(i))

        return self.converge_orders(buy_orders, sell_orders)

    def prepare_order(self, index):
        """Create an order object."""

        if settings.RANDOM_ORDER_SIZE is True:
            quantity = random.randint(settings.MIN_ORDER_SIZE, settings.MAX_ORDER_SIZE)
        else:
            quantity = settings.ORDER_START_SIZE + ((abs(index) - 1) * settings.ORDER_STEP_SIZE)

        price = self.get_price_offset(index)

        return {
    
    'price': price, 'orderQty': quantity, 'side': "Buy" if index < 0 else "Sell"}

猜你喜欢

转载自blog.csdn.net/weixin_47368014/article/details/106501876
今日推荐