浅谈比特币现货做市策略 这篇文章是上一篇文章浅谈比特币期货做市策略的火币现货版本。现货的做市策略,跟期货做市很类似,复杂性甚至还不如期货做市策略(因为期货做市策略还要考虑锁仓、移仓、对手盘减仓等复杂的期货相关的处理逻辑)。 现货做市策略主要有以下几个模块: 1、短期趋势判断模块:判断短期的趋势,如果呈现极端行情,暂停做市;如果单边趋势较为明显,减少做市订单的委托数量。 2、做市模块(使用做市算法下单功能):分析买卖盘口信息,如果价差满足条件,利用做市算法下单功能,在上下买卖N档进行批量下单 3、再平衡模块(使用再平衡算法下单功能):分析当前持仓比例与初始持仓比例的差异(净头寸),如果超过一定限额,启动再平衡功能。再平衡功能启动后,系统利用再平衡算法下单功能,对净头寸进行消化处理(即到市场去对冲掉该部分净头寸。如果净头寸为多,则下达卖单;反之,则下达买单,直到净头寸减少到可承受的大小) 4、主循环:负责粘合1,2,3的逻辑并使之能够持续轮询执行。其中,1和2是顺序处理模块,3是独立的线程。 下面逐一介绍各个模块的代码构成。 一、短期趋势判断模块 使用如下函数判断短期趋势: # 价格趋势系数 def price_trend_factor(self, trades, buy1_price, sell1_price, buy2_price, sell2_price, buy3_price, sell3_price, vol_list, index_type=None, symmetric=True): prices = trades["price"].values.tolist() latest_trades = prices[-6:] mid_price = (buy1_price+sell1_price)/2*0.7 + (buy2_price+sell2_price)/2*0.2 + (buy3_price+sell3_price)/2*0.1 latest_trades.append(mid_price) is_bull_trend = False is_bear_trend = False last_price_too_far_from_latest = False has_large_vol_trade = False if latest_trades[-1] > max(latest_trades[:-1]) + latest_trades[-1]*0.00005 or (latest_trades[-1] > max(latest_trades[:-2]) + latest_trades[-1]*0.00005 and latest_trades[-1] > latest_trades[-2]): is_bull_trend = True elif latest_trades[-1] < min(latest_trades[:-1]) - latest_trades[-1]*0.00005 or (latest_trades[-1] < min(latest_trades[:-2]) - latest_trades[-1]*0.00005 and latest_trades[-1] < latest_trades[-2]): is_bear_trend = True if abs(latest_trades[-1] - latest_trades[-2]*0.7 - latest_trades[-3]*0.2 - latest_trades[-4]*0.1) > latest_trades[-1]*0.002: last_price_too_far_from_latest =…
一、什么是做市策略 做市策略(market-maker strategy)是一种风险中立(risk-neutral)盘口价差套利策略。其基本原理是:在盘口的卖一和买一价之间,插入委买单和委卖单,如果插入的两个单子都成交的话,做市商就吃到了买卖单之间的价差,而整个过程结束后,做市商所持有的头寸并没有变化。如果买卖单之间的价差扣除各种交易手续费之后还有盈余,那么该做市商就获得了相应的盈利。 做市策略是一种增加交易所流动性的策略,一般来讲,成熟的交易市场为了提升自身的流动性,会用低佣金(甚至为做市商提供流动性奖励金)的办法,吸引做市商来该市场做市。 二、做市策略需要注意的事项 1 做市时机的选择。做市商本质上是整个市场的交易对手方。如果市场呈现急剧的单边行情,做市商下达的买卖委托单会大概率出现单边成交的情况,因此做市商手中就会积累大量的风险头寸,这是做市商不想承担的风险。因此,做市商在选择是否下达做市指令之前,都会预判一下市场的趋势明显程度,如果市场短期内呈现非常明显的趋势信号,做市商就会相应地减少自己的做市单数量(甚至停止做市) 2 净头寸的处理。做市商手中累计的净头寸,可以通过很多种办法来处理,下面列举其中两种: (1)在下一次做市时,处理掉累积的净头寸。比如做市商目前净头寸有2BTC,下次做市时,他就可以下达一个卖3BTC的委卖单,一个买1BTC的委买单。这种做法好处是净头寸可以及时得到处理,坏处是净头寸处理的时机(价格)可能不是最优的。 (2)第二种方法是开立另外一个独立的程序,对累积的净头寸进行成本计算,然后按照成本价*(1+一定比例的手续费+一定比例的profit margin),将该头寸反向甩出市场,甩出方法又有两种:a. 按限价单从价优到价劣依次甩出市场,超时不成交的部分则撤单,等待下次机会;b. 先按限价单从价优到价劣依次甩出市场,超时不成交的部分,则按市价单甩货。第一种方法的好处是甩货成本可控,但是甩货周期可能会拖得比较长;第二种方法则能有效地控制甩货周期,但是成本不可控,孰优孰劣,需要做市商根据自己的风险偏好慎重考虑。 3 期货换合约(移仓)的处理 期货合约都有一个到期日,在到期日结束时刻的前几个小时,我们不建议做市商继续做市,而是利用这几个小时,将即将到期的期货合约进行移仓。移仓的意思就是平掉当前期货合约的仓位,然后再开同样仓位大小的下周合约。当然,移仓也是需要考虑成本的。如果当前持仓是多头,那么我们希望移仓的时间点是在下周期货贴水最厉害的时候;反之,我们则希望移仓的时间点是在下周期货升水最厉害的时候。等移仓做完以后,做市策略继续恢复执行。 三、一个典型的比特币期货做市策略源码分享 注意,以下的策略需要其他WeQuant基础类库的支持才能运行,这里仅给出策略核心源码,是为了让读者对做市策略本身有一个具体的认识,而不用去太纠结底层下单、统计收益、收发邮件、进程监控等技术细节。关于代码的详细解释,欢迎入QQ群讨论:519538535。 期货做市策略源码: #!/usr/bin/env python # -*- coding: utf-8 -*- from signalGenerator.futureSpotArb import * from signalGenerator.strategyConfig import changeFutureContractConfig as rollCfg import time, threading class FutureMarketMaker(FutureSpotArb): def __init__(self, startRunningTime, orderRatio, timeInterval, orderWaitingTime, coinMarketType, open_diff, close_diff, heart_beat_time, depth_data, account_info, transaction_info, maximum_qty_multiplier=None, dailyExitTime=None): super(FutureMarketMaker, self).__init__(startRunningTime, orderRatio, timeInterval, orderWaitingTime, coinMarketType, open_diff, close_diff, heart_beat_time, depth_data, account_info, transaction_info, maximum_qty_multiplier=maximum_qty_multiplier, dailyExitTime=dailyExitTime) # 显示在邮件中的策略名字 self.strat_name = "期货做市-%s" % startRunningTime.strftime("%Y%m%d_%H%M%S") self.trade_threshold = 0.0003 * 1.01 self.sell_cut = 0.6 self.buy_cut = 0.6 self.leverage = 5 self.remaining_delta_cash = 0 # 策略下单参数 self.coin_type = helper.HUOBI_COIN_TYPE_BTC…
价值定投策略在比特币市场中的应用 今天WeQuant君的朋友圈被如下图片刷屏了: 这几个朋友是WeQuant君崇拜的比特币资深玩家,在这个市场翻手为云,覆手为雨。在这几位朋友看来,比特币是一个非常值得长期看好的投资品种,不然的话,何来“一币一别墅”之说呢? 中本聪的算法决定了比特币只有有限的2100万枚,而央行的印钞机却是在全负荷运转,人民币兑美元汇率一次次跌破历史低位,国家外汇管控越来越严格,固定资产泡沫横飞……在这样的背景下,比特币这种稀缺的投资标的被外界关注和热捧,也是情理之中的。 假如你也是一个比特币的铁杆粉丝,并希望通过长期持续投资的方式慢慢屯币,但是你又不知道什么样的屯币方法是靠谱的、低成本的,那么,我可以告诉你,本篇文章将会是你的菜。 一、什么是价值定投策略 相信不少朋友有过定投基金的理财经验。所谓定投,就是指定期投入一些资金,使得所持有的资产的市值呈现线性增长的趋势。在比特币市场,定投指的就是你每个月(或者每天,或其他自定义的频率)投入一些钱,使得你的比特币持仓的市值呈现一个阶梯状的上升曲线。 如下就是一个价值定投策略的比特币市值走势图: 假如一月份的币价为4000元,在一月底我们要建立2万元的仓位,这个仓位对应着5个比特币的市值。所以我们需要购买5个比特币,花费2万元; 到了二月份,持仓的目标市值是4万元。假如币价下跌至2000元,则二月份需要买入的比特币数量为:[二月份目标市值(4万元)- 现有仓位市值(2000*5)]/二月份币价(2000元)=15个。所以我们需要购买15个比特币,花费3万元(币价2000元);购入后,持仓总比特币数量为20个。 到了三月份,持仓的目标市值是6万元。假如币价上升至5000元,现有持仓市值 = 5000*20 = 10万元,已经超过6万元的目标市值,这个时候,就需要卖出比特币,卖出的数量为:[现有持仓市值(10万元)- 三月份目标市值(6万元)]/三月份币值(5000元)= 8个。所以我们需要卖出8个比特币,收入4万元(币价5000元);卖出比特币后,持仓总比特币数量为12个。 计算下来,这3个月的盈利如下: 最终的净资产 = 三月份目标市值(6万元)+ 卖币所得的现金(4万元) 期初的净资产 = 0 投入的现金 = 2万元(一月份)+ 3万元(二月份) 盈利 = 最终的净资产 – 最初的净资产– 投入的现金 = 5 万元 从上面的计算可以看出,定投策略无意中做到了低吸高抛,获得了不菲的收益(3个月100%的回报)。 二、实盘代码分析 在前面文章 小白零基础搭建一个比特币策略实盘引擎 中,我已经讲述了一个实盘引擎应该具备的各项功能,以及公开了实盘引擎的源代码。在这次的分享中,我将基于实盘引擎代码,开发出适配于该实盘引擎的比特币价值定投策略源码。 1. 策略初始化函数 initialize 设定执行频率(frequency),标的物(火币比特币:huobi_cny_btc)和基准(火币比特币:huobi_cny_btc) 设定其他策略所需的参数(比如每个投资周期需要增加的持仓市值,当前的投资周期以及初始持仓市值等)放入context.user_data中 2. 计算每一个frequency需要买入/卖出的金额(正为买入,负为卖出) 3. 实现每一个固定数据更新频率下的回调函数:handle_data 4. 修改接口函数liveStrategyEngine/main.py 5. 执行结果展示 我们看到,策略确实在定期买入比特币,实现了持仓市值的线性递增。 三、后话 比特币市场是一个非常无效的市场,在这样的市场中,很多被用烂了的传统策略竟然也可以跑得非常有效果,这对于传统量化从业者来讲,是一个非常好的知识变现机会。 Source by: WeQuant-Jason