usdt本位busd本位资金费率套利研究二 :实盘代码【python数字货币量化_策略第38篇_21精华帖】

[复制链接]
查看8585 | 回复0 | 2023-8-7 09:07:15 | 显示全部楼层 |阅读模式
一、引言. n, {7 J1 B6 j, w1 u+ \2 w: n# |

' D3 r0 r! ~0 v; w(1)、希望对其他同学有帮助,顺便希望能有个小葫芦,集齐7个娃
: C6 e+ p; J( g! o! X(2)、担心自己程序有考虑不周到的地方。比如爆仓风险啥的,毕竟个人的经验认知有限。也希望同学有好的想法能交流者发帖共享出来一起改进 (这是主要的,嘻嘻,有同学优化,改进,或者马力强的能分析历史找出比较优的方案)。一起致富,此贴抛砖引玉。* ?' @6 Q8 N  |0 v& W( o
(3)、下图是我大概半个月的收益( 做空usdt,做多busd,利用杠杠,赚两个品种的费率差 ),因为我资金没全开满,也是每天观察,一点点加的,中间也调仓开开平平,持了好几个币,所以平均持仓大概用了一万二,三左右金额。策略比较粗糙,只是一个大概的开单跟查询框架。
* X! ?% e% I3 M8 W4 z7 M效果图
6 }5 t; s7 m. A% W* ~$ c1 W# Q7 s2 ^  z! B# a' [
usdt本位busd本位资金费率套利研究二 :实盘代码【python数字货币量化_策略第38篇_21精华帖】-1.jpg
  c, v8 P3 R9 u7 p  T+ ~) d二、程序设置
, K0 B/ t; H. [0 }4 p/ \
1 e0 h6 X$ N$ R9 k! H% ^+ }. o6 L! U账户先设置成单边模式,和联合保证金模式 ( 联合保证金可以参考上一篇帖子设置 )
$ _  X1 B& [$ @) a(1)、在【utils】文件夹下的【Config.py】里设置账号和钉钉账号,这里钉钉账号我程序里是有两个,大家也可以都填一样的,因为我有专门个钉钉监控所有策略的异常
+ |1 U; B0 [# O) r" h
4 }1 r. D" E5 d5 c5 c" b/ f5 c8 q
: i7 J3 n" {. w  F2 v6 a+ J  k8 b(2)、在【实盘下单】文件夹里的【config.py】配置策略相关参数,【实盘下单】里的所有py程序参数都在这一个文件里配置,参数 "set_lever"是要自己查询两个本位的允许最大杠杠,比如BTCUSDT最大刚刚是50倍,BTCBUSD杠杆是20倍,那就填20,后面程序运行会自动设置
0 Y( P. Y2 v( _* h3 ?8 S; c& y: S* H
usdt本位busd本位资金费率套利研究二 :实盘代码【python数字货币量化_策略第38篇_21精华帖】-3.jpg . V  z/ i8 g& t) c: j; q
(3) 、【1_实盘下单.py】这里一开始会显示相关的数据,觉得ok了,在最下方输入yes,才会开始开单,程序有一个地方要注意,右上角有显示这个品种最大的持仓价值,我这里没做处理,目前是假设跑BTCUSDT,BTCBUSD,假设BTCUSDT开单了,接着开BTCUSD超过了允许值开不出来,然后程序会结束,这时候需要手动在把BTCUSDT多开的部分平掉。. H+ }2 V0 z3 \& U

