揭开加密货币算法交易的秘密
在加密货币行业通过算法进行交易是个值得探索的领域。在本篇文章中,我们探讨了加密货币业中交易算法的设计和实现。我们重点关注执行算法、做市算法和市场微结构需要考虑的几个因素。
执行算法
执行算法的目标,是将投资组合的某种状态转换为另一种状态,同时最大限度地降低其中的成本。比方说,如果你希望将 BTC/USD 的敞口提高 1000 倍,你大概不会将这笔交易订单猛的砸到 BitMEX 的订单里,因为这会导致价格大幅下滑。相反,你可以考虑在一段时间里通过多个不同交易所的市价和限价订单的组合,来慢慢地达到你想要的头寸。
一个执行算法通常有三层:宏交易员、微交易员和智能路由。
宏交易员 这一层将大额元订单 [元订单: 即大额交易订单,并分成小块逐步执行] 或父订单 [父订单: 即一大块订单,执行交易时,会将其切分为较小批次(称为子订单)] 拆分为跨越一段时间的较小子订单。这实际上是整个算法的调度部分。VWAP、TWAP 和 POV是宏交易员算法的常见简单例子。
TWAP: 即时间加权平均价格,它指在特定时间内的平均价格;
POV: 即成交量百分比,这种交易算法用于执行大订单的交易量,而不会对市场价格产生过多的影响。
通常,要设计一个复杂的宏交易员层,有许多不同的市场影响模型可供使用。市场影响模型,着眼于市场是如何对一次执行发生反应的。一次执行后市场是否保持原状?还是偏离更远?或是它能实现某种程度的恢复?两个最具开创性的市场模型是 Almgren-Chriss (1999, 2000)永久市场影响模型 和 Obizhaeva-Wang (2013)暂时市场影响模型 。因为在实践中市场影响并不是永久性的,所以,Obizhaeva-Wang 模型似乎更符合现实。此模型提出之后,人们构建了许多新模型来解决其不足之处。
交易执行后市场影响的衰退
微交易员 层为每个子订单做决策,比如到底是通过市价订单还是通过限价订单来执行,如果是限价订单,具体应该定什么价格。关于微交易员的设计的文献要少得多。这是因为,子订单的大小通常是整个市场的很小一部分,因此如何执行并不重要。
然而,加密领域却非常不同,因为流动性非常薄,在实践中即便普通规模的子订单,价格下滑幅度也是相当显著的。微交易员的设计,通常关注订单到达在时间和深度上的分布、队列位置以及市场微观结构的其他特征。
市价订单(和交叉 [交叉: 指当经纪人以相同价格收到同一股票的买卖订单,然后以该价格在两个独立的客户之间进行同时交易 ] 限价单,如果我们忽略延迟)保证会执行,而未决限价订单 [未决限价订单: 即还未成交的限价订单(买入限价 < 最低报价,卖出限价 > 最高出价)] 则没有这样的保证。如果无法保证执行,你可能会跟不上宏交易员设置的时间安排。
智能路由 层,则决定在不同的交易所 / 交易地之间如何选择路径。例如,在某一给定的价格水平下,如果 Kraken 拥有 60% 的流动性,GDAX (Coinbase Pro/Prime)拥有 40% 的流动性,那么,微交易员决定的所有市价订单,都应该是以 60-40 的比例分配到 Kraken-GDAX。
你也许会对此提出不同观点:市场中的套利者和做市商会将流动性从一个交易所转移到另一个交易所。所以,如果你在 Kraken 执行一半的订单,然后等待几秒钟,流动性会在套利者和统计套利者的作用下从 GDAX 转移到 Kraken,如此一来,你就可以用类似的价格完成剩余的订单。
然而,即使在这种情况下,套利者也会为了自己的利润而向你收取额外费用,并转嫁自己的对冲费用比如 Kraken 的做市费。还有一点,某些市场参与者会跨平台地发布超过自己实际想要规模的订单,并且一旦目标达成,就会抢先取消超额的订单。
归根结底,最好还是拥有属于自己的原生智能路由。和第三方智能路由服务相比,原生智能路由还具有缩短延迟的优势。依靠原生智能路由,你可以直接路由到交易所,而在前一种情况下,你需要先向第三方服务发送消息,然后他们才会将你的订单路由到交易所(而且你还得向第三方服务支付路由费)。总之,三角形的任意两边之和大于第三边。
做市算法
做市是指为市场中的其他参与者提供即时流动性并获得补偿。你承担库存风险以换取正向的预期价值。最终,做市商因为两个原因获得补偿。
首先,市价接受方(market taker)有很高的时间偏好并希望马上成交。而为流动性提供便利的做市商则因他们较低的时间偏好和耐心而获得补偿。其次,做市商的 PnL (利润和损失)特性是左倾的,通常大多数人都是右倾偏好的。换句话说,做市商类似于竞猜市场、赌场、保险公司和国营彩票的赌注经纪人。他们经常小赢,且不常大输。因为采取了这种不受欢迎的回报策略,做市商获得了可预期的价值的补偿。
偏态
拔高来说,限价单其实是写给其他市场参与者的免费期权。市场其他参与者有权利但没有义务以限价单给定的价格买入或卖出一笔资产。在一个信息完全的市场中,没有人会出售免费期权。只是因为,市场的总体并不具有完全信息,所以出售免费期权才有意义。
另一方面,如果市场完全不知晓信息,那么,即便只有极小的价差,一个风险中立的做市商也愿意出售这些免费限价单的期权,因为这时所有交易都是噪音 [噪音: 指由程序交易、股息支付或其他不反映整体市场情绪的现象引起的股票市场活动 ] 。显然,真实市场有各种参与者,每个参与者都具有各自的知情水平。
在设计一个做市算法时,需要考虑三个视角:做市商的、市场接受方的和其他做市商的。
做市商自己的视角,以他们的库存清单来表达。如果你已经有太多的资产敞口,那么你可能会往低的方向倾斜 / 偏斜你的报价。如果资产敞口太小,你会有相反倾向。这样做你有两个不同的理由。首先,作为一家公司,你有一定程度的风险厌恶(可能比个人的少,但你的金钱效用曲线仍然是凹的)。这种效用函数的形状有许多结构(例如 CARA、CRRA、更一般的 HARA 等)。其次,作为市场上的被动的流动性提供者,你将面临逆向选择风险。积极的流动性接受者可能会知道你不知道的东西,或者只是比你更聪明。从根本上说,这是向市场出售免费期权的人都要面临的问题。
此外,即使在机械层面,击中你的买价的市价单,会将按市值计价(mark-to-market)的价格降低,而满足你的卖价的市价单则会将按市值计价的价格抬高。在任何交易的确切时刻,你总是站在错误的一边。除此以外,做市商的报价会产生被动的市场影响。换句话说,将一笔订单提交到订单簿这一行为本身,就会有一点点作用把市场推离你。
风险厌恶个体的效用函数
市价接受方的观点,则表现在订单流上。成交量加权的订单到达频率,作为一种从订单簿顶部算起的深度函数,应该具有几个关键属性。
该函数应该是
- 递减;
- 凸(这里用直觉很难解释,但经验层面上确实是这种情况);
- 随着深度变为无穷,函数趋近于 0。
此外,还有一个让人烧脑的问题是,「合理的中间价」到底是什么。
稍微补充几句,所谓最佳买价和最佳卖价之间等距的中价,很容易受到噪音的影响,当垃圾订单被提交又被取消时就会发生这种情况。此外,如果两个案例具有相同的订单簿形态,那么最新发布的最佳买价,意味着会有一个低于最新发布的最佳卖价的合理价格。还有另一个问题,即发布记录的历史是否重要,如果重要,那我们到底应该从时钟时间还是交易量时间的角度来观察它?基于订单流的特征,做市商的最优限价单的位置到底设在哪里?如果你挨着订单簿顶部提交紧密的报价,那么你会频繁成交,但每次都赚得很少。如果你提交深度报价,你的成交不会那么频繁,但每次你都会赚更多。这实际上是一个具有唯一全局最大值的凸面优化问题。
另一个需要考虑的问题,是订单流的跨时间到达,看起来有点儿像泊松过程。有人认为它更接近霍克斯过程。而且,做市商试图捕获的买价卖价波动(bid-ask bounce),是均值回归的最短期版本。由于这种超短期的均值回归是通过局部波动来缩放的,因此做市商应该在量大时扩大报价范围,而在交易量小时缩紧报价范围。
订单到达强度随着深度的变化
霍克斯过程
其他做市商的视角则由订单簿代表。订单簿揭示了其他做市商的一些私密信息。订单簿顶部附近,如果卖单多于买单,则表明其他做市商更愿意出售而不是购买资产。这有两种可能,一是这些做市商的库存中已经有巨大的正向不平衡,二是他们认为价格在短期内更有可能下降而不是上涨。
不管哪种情况,作为做市商的你,都可以根据订单簿的扭曲来调整报价。而且,当做市商互相竞争时,如果最小报价单位 [最小报价单位:即两个连续价格之间的最小差距] 很小,你就会经常看到所谓的「抢价差交易」(penny jumping) [ 抢价差交易:一种被严格禁止的交易。指在做市商交易制度下,证券公司、做市商在手中持有客户交易委托的情况下抢先为自己的账户进行交易]行为。
做市商通过互相抢价或在订单簿上爬楼梯来争夺成交优先权,直到抵达投降点 [投降点:投降意味着放弃,这个术语表示投资者决定放弃试图重新获得因股价下跌而导致的损失收益的时间点],最终获得成交优先权的胜者只有一位。
在确定胜者之后,亚军通常会撤回到比下一个最佳买价或卖价差一个报价单位的位置。如果你没获得成交优先权,你还可以获得第二成交优先权,并且只需支付刚刚够的费用。这将导致一个回归,即冠军退回到亚军前面的最近报价单位,爬楼梯游戏重新开始。你可以在真实的加密市场数据中看到这种爬楼梯游戏。
买单侧的爬楼梯游戏
最后,长时段的方向性的信号可以覆盖在做市算法上,这样的话,做市算法的目标就不再是保持订单库存的持平或恒定,而是考虑一些长期目标以及相应的偏差来促其实现。
速度
速度很重要,原因有两点。首先,你可以在订单取消之前击中订单簿中的订单。其次,你可以在订单被击中之前取消订单簿中的订单。换句话说,你想要点射陈旧订单,也希望自己的订单别被他人点射。套利算法(主动)和执行算法(主动)更看重前者,而做市算法(被动)更看重后者。
通常,从速度获益最多的策略也是最基本的策略。任何复杂的逻辑都必然减慢往返的时间。这些类型的算法策略是交易世界的 F1 赛车。为了速度,数据验证、安全检查、仪表监测、编排等都可以被剥掉。跳过 OMS、EMS 和 PMS (资产组合管理系统),直接将你 GPU 上的计算逻辑连接到同一地点交易所的二进制 API 上。这是一个快速而危险的游戏。
另一类速度敏感策略,即相对统计套利策略,要求服务器设置在多个交易所之间的物理位置,而不是与某一个交易所位于同一地点。虽然它们不能最快获得任何单个交易所的数据,但它们将在任何其他策略之前获得数据,并可在相关性和协整数据的基础上采取行动。
世界上最大的各家证券交易所之间最佳交易节点位置
在速度游戏中,获胜者拿走绝大多数所得。在最简单的例子中,如果存在套利机会,谁先获得套利机会,谁就抢得利润。第二名会得到面包屑,第三名则一无所有。收益很可能是幂律分布的。
速度游戏也是一场打到底线的竞争(race to the bottom)。一旦所有人都从光纤升级到微波或是激光网络,每个人都会回到同一起跑线,任何此前的优势都会被磨平。
最小报价单位、填单优先权和队列位置
大多数匹配引擎遵循价格-时间的优先级(按比例匹配是一种不太常见的替代方案,但我们先不考虑这些)。价位更好的限价单比价位更差的限价单成交得早。如果多个限价单的价格相同,那么早提交的订单将比晚提交的订单更早成交。
币安将订单簿切分至最小 8 位小数。如果某个资产代码的价格为 .000001,则 .00000001 的报价就是这一价格的 1% 。如果某资产的价格为 .0001,则 .00000001 的报价则是这一价格的 0.01%,即 1 个基点 (1 bps[ bps (basis points):即 0.01%,用于描述金融工具价值或利率变化百分比的计量单位])。两者差异巨大。在前一种情况下,跑到一个大订单前面需要花费整整一个点,因此时间优先更重要,而在后一种情况下,资金成本要便宜 100 倍,因此价格优先更重要。
换句话说,如果你必须支付整整 1% 来获得成交优先权,那它可能并不值得,因为你支付了相对来说过高的费用,同时只是相对较小地增加了成交的可能性。这种情况下,也许排队等候更好。但如果你只需要支付 0.01% 就能获得成交优先权,那你最好这样做,因为你只是耗费了一点点成本,却相对较大地增加了成交的概率。较小的成交单位,有利于价格优先策略,而较大的成交单位则有利于时间优先策略。
这自然引出了下一个问题:你的队列位置值多少钱?
成交概率,作为队列位置的一个函数
订单簿增量
在订单簿的某一价格水平,量的消减只有两种方式:要么是 交叉盘交易(trade crossed) ,要么是未决限价单被取消。如果是交叉盘交易,那么比此价格更好的所有其他价格水平,也会是交叉盘交易,量也会降低。我们可以在行情表上把开启和取消的订单一笔一笔的排列出来,并将每一个缩减记为一笔交易或一次取消。直观地讲,一笔交易意味着双方同意以某一特定价格进行买卖,而一次取消则意味着,某一方决定不再以某特定价格买卖某资产。因此,从表面上看,我们可以说,如果某一笔最佳买价的订单被取消,而不是被成交,那就是一个强烈的信号,表明市场将在短期内向下。
另一方面,在订单簿的某一价格水平,只有一种方式可以增加量:即一笔未决限价单被提交了。
订单簿中的量增和量减都揭示了市场参与者的私密信息,从而提供了短期的价格信号。
更好的价格指数和最优交易所费用
目前,大多数价格指数都是从多个交易所获取交易数据并将它们汇总在一起以获得成交量加权的平均价格。 Tradeblock 指数 尤其特别,它会对不活跃和价格与同侪有偏差的交易所的权重加以处罚。而我们还能做什么呢?
在 GDAX 上,做市手续费为 0 bps,而市价接受方手续费为 30 个基点(即万分之 30),如果一笔公布交易 [发布价格: 指当交易出现在自动收报机上或以其他方式公开记录时的价格 ] 的价格为 $4000/BTC、且是卖价侧被命中,则意味着卖家以 $4000/BTC 的价格卖出,而买家则以 $4012/BTC 价格买入。这笔交易的「合理价格」应该接近 $4006/BTC,而不是实际的发布价格。
如果换到 Bittrex 交易所,由于有 25 基点的费用同时适用于做市商和接受方,因此合理价格就是发布价格。换句话说,一笔 $4000/BTC 的发布成交,实际上是买家以 $4010/BTC 的价格购买,而卖家以 $3990/BTC 的价格卖出,两者平均就得到此单的价格。
因此,从价格发现 [价格发现: 指买卖双方在给定的时间和地方对一种商品的质量和数量达成交易价格的过程 ] 的角度来看,各交易所的行情表格不具有直接可比性,所以在构建价格指数时,应该刨去费用并标准化。
当然,这里还存在另一种复杂性,来自基于交易量的费用阶梯,这可能会增加或减少做市商-接受方费用的不对称性,因为费用是阶梯型跳跃的,所以我们无法确定,买家买入以及卖家售出的准确价格。这也暗示了两个有趣的推论。
首先,价格发现是有限的,并且有点精神分裂[精神分裂:此处类比「公平价格」在这两极之间迅速震荡的状态],尤其是碰到那些在做市商-接受方费用方面极不对称的交易所。
假设 GDAX 的大多数账户都处于 0/30 bps 的做市商-接受方费用等级,并且我们留意到 GDAX 在其 BTCUSD 的订单簿上常有 1 分钱的价差,那么,每一笔在买价侧发布的交易,其合理价格大概会低于此价格 15 bps,而每一笔在卖价侧发布的交易,其合理价格大概会高于此价格 15 bps。因此,在平静时期,「合理价格」就会在这两点之间快速震荡,两者之间不会有颗粒度更细的价格发现。
GDAX 订单簿
其次,与生产者和消费者之间的税收关联一样,做市商和接受方在费用分担方面也存在类似的关联。
如果你向做市商收取相对较多的费用,他们会拉大订单簿的间隙,并将一些费用转嫁给接受方。如果你向接受方收取相对较多的费用,那么做市商就会将订单簿的间隙压紧,并吸收掉接受方的一些费用。
极端案例是,如果你过度取悦做市商,那么订单簿的价差就会缩小到最小报价单位(就像我们经常在 GDAX 上看到的那样),订单簿也就无法进一步缩紧了。再往前一步,任何额外的费用都会以收入损失的形式落到交易所身上。通过这个极端案例,我们可以看到,费用落在哪一方的头上并不重要,重要的是做市商和接受方费用的总和。
最终,就和税收政策中的拉弗曲线一样,交易所也面临收费政策的收入优化问题。我们可以看到,极端情况与税收政策的情形相同。如果交易所不收取任何费用,他们就不会有收入。如果交易所收取 100% 的费用,就不会有交易,所以他们也没有收入。如果增加另一些理论,很明显,交易所的收入与总费用水平的坐标图是一个具有唯一最大值的凸函数。
拉弗曲线
专有数据
每个 OTC (场外交易)机构都有其交易对手地址的半唯一标记的图形数据,以及这些地址和已知的交易所地址之间的货币流。这些被标记的数据为许多机器学习算法提供了一个良好的起点。
比特币交易图
每个矿工都有关于挖币(工作量证明类型的加密币)的边际成本的专有数据。如果他们能感知在挖矿效率方面自己在全球矿工界的位置,他们就能获得一份独特的洞察力,明了短期供应过度或短缺的态势。
黑箱
每个人都知道黑箱不好。人们很难,虽然不是不可能,辨别发生了什么,当出现某些故障时,极难诊断原因所在。
然而,许多最好的对冲基金和自营交易公司最终还是会制造出黑箱。有几个很好的理由可以解释这一点。
首先,公司中人来人往,那些文档记录不佳的遗留代码,新手接手后很难理解。其次,市场竞争意味着,任何某一个人就能完全理解的战略最终都会输给那些由专家和行家在其狭小领域中合作制定的战略。最后一点,合并的策略通常比单独运行的策略更好。例如,假设你有一个长期动量策略(S1)以及一个短期均值回归策略(S2)。当然,S1 可以从 S2 的短期执行优势中受益,S2 显然也可以受益于 S1 的长期趋势预测。所以很自然地,我们会把它们组合成一种合并策略,该策略比任何一个组成部分都更有效。最终,这个策略变成了黑箱,不是因为我们想要黑箱,而是不用考虑黑箱不受欢迎这种事。
马列维奇的《黑方块》
解开混淆因素
假设我们有一个模型,它用地面是否潮湿的二元指标来预测优步的出行率,而且这一模型运行效果非常好。显然,地面潮湿和优步打车无直接联系,但间接地,下雨会使地面潮湿,下雨也会让人们想要更多地使用优步。即便我们的伪模型表现良好,它也容易受到尾部风险的影响。如果有条水管在城市的某地爆裂导致地面潮湿,或是发生自然洪水,我们都会做出错误预测,认为优步在此地的乘车率会提高。
一般来说,当 A 意味着 B (A => B)而且 A 意味着 C (A => C)时,B => C 这个模型可能有效,但只是偶然情况。因此必须认识到,预测关系应符合直觉和常识。盲目挖掘数据并发现强预测信号,这是不够的。我们应该在信号汇成一个黑箱之前把其中的混淆因素剥离,因为一旦形成黑箱,这些因素将越来越难以解开。
举另外一个例子,假设 A => B 且 B => C。那么,A => C 这个模型将起作用,但级别低于 B => C 这个模型。首先,A => C 可能会让你利益受损,因为 A 可能不是导致(在格兰杰因果关系上) B 的唯一因素;也许 A' 也会导致 B。其次,如果 A => B 的关系不成立了,那么 A => C 模型也会崩溃,但 B => C 模型仍然有效。
特征选择
让我们转向多因素模型,理想情况下各特征应尽可能统计上不相干。举个例子,假设我们正在研究冰淇淋价格,将它设计为糖价和牛奶价格的一个函数。也许,更好的模型是使用糖价和季节(春季、夏季、秋季、冬季)。前一个模型里,各特征和通胀相关连,都是既属于「食品原料/投入」又属于「消费品」,而且都来自冰淇淋生产的供给侧,而后一个模型则不同,两个特征具备统计不相关性(一个来自供给侧,另一个来自需求侧)。当然,如果使用糖价、牛奶价格和季节这 3 个特征,可以产生一个更准确的模型。不过,随着模型维度的增加,调校时间如果不是指数级增长,至少也会超线性延长。当你有 20 个特征时,运行某些优化方法(如梯度下降)会变得非常棘手,因此特征选择是关键。我们应该放弃相互关连的特征,而选择那些更具统计不相干性的特征。
认识论
在设计量化模型时,实证主义和演绎推理都很有价值。
纯实证 方法 的一个缺陷是,我们无法在市场中进行受控实验。我们无法在某一时间点同时尝试两种不同的操作来查看哪个表现更好。换句话说,与硬科学不同,软/社会科学中没有真正的反事实。尤其在交易中,我们无法精确衡量我们自己的行为对市场的影响。换句话说,在历史的时间流中,当我们没有交易时,我们无法知道,如果我们做了交易,订单簿和订单流会如何变动;在历史的时间流里,当我们作了交易时,我们也无法知道,如果我们不做交易,订单簿和订单流会如何变化。
实证主义的另一个缺陷是,对于任何给定的历史模式,存在无限多的模型,每个模型将符合这一历史模式,但每个模型可以对未来做出一个完全不同的预测(比如黑天鹅问题的一个版本)。休谟、维特根斯坦、克里普克、奎因、波普尔和塔勒布都有许多关于逻辑实证主义和归纳问题的批判和辩护,以及对这些观点的进一步阐述。
纯演绎推理 的一个问题是,作为人类的我们容易出错。推理链条上的任何一个逻辑错误都会立即使结果无效。此外,结论的可靠性不仅要求沿途的每个逻辑步骤都是有效的,而且也要求我们假设的前提本身也是真的并符合现实。由于模型必须易于使用,因此它们通常是对世界的简化,并且其做出的预设不能和现实相违背。
我们来看一个例子。假设你希望针对一项资产的价格轨迹运行一次蒙特卡罗模拟。如果你获得了该资产回报的历史数据并从中直接取样来模拟路径,那么你会遇到以下问题:
- 在表示极端事件的尾部情形中,数据很稀疏;
- 你在数据中发现一些噪音、远离某些未知的真实回报的概率分布。现在,假设你将历史数据拟合到正态分布,然后从中为你的模拟路径采样。现在你遇到了一个问题,即事实上回报并不是正态分布的(如尖峰的、肥尾的)。或者干脆换一条路,你把历史回报拟合到柯西分布或列维分布,更常见地是拟合到列维阿尔法稳定分布。到这一点时,模型变得越来越复杂,而你又不小心在代码中写了一个 bug。经过几天的辛劳,你找出问题并解决了它。代码被推向生产,你拥有了一个工作模型……花了两年时间。2 年后,事实证明第 5 矩(moments,是对变量分布和形态特点的一组度量)才是关键,而你的列维阿尔法稳定分布并没有捕捉到现实的这一特征。基本上你参与的游戏就是这么一个过程。
最后,我通常使用两种启发式方法:1)当有疑问时,默认使用常识。2)如果其他方面都相同,简单和节制优于复杂和臃肿。
真实世界的摩擦
拥有一个理论上有利可图的算法是一回事,但处理现实的摩擦是另一回事。
假设你向交易所发送一个请求来发布订单,通常你会收到一个回复,确认订单已发布,或是发生错误,订单未被发布。假如有一天,你的发布请求没有收到任何回复。你会认为这个薛定谔订单是发布了还是失败了?你容易犯两种错误:类型 1 (假正 [假正:指测试结果呈正的反应,但是事实上却是负]),类型 2 (假负 [假负:指测试结果呈负的反应,但是事实上却是正]),都是把订单做了错误分类。一种错误类型会比另一种错误的损失更低吗?
假设你在两个不同的交易所之间运行套利策略。如果在两个交易所之间做一对交易时,其中一家的 API 出问题了,你会怎么做?其中一家的交易可能已通过,而另一家的交易可能已失败。现在你有了不想要的持仓敞口。处理这个问题的最佳方法是什么?
当交易所被 DDoS 攻击或匹配引擎在负载下受压时,你如何处理发布延迟和取消延迟?
当交易所对其 API 进行未证实、未公布的更改时,你该怎么办?
假设交易所确实对其客户的余额进行更新,而其执行交易的匹配引擎也在并行工作,这样的话,在同一毫秒或微秒为交易成功而查询出的余额,可能和向客户报告的余额相冲突态,看起来就像一笔交易执行了,但余额还没有发生改变。你该如何设计自己的系统,来与这个持续变化的世界状态同步,而不顾交易所报告的状态和你自己的发生冲突呢?
假设交易所的费用太高,你无法以模型推论的最优价格下达限价订单。或者更糟,你的某些竞争对手与交易所在费用方面进行了私下交易 [ 私下交易(sweetheart deal):指双方以非正式或非法方式私下达成的安排或协议。]。这会如何改变你的行为?
如果你的银行周末不上班而加密交易是 24/7 运行,你如何处理法币的再平衡 [ 再平衡:指重新调整资产组合权重的过程。]?
可以说,同一笔资产在不同交易所并不能完全等值可互换。首先,每个交易所的交易对手风险都不同,这意味着这笔资产应该刨掉不同的负利率。其次,由于大多数交易所都有存 / 取限制,因此当达到限额,就意味着在一段时间内你无法在交易所之间物理地重新平衡资产。
在你的会计系统中,你如何处理分叉、空投、粉尘攻击以及其他你无法控制和避免的情况?
以下是我们通常遵循的一些启发式方法:
- 任何可能出错的东西,一定会出错,甚至是你目前无法想到的东西,所以要把事情构建得失败时也失败得优雅。
- 你和你所连接的所有第三方(如交易所)都会犯错。
- 与面向消费者的技术不同,不要打碎事物后再快速迭代;如果你损失太多钱,你将没有第二次机会。
- 尽可能到处创建系统和做数据备份,并在操作流程中创建冗余以防人为错误
- 不要使用浮点类型,因为碰到价格非常低的资产类别(如 KINBTC)时,精度损失可能非常严重。
- 从 API 速率限制中保留足够的 API 调用,以准备突然取消所有未结订单。
交易是世界上唯一的直接目标是将资本转化为更多资本的工作之一。再加上加密业狂野西部的性质,你得到一个快速致富的污水池。每个人都想要简单的答案,但没有人想学习手艺。人们希望电视里的达人告诉他们价格目标、何时购买以及何时售出。他们希望以 99.99 美元的价格购买在线交易课程,或者以每月 19.99 美元的价格购买基于 TA 的算法策略。但实际上没有人会卖给你一个能印钱的魔盒;他们会为自己保留它。没有什么关于盈利和损失的神奇公式。市场不断发展,游戏随着时间的推移变得越来越难。
保持领先优势的唯一方法是聘请最优秀的人才,他们可以适应生态并不断超越自我。
市场是一个巨大的扑克牌桌,数百万玩家坐下来,每个人都相信他/她可以超越他/她的邻居。坐在这张桌子旁的人,其实已经是一种自我选择。获胜意味着你要比牌桌上一半多一点的资本玩得好,这反过来意味着,你需要比 90%的玩家更优秀,因为资本以幂律的方式汇总到赢家手里。
在文化上,交易游戏与风险投资不同。在硅谷,成为彼得·泰尔所谓的明确的乐观主义者是值得的。你需要相信新技术将改变世界,你能够并且将会制定实现这一目标的方法。
在遍布自营交易公司的芝加哥,文化差异很大。在芝加哥,成为一个有极高对抗性思维的人是值得的。每个人都像你一样如此渴望成为赢家,而且每次你进行交易时,你的脑海中都会出现那个唠叨的想法:也许对面的人知道你不知道的事情。
在面对市场中的任何真正竞争之前,硅谷的创业公司必须首先与世界的冷漠作斗争。而交易类公司则不同,尽管没有需要打交道的顾客,他们从一开始就无法避免竞争。最强的交易公司,把自己包裹在秘密之中。
加密货币交易是这两个世界的交汇点,在这个新生的领域目前还没有明确的赢家。
链闻获得本文作者授权翻译并发表该文章的中文版本。
撰文:Kevin Zhou,加密货币算法做市商,曾担任 Kraken 交易业务负责人
编译:Neo Ge
来源:链闻