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

背景

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

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

三角套利就是利用三种数字资产之间的价格差来获利

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

  • 第一种:买入 -> 卖出 -> 卖出
  • 第二种:卖出 -> 买入 -> 买入

比如 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,我们就可以依赖这个路径进行套利。

详细的流程图如下:

流程图


技术分析

以先买入后卖出的方式构造三角套利的路径

价格表

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

Step1:USDT -> ONE

以Q1的价格买入ONE。

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

Step2:ONE -> EOS

以 Q2 的价格卖出 ONE 得到 EOS

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

Step3:EOS -> USDT

以 Q3 的价格卖出 EOS 得到 USDT

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

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

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

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

以先卖出后买入的方式构造三角套利的路径

价格表

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

Step1:ONE -> USDT

以 P1 的价格卖出 ONE。

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

Step2:USDT -> EOS

以 P2 的价格买入 EOS。

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

Step3:EOS -> ONE

以 P3 的价格买入 ONE

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

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

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

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


代码实现

检验是否具有套利机会

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

运行先买入后卖出的套利模型

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");
}

检验是否具有获利机会

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

运行先卖出后买入的套利模型

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!


相关图文

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青少年编程备考

感谢您的支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值