【python数字货币量化_21精华帖_策略第5篇】二次确认突破的布林策略

[复制链接]
查看9445 | 回复0 | 2023-8-1 08:52:19 | 显示全部楼层 |阅读模式
之前好几次布林都开空开在地板上,后来群里讲了二次确认突破的思路,就尝试到布林上。类似通道类的都可以加上二次突破,才当做突破生效,可以当做布林策略的补充策略。
( b8 D/ _) a4 M! O) r; Vsignal代码
* R! T9 z% X/ A. l: ]( }def signal_bolling_with_confirm(df, para):  J) r2 b  K8 O+ w" a+ l
    n = int(para[0])( _( q/ R4 k; X
    df['median'] = df['close'].rolling(n).mean()
' Y# y- t# {* l0 d; I    df['std'] = df['close'].rolling(n).std(ddof=0)
/ V) y) n4 u2 X. I    df['z_score'] = abs(df['close'] - df['median']) / df['std']
+ T" Q- c8 n9 h4 v" \* J    df['max'] = df['z_score'].rolling(n).max().shift(1)* |6 g: m1 l  M6 c5 z- K9 ^7 B2 i
    df['upper'] = df['median'] + df['max'] * df['std']
: C, S+ M! s* E, d5 q+ m    df['lower'] = df['median'] - df['max'] * df['std']
; x5 d6 A( s( ], H7 g
1 d5 @% Y: G& s2 }    # ===计算信号- D  d8 z. Y/ J1 s6 w
    # 找出做多信号
+ R% W; y, M; n; O) \% @    condition1 = df['close'] > df['upper']  # 当前K线的收盘价 > 上轨
* ?' `4 j, h2 T' k    condition2 = df[&#39;close&#39;].shift(1) > df[&#39;upper&#39;].shift(1)  # 之前K线的收盘价 <= 上轨
. x/ o) D1 I0 g+ q# {    condition3 = df[&#39;close&#39;].shift(2) <= df[&#39;upper&#39;].shift(2)  # 之前K线的收盘价 <= 上轨7 Z7 l: a* w7 E* Q% W1 w; N2 a. l7 L
    df.loc[condition1 & condition2 & condition3, &#39;signal_long&#39;] = 1  # 将产生做多信号的那根K线的signal设置为1,1代表做多
. F" ?* l6 C* [& z! C& D
6 P3 G: [8 K2 G; e) b/ Z: E: B    # 找出做多平仓信号
. g2 q% j) _& V, I0 D    condition1 = df[&#39;close&#39;] < df[&#39;median&#39;]  # 当前K线的收盘价 < 中轨4 D4 A) W# d7 A0 s) C
    condition2 = df[&#39;close&#39;].shift(1) >= df[&#39;median&#39;].shift(1)  # 之前K线的收盘价 >= 中轨0 v3 X, {/ g8 m4 F/ D
    df.loc[condition1 & condition2, &#39;signal_long&#39;] = 0  # 将产生平仓信号当天的signal设置为0,0代表平仓
+ x& `1 w7 R# ]- F( \
0 E1 t! y+ j  L9 M9 s1 e5 L    # 找出做空信号5 d3 ~# {* ~2 L# F& {4 Q9 i
    condition1 = df[&#39;close&#39;] < df[&#39;lower&#39;]  # 当前K线的收盘价 < 下轨
( h* y' f! c$ R% I    condition2 = df[&#39;close&#39;].shift(1) < df[&#39;lower&#39;].shift(1)  # 之前K线的收盘价 >= 下轨: R* n4 U' ?! O' s( u: \$ Z
    condition3 = df[&#39;close&#39;].shift(2) >= df[&#39;lower&#39;].shift(2)  # 之前K线的收盘价 >= 下轨
3 r5 d* P& e  q9 @( i, s6 v    df.loc[condition1 & condition2 & condition3, &#39;signal_short&#39;] = -1  # 将产生做空信号的那根K线的signal设置为-1,-1代表做空
; o4 z7 C1 n! b) G' _
. F$ m( v# a" @6 _  ~0 m  C    # 找出做空平仓信号
* ?8 n# `) Y! u* m5 j7 c. ~    condition1 = df[&#39;close&#39;] > df[&#39;median&#39;]  # 当前K线的收盘价 > 中轨0 S5 Y/ ^$ J/ ^" @- B! A
    condition2 = df[&#39;close&#39;].shift(1) <= df[&#39;median&#39;].shift(1)  # 之前K线的收盘价 <= 中轨* |2 g! o& R6 h
    df.loc[condition1 & condition2, &#39;signal_short&#39;] = 0  # 将产生平仓信号当天的signal设置为0,0代表平仓
. P  i9 u* ^0 O
( k0 V- h! S/ }( {! X) j  R. k    # 合并做多做空信号,去除重复信号2 h) w1 z9 U6 z; x5 B% C4 A8 U9 L( A2 I
    df[&#39;signal&#39;] = df[[&#39;signal_long&#39;, &#39;signal_short&#39;]].sum(axis=1, min_count=1,
  A4 b& N) G7 O/ J2 ~+ W                                                           skipna=True)  # 若你的pandas版本是最新的,请使用本行代码代替上面一行; K. i) y! a% b, y
    temp = df[df[&#39;signal&#39;].notnull()][[&#39;signal&#39;]]' D4 Z3 }( A: F# |0 Z
    temp = temp[temp[&#39;signal&#39;] != temp[&#39;signal&#39;].shift(1)]
. n  C; d, M: O1 d    df[&#39;signal&#39;] = temp[&#39;signal&#39;]( r) X# e# T/ j3 K

. Y) @: m/ }' M' ^. x8 hreturn df
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

236

金钱

0

收听

0

听众
性别

新手上路

金钱
236 元