8 R  ?" T1 t- `+ }$ {8 s. i$ `  t" y" G# _+ J& C( d( ]+ W
(4)、【3_实盘监控.py】开单后主要就是开着这个程序,循环监控,这里功能,每到 00:00、8:00、16:00 会显示相关信息,并且如果ADL到达你设置的报警级别,或者仓位不平衡会隔10秒提示,并且仓位不平衡的时候,也会把多出来的一边多出来的部分给平了,目前是这样处理的。okex船队的方法是平掉百分20再开,我担心行情极端的时候会出现平开,又ADL又平开的情况,干脆直接平掉多出来的部分,这里我是一次性平掉的,等到行情稳定了再手动执行程序补。而且具我观察币安的这些合约ALD满级了也很少触发平仓,如果主动平仓再开,多几次成本就高了,个人想法。) e& S8 {8 ?; m& T. B" W! b
9 ~! X9 l& L; v
usdt本位busd本位资金费率套利研究二 :实盘代码【python数字货币量化_策略第38篇_21精华帖】-5.jpg ; E7 |1 |5 [; G# @
! V% E% N- c$ b# `: a# h
usdt本位busd本位资金费率套利研究二 :实盘代码【python数字货币量化_策略第38篇_21精华帖】-6.jpg
& {+ v8 ?& \7 V/ k# d' y1 `5 Z3 c
  {: H/ I, v( D+ e# R9 M, j
; L# A" }, e1 p  S1 m4 R(5)还有两个小程序【5_保证金查询.py】,【6_收益查询.py】查看账户情况,用于策略的参考2 d. U2 N5 s" Z4 _. Y* n6 q
三、主要代码1 b2 \) x  c2 v1 W) M* s! [$ d
& v2 D$ l& Z) _
下单代码
/ M+ P. V7 I8 h! L! iimport utils.Config as Cf+ q% {3 w$ C1 V
import utils.gateway.binance_http as ins
; O4 m6 V1 U# p" S* yimport time
. f3 M  Q' q0 k  Nimport program.usd_busd永续套利.实盘下单.config as cf0 t' _$ e& o7 L" h* d5 `8 [
import math
0 t9 r( S! `- Q" m- a/ y% o# ===== 初始化6 G* b; D7 }1 m# \  g/ ]: E
# 创建币安api
; c/ h3 s6 `; M' x, Waccount = Cf.account[cf.username]
  M7 N% A9 R! M  B1 rins = ins.BinanceHttp(key = account['key_0'] ,secret=account['secret_0'] )
0 G9 P! x7 G/ A( _  B) @/ e* S
2 o" [4 A7 x3 [! V8 a: w8 B# 参数设置2 G8 ~. ]# e$ \: y5 U6 @" a+ Y" A8 h
coin = cf.coin
9 M4 z" N4 L" Cmoney = cf.money # usdt% M5 U# _2 V5 w: ?: N$ c/ ^) ?
set_lever = cf.set_lever # 设置杠杆* @2 @0 Q/ P: m: w
symbol_1 = cf.symbol_1 # 做空
; B' W. ?6 A4 y1 ]$ S- C; Psymbol_2 = cf.symbol_2 # 做多
9 b) ]- c, v- q7 ]% Pexecute_amount = cf.execute_amount # 每次建仓usdt的数量。如果是btc的话,得是100的整数倍。其他币种得是10的整数倍。每次数量不要太多,太多会造成价格波动。建议数量在1000-3000之
1 Q- Q0 _7 A8 u- m0 ^max_execute_num = math.floor(money*set_lever/execute_amount/2)  # 最大建仓次数,需要向下取整这里要改。建仓这些次数之后程序就会停止。
+ ^% n1 S4 c/ X3 s& Z- r  A, B5 F8 p8 f8 m$ C2 \  S
print("开仓次数 : {}".format(max_execute_num))% e# V# E9 A! P
print("设置最大杠杆 : ")6 x! F" h, k  Q, M! B
print(ins.u_set_leverage(symbol_1,set_lever))
6 G+ T% |9 _! T% B" S7 \0 oprint(ins.u_set_leverage(symbol_2,set_lever))
) [6 L' L! v! H  X. tprint()
$ o3 j  f$ ~) U: \5 {' L" o: G8 W4 ]+ I! K3 b8 K; r, _
print("最新资金费率 : ")
6 i0 W1 b  z2 E# N9 q! aprint(symbol_1 + ": "+ins.u_premiumIndex(symbol_1)["lastFundingRate"])
" x' h, ^8 m2 b  b% ^/ oprint(symbol_2 + ": "+ins.u_premiumIndex(symbol_2)["lastFundingRate"])
3 r% B% L; U, y' E7 G0 A( `print(), j$ d/ N9 s. a
1 s' f4 D  e) r  O1 C! F3 X+ q: v
print("合约信息 : 品种 ,价格精度,下单量精度,最小下单u")
9 Q% O& _3 i  U% l" f  f5 r( usymbol_exchange_info = [[i['symbol'],' _" o4 F, N' f& {
                         int(i['filters'][0]['tickSize'][::-1].split("1")[1].find('.')) + 1,
& F: I' G; \6 e& K. K- v4 z                         int(i["filters"][2]["minQty"][::-1].split("1")[1].find('.')) + 1,4 ^' y( U/ T$ C2 H$ c8 A( |
                         i["filters"][5]["notional"]]
9 K7 G2 v: V9 Q' f8 C: j, x                        for i in ins.u_exchange_info()["symbols"] if i['symbol'] in [symbol_1,symbol_2]]
. w+ d3 A/ @  j" z/ \8 ?, H- `% H* ^print(symbol_exchange_info,'\n')# 价格下单精度,价格最小下单量精度,最小下单金额
$ Q1 x+ Q/ a! `7 S8 [print()
) o) T' b6 F0 w2 z. D8 j* p4 T! r1 l- |; M  l5 K* {" h, r( x
swap_buy_price_1 = float(ins.u_depth(symbol_1, limit=5)['bids'][0][0]) # 做空+ E6 ]- e8 |" |
swap_sell_price_1 = float(ins.u_depth(symbol_2, limit=5)['asks'][0][0]) # 做多
" ]( n! Y. _- e3 X# Iprint("{} bids {} , {} asks {} , 价差 {}".format(symbol_1,swap_buy_price_1,symbol_2,swap_sell_price_1,round(swap_buy_price_1/swap_sell_price_1-1,5)))& e% l4 a" m8 t* d: Y

% u# T/ _9 L% @4 ]% z8 _3 B9 qprint(): A! r+ T" B" D. n+ f, @4 g2 x
run = input("注意控制风险,是否继续 y/x :")% R( {+ B# O6 s; K. |

9 Z4 Q) T& e* [# n# \* Q  qif run.lower() == "x":
) l) {  Y* f% r  b" g    print('*' * 20, '程序退出', '*' * 20, '\n')
  e1 R9 h+ ^: i4 o; N% K  @# o    exit()
% `4 _( U# t9 [' T7 Z: z8 i; ~: p1 B/ Y0 ?% v( C7 I7 y
elif run.lower() == "y":
' @2 c( \4 T  L" j' N5 @) v9 W    print('*' * 20, '【开始运行】', '*' * 20, '\n')
2 ]  I+ ?- V( \1 Y& X
% Y0 m- v1 h% h" Z    execute_num = 0
# v) R6 j) |& ^$ I; a    while True:- Y' a+ `5 T, k; E
% r2 `- K' a5 W5 a, r

9 R6 T) a* |+ z% J# y& D        execute_num+=16 [* R( i( a2 ^/ m+ E- {: A
        print("*"*50,"【执行{}次】".format(execute_num),"*"*50)+ K& \* h) y9 V# R5 o
) z% O2 {, W' ?
        swap_buy_price_1 = float(ins.u_depth(symbol_1, limit=5)['bids'][0][0]), V* ]) Q4 L/ p/ V) ~
        swap_sell_price_1 = float(ins.u_depth(symbol_2, limit=5)['asks'][0][0])
/ j0 f5 P  s+ H        buy_price_1 = round(swap_buy_price_1*0.98,symbol_exchange_info[0][1])0 l3 y1 ^7 F1 i6 ?: s
        sell_price_1 = round(swap_sell_price_1*1.02,symbol_exchange_info[1][1])
5 Y4 e: I0 A: i  Z7 S
, P$ h, X, D+ t3 V        if buy_price_1 > sell_price_1:
2 T0 L2 O' v2 S3 y% v2 r8 j% j; W            lot = round(execute_amount/buy_price_1,symbol_exchange_info[0][2]): E: a5 X# [- k" P6 D8 _
        else:
. T* v% v( q& O/ z9 s) W7 t            lot = round(execute_amount/sell_price_1,symbol_exchange_info[1][2])1 h$ Q5 m8 r' l

! \( _; n/ p- r5 z! a. b* l        r = swap_buy_price_1 / swap_sell_price_1 - 1
4 g, q+ U8 [. m        print( "{} 买一价 {} ,做空 {} , 下单量 {}".format(symbol_1,swap_buy_price_1,buy_price_1,lot))
2 y$ H1 y$ W- ^6 j' m3 t- u# v4 X  @        print( "{} 卖一价 {} ,做多 {} , 下单量 {}".format(symbol_2,swap_sell_price_1,sell_price_1,lot))
' e7 N8 V& y0 ]# V" \) V+ Z% @6 x6 L' D. W$ w6 ?7 ?2 g" T! I$ Y
        print("开始下单 : ")) j7 \/ u' O9 d2 ~. ~; V3 _. G% l
        symbol_1_order_info = ins.u_order_send(symbol_1,"SELL","LIMIT",quantity = lot ,price = buy_price_1,timeIn_force="GTC")
2 n) }; I2 }" ?/ s. H: q/ K* b        symbol_2_order_info = ins.u_order_send(symbol_2, "BUY", "LIMIT", quantity=lot, price=sell_price_1,timeIn_force="GTC")
% y8 N9 q5 U0 o        print(symbol_1_order_info)
' f. A& h2 V( a4 S: W        print(symbol_2_order_info)
6 H# f" p, C2 e2 O7 Y! q" Z
6 `  R) F( _% f1 r1 T  E8 N8 B% w        if ("code" in symbol_1_order_info) | ("code" in symbol_2_order_info):% q: Z8 I/ G, d  `
            print("下单出错停止")0 g4 \1 D% {3 x  ~3 w  @
            break" v" S+ @$ ^3 e# ]2 i8 _
6 S# D# e+ x3 Q, O. y0 M
        time.sleep(5)# [  x  D1 ~$ P* o. f' h
        print()
9 f$ n' M  |; B: ]  Q  s/ `% L7 H% {$ @& P' \5 l. Z
        if execute_num >= max_execute_num:
8 {& t9 o& C1 U8 F3 \3 H) y            print('达到最大下单次数,完成建仓计划,退出程序')# [; {  E" k" g1 i/ v# Q0 u- Y
            Break监控代码+ ?$ k3 \3 D* W, r+ K5 r
print("\n"+text)9 Y4 m: q1 f. D2 F- M" m0 ~1 f
        text = " 警报! adl风险 : " + "\n" + str(adl) + "\n"' j* y- O* q7 t4 g9 H2 @& ~# l9 j
        dingtalk_alert.send_dingding_msg(alert_text + text)
' J) l( K# H/ J/ F; U5 C+ E2 E  |; i! {2 m5 p) b
    # 2.检测手数是否平衡,异常报警,平掉多余手数$ Y0 g, ^+ x1 z/ r; \, s$ P
    check_pos = check.pos()
& }1 w( h" E8 w' y7 d& ]# V% l    df_pos = check_pos[0]   # 原始仓位7 D, D' S/ h" T0 j$ ?+ B) r# a
    coin_pos = check_pos[1] # 多空抵消后的币的仓位
  M- u! C3 G+ X6 A  {8 l& k, `' O+ x6 w3 _8 u9 H% H
    coin_pos = coin_pos[coin_pos['open_pos'] != 0]
; }6 [. ?. t1 \% x# l    if len(coin_pos) > 0:, n0 B$ o4 H7 [& Q' p* x3 R" D
3 T+ b: o. }5 X6 _2 `5 r) c
        symbol_order_info = check.close_pos(coin_pos)
3 i" O4 j# {& z( N, h" F) _4 A! ?+ N8 C7 n# q& q+ r( A3 @. H) Q
        text = " 警报!仓位异常 : "+"\n"+str(coin_pos.to_markdown())+"\n"+"平仓信息 : " +"\n"+str(symbol_order_info); \5 ^( q  A3 }! y0 ?/ N. J& ]
        print(text)7 U6 m0 p: ]  X
        text = " 警报!仓位异常 : "+"\n"+str(coin_pos)+"\n"+"平仓信息 : " +"\n\n"+str(symbol_order_info)
