跳转至

简单arbitrage

在本教程中,我们将构建一个简单的arbitrage策略。我们假设您已经下载并设置了 Algo,按照 QuickStart 设置所有环境变量。

配置

在下面的配置中,我们设置了以下内容:

  1. 我们正在做现货掉期arbitrage。 2.我们的交易对是BTCUSDT。 3.我们的交易所是OKEX。

arbitrage.json

{
    "instance": {
        "log_path": "/data/cc/logs",
        "name": "arbitrage",
        "license_id":"TRAIL001",
        "license_key":"apifiny123456"
    },
    "sim": {
        "ioc_only": false,
        "use_tbbo": true,
        "delay_o2a_us": 0,
        "delay_a2m_us": 0
    },
    "fees": {
        "OKEX_SWAP": {
            "make": 0.0002,
            "take": 0.0004
        },
        "OKEX": {
            "make": 0.0000,
            "take": 0.0006
        }
    },
    "players": [
        ["BTCUSDT.OKEX_Player", ["TardisPlayer", {"port": ["BTCUSDT", "OKEX"], "path": "/data/cc/tardis_data"}]], 
        ["BTCUSDTSWAP.OKEXSWAP_Player", ["TardisPlayer", {"port": ["BTCUSDTSWAP", "OKEX_SWAP"], "path": "/data/cc/tardis_data"}]]
    ],
    "risk_formulas": [
        ["Standard_Risk", ["RiskFormula", {"components": [[["BTCUSDT", "OKEX"], 1.0], [["BTCUSDTSWAP", "OKEX_SWAP"], 1.0]]}]]
    ],
    "accounts": [
        [10001, ["Account", {"risk_formulas": ["Standard_Risk"], "id": 10001}]]
    ],
    "symbols": [
        {"port": ["BTCUSDT", "OKEX"], "cid": 10001}, 
        {"port": ["BTCUSDTSWAP", "OKEX_SWAP"], "cid": 10002}
    ],
    "pricing_models": [
        ["BTCUSDT.OKEX_askpx", ["AskPx", {"port": ["BTCUSDT", "OKEX"]}]], 
        ["BTCUSDT.OKEX_bidpx", ["BidPx", {"port": ["BTCUSDT", "OKEX"]}]],
        ["dummy", ["AskPx", {"port": ["BTCUSDTSWAP", "OKEX_SWAP"], "comment": "This is just to notify on book change"}]]
    ],
    "samplers": [
    ],
    "variables": [
        ["VAR_A_askpx", ["PriceVar", {"pm": "BTCUSDT.OKEX_askpx"}]], 
        ["VAR_A_bidpx", ["PriceVar", {"pm": "BTCUSDT.OKEX_bidpx"}]],
        ["ask_rid_price", ["LevelPriceQty", {"sizeCap": 10000, "side": false, "ref_pm": "dummy", "port": ["BTCUSDTSWAP", "OKEX_SWAP"]}]],
        ["bid_rid_price", ["LevelPriceQty", {"sizeCap": 10000, "side": true, "ref_pm": "dummy", "port": ["BTCUSDTSWAP", "OKEX_SWAP"]}]],
        ["bid_spread", ["Sub", {"v1": "VAR_A_bidpx", "v2": "bid_rid_price"}]],
        ["ask_spread", ["Sub", {"v1": "VAR_A_askpx", "v2": "ask_rid_price"}]],
        ["ask_total", ["Add", {"v1": "VAR_A_askpx", "v2": "ask_rid_price"}]],
        ["bid_total", ["Add", {"v1": "VAR_A_bidpx", "v2": "bid_rid_price"}]],
        ["bid_fee_neg", ["Scale", { "coef": 0.0004, "variable": "bid_total"}]],
        ["bid_fee", ["Neg", {"variable": "bid_fee_neg"}]],
        ["ask_fee", ["Scale", {"coef": 0.0004, "variable": "ask_total"}]],
        ["bid_signal", ["GreaterThan", {"v1": "bid_fee", "v2": "bid_spread"}]],
        ["ask_signal", ["GreaterThan", {"v1": "ask_spread", "v2": "ask_fee"}]]
    ],
    "models": [
        ["dummy", ["LinearModel", {"variable": "bid_spread", "comment": "This is just a pass-through as well"}]]
    ],
    "strategies": [
        ["Maker", ["ArbSimple1", {"symbol": "BTCUSDT", "trade_market": "OKEX", "use_margin": true, "pos_expanding_cooloff": 1000, "cooloff": 1000, "account": 10001, "use_separate_logs": true, "model": "dummy", "ask_signal": "ask_signal", "bid_signal": "bid_signal", "order_notional": 4000, "max_notional": 40000, "max_risk": 8000, "start_time": "00:30:00", "end_time": "23:59:59"}]],
        ["Hedger", ["ArbSimple2", {"symbol": "BTCUSDTSWAP", "trade_market": "OKEX_SWAP", "pos_expanding_cooloff": 1000, "cooloff": 1000, "use_margin": true, "account": 10001, "use_separate_logs": true, "model": "dummy", "ioc_notional": 4000, "max_notional": 45000, "bid_rid_price": "bid_rid_price", "ask_rid_price":"ask_rid_price", "start_time": "00:30:00", "end_time": "23:59:59"}]]
    ]
}

如果你想做这个策略你自己,改变的变量如下:

1.所有以"/data/cc"开头的路径都应该更新到你机器上的相应路径 2.如果你想模拟延迟,改变"sim"- >"delay_o2a_us"和"sim"->"delay_a2m_us";时间以微秒为单位。 3. 如果要更改交易对,请将所有"端口"键分别更改为新品种和交易所。此外,在"策略"中,同时更改"符号"和"贸易市场"变量。 4. 如果要更改阈值,请更改"bid_fee_neg"->"coef"和"ask_fee"->"coef"。这应该是您在双腿上的平均费用,加上利润。 5. 在 "ask_rid_price" 和 "bid_rid_price" 中,sizeCap 是策略在发送挂单之前必须能够对冲的名义金额。可以将其设置为接近 ioc_notional 以获得更高风险但更有利可图的策略,或者更高以更有信心地对冲所有风险。 6. 在"strategies"中: 1. max_notional 是所有资产的最大总名义值。这应该设置得很高,因为根据arbitrage的性质,可以在没有相关风险的情况下累积大量名义。 2. ioc_notional 和 order_notional 是每笔个人交易的两条腿的名义上限。建议将这些设置远高于对冲边的最小订单规模。 3. max_risk 是基于 Standard_Risk 公式允许的最大风险。这应该设置为 order_notional 的小倍数,等于允许同时进行的未对冲交易的数量。与 max_notional 不同,对冲步骤将其减少到接近于零。

模拟

现在我们有了策略,我们想根据过去的市场数据对其进行测试。为此,我们首先需要将脚本目录添加到我们的 PATH:

export PATH=${ALGO_HOME}/scripts:$PATH

然后,我们可以运行

gen_dates.py -sd 20220101 -ed 20220319 | parallel -j 10 ccc_sim_trader arbitrage.json

模拟 1 月 1 日至 3 月 19 日过去数据的策略。

现在,我们可以used

sim_ana.py -p /data/cc/logs -sd 20220101 -ed 20220319

来生成有关模拟的统计信息,如果这样做,我们会得到以下结果:

这表明至少在模拟中,我们的策略是有利可图的。这里,pnlUSD 是费用前的利润,netUSD 是费用后的利润。无论哪种方式,我们都可以获利。

由于我们将所有交易都存储在 /data/cc/logs 中,我们还可以绘制每日利润图,我们得到以下图表: