【python数字货币量化_21精华帖_策略第27篇】基于币安交易所的定投框架

[复制链接]
查看6377 | 回复0 | 2023-8-5 04:08:30 | 显示全部楼层 |阅读模式
市场转熊,到了中性跑的不理想,趋势也被来回割的阶段,没有特别好的赚钱方法,于是决定还是做好定投,布局下一波吧,之前有老板做过OKEX的定投框架,现在币安返佣很香,所以搞了一发币安的定投框架,完成了我自己的币安三件套中的最后一样,测了2周(目前实盘3天一投),暂时比较稳定。/ `% `/ c0 `3 Y; h
一、总体思路3 Q% V8 J$ P- p) `5 A
! r4 ]7 Z; k8 N2 W* g
分8个大的步骤,如下:
; I! V; X! y. m* m6 P5 v# ##################### 1、获取币安现货价格精度 #######################
( w& N  }1 _( x% U    usdt_future_exchange_info(exchange, symbol_config)​
  i7 }, }- o4 ]+ K0 v# ##################### 2、获取目标现货历史数据 #######################
& S' A( S' j. A8 z2 q# ]' V    # 遍历获取币种历史数据7 {% s% A4 J% j; S8 i- c3 F
    print('获取交易币种的历史K线数据')
- y% ~& S- W$ G4 T1 t6 m' X    # 获取币种的历史数据,会删除最新一行的数据
* u* w$ X% m& Z# f0 D' ~" ?9 [3 [    symbol_candle_data = get_binance_history_candle_data(exchange, symbol_config, time_interval, max_len)​
0 k( t! ^, D3 q4 n+ ^* x1 Z4 j+ _# ##################### 3、获取当前账户信息 #######################, k! B+ B( ]+ y  C+ ^1 c$ M
        # 更新账户信息symbol_info
5 a1 }$ s* x- f' b  B        symbol_info = update_symbol_info(exchange, symbol_info, symbol_config)​
$ A2 L& D5 l/ M$ x; `" t# ##################### 4、计算并等待到下一次交易时间 ######################## O$ Z5 k' m- C
        # =获取策略执行时间,并sleep至该时间
( b* X: S. l( `: U. G  ]4 X* i        run_time = sleep_until_run_time(execution_interval)​3 V+ e9 L; [. y) i- U: r4 Z1 i# n
# ##################### 5、获取目标币种最新数据 #######################: X. V1 R& M4 N
        # 获取数据  s9 H: T" ?) W# f7 e- ~
        recent_candle_data = single_threading_get_binance_candle_data(exchange, symbol_config, symbol_info, time_interval, run_time, candle_num)​
4 I" r0 F8 c1 w0 { # ##################### 6、根据定投规则计算交易信号及目标持仓量 #######################& s! \$ a1 l  n  {& H. r: d
        # =计算每个币种的交易信号$ Z0 e% n) e' J6 D
        symbol_info = calculate_trade_vol(symbol_info, symbol_config, symbol_candle_data)
9 ~! l2 L4 c8 }+ v        print('\n现货持仓与本次定投计划:\n', symbol_info)​
, t+ E& |4 L& M3 A3 F3 e" p# ##################### 7、下单,并更新订单信息到文档中 #######################
, U. z& |$ }2 d+ q' a, C' Q        # order_info = place_binance_batch_order(exchange, symbol_order_params)' @& W) S. `3 W
        symbol_order = single_threading_place_order(exchange, symbol_info, symbol_config)  # 单线程下单0 W" i; A4 k7 ]0 P  n+ Z' I
        print('下单记录:\n', symbol_order)6 g2 H5 Z# h/ n5 N8 a