9 d) p$ a( g1 I9 q) a1 ~        dingtalk_alert.send_dingding_msg(alert_text + text + str(symbol_order_info))9 E' ^4 i1 W* b1 E  k

7 ~8 D% @: W, y1 @    # 3.账户风险,检测资金流水,本期到期资金费率
0 d6 }9 ^8 p- K; V4 \. K    now_time = pd.to_datetime(now_time)
2 x6 l; s; K, O0 _2 W    account_risk = check.account_risk()
+ A+ A) K' I' o) F" `    maint_margin = account_risk[0]
+ W8 }2 V8 m, a) E    margin_balance = account_risk[1]
; H& {: z2 f1 {( @% Q& d    risk_rate = round(float(account_risk[2] * 100),2)+ P' X- ]/ I" H
, O9 m/ I" a- C1 d  I
    if risk_rate > set_risk_rate:
' ]% c2 e8 B! h7 H        text = " 警报!账户风险率 : {}%".format(risk_rate)
8 d# w% m. f' T1 X( l! E        print(text)4 h, q. W4 G+ m
        dingtalk_alert.send_dingding_msg(alert_text +text)
, W# T% ]- k# e* O$ r. \& t! I: r( s1 u$ v
    # 资金费率发生后一分钟显示数据4 m* T, P7 X( ?; H3 i9 K
    if now_time.hour % 8 == 0 and now_time.minute == 1:
) h7 d, T9 r1 n5 t+ l
! c) T# }0 J, z4 o( X2 P* f# `+ L        text = "\n"+"【账户风险】 :"+"\n"+\6 t( T/ }  e/ ?" o9 ~- g/ u0 m
               "维持保证金 : {}USD".format(round(maint_margin,2))+"\n"+\' J0 C  Y9 R$ B
               "账户权益 : {}USD".format(round(margin_balance,2))+"\n"+\
4 l+ ~4 a. G! y               "账户风险率 : {}%".format(risk_rate)+"\n"+" "+"\n"+\
( T2 Z& g  l' x6 _( o6 S+ H0 q               "【资金费率差】 :" +"\n"+str(check.last_funding_rate())+"\n"+" "+"\n"+\
5 r; a( K/ @( a+ ]: J: g+ h               "【币种收益】 : "+"\n"+str(check.income()) + '\n'+" "
; Q* L3 r0 _0 f3 ?+ F0 m8 a& ^2 W: i7 K* J3 h- F- }4 H) c
        dingtalk.send_dingding_msg(text)
