技术图文:数字资产量化中的三角套利策略

背景

我们在前面的图文中介绍了一种跨市场的套利策略:

该策略俗称搬砖,只要两个交易所对于同一种数字资产出现价差,就可以进行套利。

<u>三角套利就是在同一家交易所内利用三种数字资产之间的价格差来获利</u>。

三角套利的过程就是规划三角路径的过程,三角路径无外乎有两种:

  • 第一种:买入 -> 卖出 -> 卖出(BSS)
  • 第二种:卖出 -> 买入 -> 买入(SBB)

比如 BigOne 交易所有 ONE-USDT、ONE-EOS、EOS-USDT 交易对。

如果你手中拥有 USDT,可以通过第一种路径进行套利。即用 A 数量的 USDT 买入 ONE,然后把买入的 ONE 换成 EOS,最后卖出EOS 换回 USDT。在刨除手续费之后,如果最后换回的 USDT 数量超过 A,我们就可以依赖这个路径进行套利。

如果你手中拥有 ONE,可以通过第二种路径进行套利。即卖出 A 数量的 ONE 得到 USDT,然后用该 USDT 买入 EOS,最后用这些 EOS 换回 ONE。 在刨除手续费之后,如果最后换回的 ONE 数量超过 A,我们就可以依赖这个路径进行套利。

详细的流程图如下:

流程图

技术分析

<b>以先买入后卖出的方式构造三角套利的路径</b>:

价格表

假设:USDT 起始数量为 A,交易手续费为:0.1%

<u>Step1:USDT -> ONE</u>

以Q1的价格买入ONE。

  • OneAmount = A ÷ Q1
  • RealOneAmount = OneAmount × 0.999

<u>Step2:ONE -> EOS</u>

以 Q2 的价格卖出 ONE 得到 EOS

  • EOSAmount = RealOneAmount × Q2
  • RealEOSAmount = EosAmount × 0.999

<u>Step3:EOS -> USDT</u>

以 Q3 的价格卖出 EOS 得到 USDT

  • UsdtAmount = RealEOSAmount × Q3
  • RealUsdtAmount = UsdtAmount × 0.999

如果想获得盈利,则需要 RealUsdtAmount > A 即可。

经过简单的推导,我们可以发现该三角套利路径的盈利条件是:

(Q2 × Q3 × 0.999^3) ÷ Q1 > 1.0

<b>以先卖出后买入的方式构造三角套利的路径</b>:

价格表

假设:ONE 起始数量为 A,交易手续费为:0.1%

<u>Step1:ONE -> USDT</u>

以 P1 的价格卖出 ONE,获得 USDT。

  • UsdtAmount = A × P1
  • RealUsdtAmount = UsdtAmount × 0.999

<u>Step2:USDT -> EOS</u>

用 USDT 以 P2 的价格买入 EOS。

  • EosAmount = RealUsdtAmount ÷ P2
  • RealEosAmount = EosAmount × 0.999

<u>Step3:EOS -> ONE</u>

用 EOS 以 P3 的价格换回 ONE

  • OneAmount = RealEosAmount ÷ P3
  • RealOneAmount = OneAmount × 0.999

如果想获得盈利,则需要 RealOneAmount > A 即可。

经过简单的推导,我们可以发现该三角套利路径的盈利条件是:

(P1 × 0.999^3) ÷ (P2 × P3) > 1.0


代码实现

<b>检验是否具有套利机会</b>

static double TestBuySellSell(double q1, double q2, double q3)
{
    return q2 * q3 * Math.Pow(0.999, 3) / q1;
}

<b>运行先买入后卖出的套利模型</b>

static void RunBuySellSell(double q1, double q2, double q3, double a)
{
    double usdt = a;
    double oneAmount = 1.0*usdt/q1;
    double realOneAmount = oneAmount*0.999;

    double eosAmount = realOneAmount*q2;
    double realEosAmount = eosAmount*0.9999;

    double usdtAmount = realEosAmount*q3;
    double realUsdtAmount = usdtAmount*0.999;
    
    //用USDT换入ONE
    List<Order> orderOneUsdt = new List<Order>
    {
        new Order(q1, oneAmount),
    };
    _bigOneUtility.CreateBidOrders(orderOneUsdt, "ONE-USDT");
    
    //用ONE换入EOS
    List<Order> orderOneEos = new List<Order>
    {
        new Order(q2, realOneAmount),
    };
    
    //用EOS换入USDT
    _bigOneUtility.CreateAskOrders(orderOneEos, "ONE-EOS");
    List<Order> orderEosUsdt = new List<Order>
    {
        new Order(q3, realEosAmount),
    };
    _bigOneUtility.CreateAskOrders(orderEosUsdt, "EOS-USDT");
}

<b>检验是否具有获利机会</b>

static double TestSellBuyBuy(double p1,double p2,double p3)
{
    return p1*Math.Pow(0.999, 3)/(p2*p3);
}

<b>运行先卖出后买入的套利模型</b>

static void RunSellBuyBuy(double p1, double p2, double p3, double a)
{
    double one = a;
    double usdtAmount = one*p1;
    double realUsdtAmount = usdtAmount*0.999;

    double eosAmount = 1.0*realUsdtAmount/p2;
    double realEosAmount = eosAmount*0.999;

    double oneAmount = 1.0*realEosAmount/p3;
    double realOneAmount = oneAmount*0.999;

    //用One 换入USDT
    List<Order> orderOneUsdt = new List<Order>
    {
        new Order(p1, one),
    };
    _bigOneUtility.CreateAskOrders(orderOneUsdt, "ONE-USDT");

    //用USDT 换入Eos
    List<Order> orderUsdtEos = new List<Order>
    {
        new Order(p2, eosAmount),
    };
    _bigOneUtility.CreateBidOrders(orderUsdtEos, "EOS-USDT");

    //用Eos 换入One
    List<Order> orderEosOne = new List<Order>
    {
        new Order(p3, oneAmount),
    };
    _bigOneUtility.CreateBidOrders(orderEosOne, "ONE-EOS");
}

总结

到此为止,有关于三角套利的模型以及具体实现就介绍完了。

运行窗口

由于市场中做市商的存在,这样的套利机会虽然很多,但转瞬即逝。通过手工挂单的方式已经很难满足速度要求了。如果要用该种方式套利,需要写程序让计算机来执行。我上面的代码大家可以作为参考啊。今天就到这里吧!See You!


相关图文

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353

推荐阅读更多精彩内容