' P0 e! j9 E( S& ]! i- s        # 更新订单信息,查看是否完全成交
- s; A- W: D$ v9 t; S) k& C# m        time.sleep(short_sleep_time)  # 休息一段时间再更新订单信息
5 I0 B! H# `/ ]* E( D  L% u        symbol_order = update_order_info(exchange, symbol_config, symbol_order)! Z; V6 q+ x9 a, r
        print('更新下单记录:', '\n', symbol_order)
) o4 [. a, c( _6 G4 d        to_csv_log(symbol_order, 'invest') # 记录订单信息到CSV文件中​6 S/ C6 w/ V0 s
# ##################### 8、更新交易后的账户信息 #######################$ Y3 }. Z' q2 R4 _5 @" D4 ~* O; n1 D
        # 重新更新账户信息symbol_info
* N3 y4 l+ ?4 c2 G+ P( Q4 q  ?        time.sleep(long_sleep_time)  # 休息一段时间再更新5 D6 O) U. M8 K4 U& j% f' P
        symbol_info = pd.DataFrame(index=symbol_config.keys(), columns=symbol_info_columns)
" S" y1 b0 P/ M        symbol_info = update_symbol_info(exchange, symbol_info, symbol_config)
! K$ G9 }/ v6 D  Z        print('\nsymbol_info:\n', symbol_info, '\n')5 d: z- ?# |! z4 r" c% D
二、细节描述
% a3 _. O6 S9 b: H& k, t2 ]# b/ G8 s) T- {6 q- V" M$ W/ ?
1 、获取币安价格精度时
% \! ?) c" q/ }! n$ e- m8 q7 d& c  e4 c- k1 Z4 ]
对public_get_exchangeinfo返回的信息做了分析,核心是filters的结构,典型的list中装dict:​
" N# k# x( h  K5 P'filters': [
6 i- z: G) }1 p0 X! S% [{'filterType': 'PRICE_FILTER', 'minPrice': '0.00000100', 'maxPrice': '922327.00000000', 'tickSize': '0.00000100'},* J' b5 [6 z- Q) K
{'filterType': 'PERCENT_PRICE', 'multiplierUp': '5', 'multiplierDown': '0.2', 'avgPriceMins': '5'},
' q0 k6 R. Y1 Y7 b( n% p{'filterType': 'LOT_SIZE', 'minQty': '0.00100000', 'maxQty': '100000.00000000', 'stepSize': '0.00100000'},
$ V$ |4 @3 Z0 _{'filterType': 'MIN_NOTIONAL', 'minNotional': '0.00010000', 'applyToMarket': True, 'avgPriceMins': '5'},- v+ j6 N8 }; ]4 p1 O# @5 k( u
{'filterType': 'ICEBERG_PARTS', 'limit': '10'},' _4 ?& e" z2 G3 n) E
{'filterType': 'MARKET_LOT_SIZE', 'minQty': '0.00000000', 'maxQty': '1525.57157489', 'stepSize': '0.00000000'},
% K* U4 Q. D8 G* {{'filterType': 'MAX_NUM_ORDERS', 'maxNumOrders': '200'},$ W% [1 }6 J, c( h  _6 b
{'filterType': 'MAX_NUM_ALGO_ORDERS', 'maxNumAlgoOrders': '5'}/ Z2 G/ k' }+ Y: `4 D
],经过分析,获取价格精度和下单量精度就是:
) s, G3 u' a& _. ^( F" ^2 j6 \: X* P# 获取u本为合约交易对的信息
+ V3 x& l5 P( ~, W    exchange_info = retry_wrapper(exchange.public_get_exchangeinfo, act_name='查看现货基本信息')
. @! p1 r+ R* t    # 转化为dataframe
! }8 c/ |2 F' G3 s/ c4 @) a    df = pd.DataFrame(exchange_info['symbols'])4 V! a# H  J8 c
    df['tickSize'] = df['filters'].apply(lambda x: x[0]['tickSize']) # 最小下单价精度4 D. [* ?& h; C# U7 j  o# H
df['stepSize'] = df['filters'].apply(lambda x: x[2]['stepSize']) # 最小下单量精度2 、录订单信息. W1 M7 u" d* v) d4 G: ^- l0 m" @$ a

" }* y; _/ W% B5 K币安接口中不包含某些信息,如只有委托价格,没有实际成交价格(也可能是我没找到合适的接口),因此需要我们自己根据成交量和成交总金额计算:
% f. n: l1 g( F( d# Q: B! d if order_info:1 y" k/ }: j# l5 L2 P4 l
                symbol_order.at[order_id, "订单状态"] = binance_order_state[order_info["status"]]
; K3 c( r+ ~$ U' h8 f* J# G8 M                if binance_order_state[order_info["status"]] == '失败':3 g  F" G: s6 n0 m
                    print('下单失败')) ~* |5 l6 Q3 n: i, e5 k" e7 Y
                symbol_order.at[order_id, "交易方向"] = order_info["side"]
4 Y% v" d* M! R; q! b1 X                symbol_order.at[order_id, "委托数量"] = order_info["origQty"]# ~  E( c! c6 y8 B" z
                symbol_order.at[order_id, "成交数量"] = order_info["executedQty"]; o+ s0 e7 M% A! w8 K
                symbol_order.at[order_id, "委托价格"] = order_info["price"]$ u& w% p. {& ^" u& g
                symbol_order.at[order_id, "成交总金额"] = order_info["cummulativeQuoteQty"]
5 _6 Z9 E  Y' n3 C, x5 \1 ^                symbol_order.at[order_id, "成交均价"] = float(order_info["cummulativeQuoteQty"]) / float(
& j# {% |9 \" ~$ d1 q4 a) g3 `                    order_info["executedQty"]) # 接口里没有,所以需要自己计算
" w0 \8 c/ m- s# G1 Q' o                symbol_order.at[order_id, "委托时间"] = pd.to_datetime(order_info["time"], unit='ms')
2 n, ?* q% f3 i: }: A9 M$ m+ ^# j            else:
, Z, o3 I2 J* r                print('根据订单号获取订单信息失败次数超过max_try_amount,发送钉钉')% z, Z/ |2 R; m: y2 ]+ T7 D
3 、定投策略; m- z: }- z, b, h

; D6 J" o( B& n+ p! f1 ^8 n2 h定投策略都包含在Signals文件中,里面策略具体含义可以参考大佬的帖子:目前我用的就是定投策略
( s& R- E) d9 m) ~% p++++++++++++++++++++++++++++++++++++6 _% T! z' C  ~* H+ `- E1 B
定投是熊市囤币,牛市收割的利器,一起跑起来," q; X: ^9 {: g2 k
) P  |  \% K! X
最后附上代码:
% ?/ j$ K( G1 q$ q( T) B' [+ F1 a4 n( V4 G: I, a
【python数字货币量化_21精华帖_策略第27篇】基于币安交易所的定投框架-1.jpg
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

274

金钱

0

收听

0

听众
性别
保密

新手上路

金钱
274 元