% N4 \2 W- a* Z8 j$ j4 x6 _        print(text)  H0 D+ |  Q! t+ q
+ K# g) }4 U+ w! u0 q" H1 b. k
        # 休眠60秒这样就只会报警一次了/ P/ Y, q% B2 t6 t
        time.sleep(60)
+ g# {( N: K* y1 Q. G7 k, m- T# o' q
    print()
# v3 W. O0 l+ ~- D: z! G    time.sleep(sleeptime)
2 r) r4 i( ~# ?( i
* j5 R0 n% e9 h* L6 u! F3 D
7 |5 F* I; ^5 lif __name__ == '__main__':
* d0 r# v3 Z- x3 C6 Z% {$ H. M4 e: e  f3 S
. u5 g9 ~4 B/ P) ^% N5 Y6 {
    while True:
3 S+ Q, f0 T* D5 g
' w% x- p: N! T0 C+ m) A        try:4 ~1 e! {3 Z# Y) d/ ]$ l
            main(ins,dingtalk_alert,dingtalk,alert_text)5 o, U8 q  f& w. j5 o
        except Exception as e:
; A$ O3 ?6 q( a( [/ }% m            print("程序报错")
% C/ S* f9 C1 w            dingtalk_alert.send_dingding_msg(alert_text + "程序报错 :" + str(e))* J# a: j2 b. c$ C$ B) y0 q5 N
            time.sleep(10)7 X+ a) D8 Q$ h4 V/ B  c
三、其他
) Y0 L3 l# l- R, j. W8 a% O% M. R0 y- u( a3 j
我这里没写平仓,大家开单反过来写下就行了,另外跑的时间很短,这几天大部分币资金费率差开始变成负的了( 策略是否要加入自动平仓功能,比如平均多少天的资金费率转负了平仓,转正了再开?),亏了两天,具体策略的情况还需要长期观察。另外usdt之前暴雷过,如果再次发生暴雷,或者busd/usdt价格偏离很大,会发生爆仓。3 J7 m: `7 L2 r5 G6 [; ]
先这样吧,觉得有帮助的话多多点赞4 k; @/ Z8 B: U; H$ l+ b
代码附件:
* ~( ]3 a+ x  j( m: x* |7 M5 K" V) d2 _- d  e

$ Q4 ~0 v6 t0 U7 w- k7 S usdt本位busd本位资金费率套利研究二 :实盘代码【python数字货币量化_策略第38篇_21精华帖】-8.jpg
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

265

金钱

0

收听

0

听众
性别
保密

新手上路

金钱
265 元