简单arbitrage
在本教程中,我们将构建一个简单的arbitrage策略。我们假设您已经下载并设置了 Algo,按照 QuickStart 设置所有环境变量。
配置
在下面的配置中,我们设置了以下内容:
- 我们正在做现货掉期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 中,我们还可以绘制每日利润图,我们得到以下图表: