之前好几次布林都开空开在地板上,后来群里讲了二次确认突破的思路,就尝试到布林上。类似通道类的都可以加上二次突破,才当做突破生效,可以当做布林策略的补充策略。' m; C! S' V( m8 I7 ^
signal代码
" A9 Q' W" F- B+ q3 Jdef signal_bolling_with_confirm(df, para):
' g2 J+ ]( `+ L7 t$ T5 [9 Y4 Q n = int(para[0])
. o9 |/ b) K" Q: U9 e1 V/ b( \ df['median'] = df['close'].rolling(n).mean()
6 B6 J# c4 O) g" Y% ^- n' F' s df['std'] = df['close'].rolling(n).std(ddof=0)0 V) t1 y) |' s+ k4 b, {) ^5 f
df['z_score'] = abs(df['close'] - df['median']) / df['std']
: l4 V! p, Z% n4 x5 o' A6 w df['max'] = df['z_score'].rolling(n).max().shift(1)
5 T, v: J5 A* x# K/ x% p. u df['upper'] = df['median'] + df['max'] * df['std']
. D8 m1 E) Y6 M# v: D" S df['lower'] = df['median'] - df['max'] * df['std']6 `$ W! z2 D2 o3 D; F
9 J6 j7 P+ O1 K2 Z' ] # ===计算信号& X3 Z$ f$ k! c8 @! {
# 找出做多信号5 v: J$ g8 u( b8 V% g) b
condition1 = df['close'] > df['upper'] # 当前K线的收盘价 > 上轨& _! z8 N5 [* } f7 o
condition2 = df['close'].shift(1) > df['upper'].shift(1) # 之前K线的收盘价 <= 上轨0 T8 e; x) S8 f2 E2 E7 e! U
condition3 = df['close'].shift(2) <= df['upper'].shift(2) # 之前K线的收盘价 <= 上轨
' ]% o; `- s' j7 @, c& F- M df.loc[condition1 & condition2 & condition3, 'signal_long'] = 1 # 将产生做多信号的那根K线的signal设置为1,1代表做多
7 r0 p) p* Y! x+ k; i" H& M: e l3 [$ g& Z9 N
# 找出做多平仓信号
& l( x, q% P2 c# o/ N( D2 b9 W/ u1 X condition1 = df['close'] < df['median'] # 当前K线的收盘价 < 中轨4 Y1 d( z$ q; }+ c
condition2 = df['close'].shift(1) >= df['median'].shift(1) # 之前K线的收盘价 >= 中轨
; `0 x& h: u/ T& l7 {& J9 } df.loc[condition1 & condition2, 'signal_long'] = 0 # 将产生平仓信号当天的signal设置为0,0代表平仓/ A: T% d6 Z! Z% ?7 }+ R& r4 P7 A
- d+ h1 H6 K. l _' L# a
# 找出做空信号
+ A2 \5 M% d1 X7 w% _, E condition1 = df['close'] < df['lower'] # 当前K线的收盘价 < 下轨& @$ F9 W! Y; M- ?- h3 l
condition2 = df['close'].shift(1) < df['lower'].shift(1) # 之前K线的收盘价 >= 下轨
" X9 @# Q" @0 @' P$ E1 B2 O$ {. ^ condition3 = df['close'].shift(2) >= df['lower'].shift(2) # 之前K线的收盘价 >= 下轨9 Y$ S( y: p& y A. J
df.loc[condition1 & condition2 & condition3, 'signal_short'] = -1 # 将产生做空信号的那根K线的signal设置为-1,-1代表做空
% Z$ e4 d8 {+ l: g; e
) d/ A0 e9 _* G1 _2 z+ K5 U g # 找出做空平仓信号& W b" K, {( n3 S8 q6 E( S
condition1 = df['close'] > df['median'] # 当前K线的收盘价 > 中轨* _: T! C1 s* N4 ^
condition2 = df['close'].shift(1) <= df['median'].shift(1) # 之前K线的收盘价 <= 中轨9 f" {2 W, N" O( H3 @: Y
df.loc[condition1 & condition2, 'signal_short'] = 0 # 将产生平仓信号当天的signal设置为0,0代表平仓& \3 m* c( s; }( K# k o
! U4 h! I/ U# j3 I
# 合并做多做空信号,去除重复信号
4 O' c& Y6 ]: `) S; }5 b df['signal'] = df[['signal_long', 'signal_short']].sum(axis=1, min_count=1,
7 J8 N, ]4 Q" \( H8 q1 g1 m w: s skipna=True) # 若你的pandas版本是最新的,请使用本行代码代替上面一行! w4 M% ~$ ^' ~: ]
temp = df[df['signal'].notnull()][['signal']]. N4 b2 I e( M: ^
temp = temp[temp['signal'] != temp['signal'].shift(1)]5 R1 O0 Y. b: @' |* |. j4 Q" h
df['signal'] = temp['signal']9 Y1 Z0 }' A: a8 W
I. q* ^" r# y6 {5 q+ O- M
return df |