之前好几次布林都开空开在地板上,后来群里讲了二次确认突破的思路,就尝试到布林上。类似通道类的都可以加上二次突破,才当做突破生效,可以当做布林策略的补充策略。
( 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['close'].shift(1) > df['upper'].shift(1) # 之前K线的收盘价 <= 上轨
. x/ o) D1 I0 g+ q# { condition3 = df['close'].shift(2) <= df['upper'].shift(2) # 之前K线的收盘价 <= 上轨7 Z7 l: a* w7 E* Q% W1 w; N2 a. l7 L
df.loc[condition1 & condition2 & condition3, 'signal_long'] = 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['close'] < df['median'] # 当前K线的收盘价 < 中轨4 D4 A) W# d7 A0 s) C
condition2 = df['close'].shift(1) >= df['median'].shift(1) # 之前K线的收盘价 >= 中轨0 v3 X, {/ g8 m4 F/ D
df.loc[condition1 & condition2, 'signal_long'] = 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['close'] < df['lower'] # 当前K线的收盘价 < 下轨
( h* y' f! c$ R% I condition2 = df['close'].shift(1) < df['lower'].shift(1) # 之前K线的收盘价 >= 下轨: R* n4 U' ?! O' s( u: \$ Z
condition3 = df['close'].shift(2) >= df['lower'].shift(2) # 之前K线的收盘价 >= 下轨
3 r5 d* P& e q9 @( i, s6 v df.loc[condition1 & condition2 & condition3, 'signal_short'] = -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['close'] > df['median'] # 当前K线的收盘价 > 中轨0 S5 Y/ ^$ J/ ^" @- B! A
condition2 = df['close'].shift(1) <= df['median'].shift(1) # 之前K线的收盘价 <= 中轨* |2 g! o& R6 h
df.loc[condition1 & condition2, 'signal_short'] = 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['signal'] = df[['signal_long', 'signal_short']].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['signal'].notnull()][['signal']]' D4 Z3 }( A: F# |0 Z
temp = temp[temp['signal'] != temp['signal'].shift(1)]
. n C; d, M: O1 d df['signal'] = temp['signal']( r) X# e# T/ j3 K
. Y) @: m/ }' M' ^. x8 hreturn df |