之前好几次布林都开空开在地板上,后来群里讲了二次确认突破的思路,就尝试到布林上。类似通道类的都可以加上二次突破,才当做突破生效,可以当做布林策略的补充策略。
( Q! I( J9 w6 c; I. o2 O# }signal代码
9 l, E0 P9 \+ C! |( P+ W; ?) Vdef signal_bolling_with_confirm(df, para):
& U# d) S+ E6 Y- R n = int(para[0]). S% F! Y1 `8 z# a2 W
df['median'] = df['close'].rolling(n).mean()+ ? ^2 J3 s6 k1 s; G% N, L9 x. a* k
df['std'] = df['close'].rolling(n).std(ddof=0)8 B$ q2 R! {& q: [
df['z_score'] = abs(df['close'] - df['median']) / df['std']
( l% h/ a7 Z/ X1 Y& N df['max'] = df['z_score'].rolling(n).max().shift(1)2 g6 M" |5 F2 e# ^" ?, p
df['upper'] = df['median'] + df['max'] * df['std']9 I% B; {. j3 P1 r; I. M: g
df['lower'] = df['median'] - df['max'] * df['std']8 O4 Z2 \, w0 U
3 s" A; t: V# n0 ^
# ===计算信号
" C2 p) [0 v- Z7 I # 找出做多信号! R6 S( S- i3 w
condition1 = df['close'] > df['upper'] # 当前K线的收盘价 > 上轨
3 N F, c- C" { m condition2 = df['close'].shift(1) > df['upper'].shift(1) # 之前K线的收盘价 <= 上轨/ G; Z3 e$ L9 s- z2 g y, X' j) y
condition3 = df['close'].shift(2) <= df['upper'].shift(2) # 之前K线的收盘价 <= 上轨
1 o9 k8 A9 _) G! {$ @% d9 _3 z3 H df.loc[condition1 & condition2 & condition3, 'signal_long'] = 1 # 将产生做多信号的那根K线的signal设置为1,1代表做多
; r( u: H' M3 v; z/ L
8 M9 I- \ B% ~ b: ] # 找出做多平仓信号
9 X% R _3 i# j# h condition1 = df['close'] < df['median'] # 当前K线的收盘价 < 中轨6 T5 m. L8 m& X
condition2 = df['close'].shift(1) >= df['median'].shift(1) # 之前K线的收盘价 >= 中轨
, y) W. E6 I- s! O* U df.loc[condition1 & condition2, 'signal_long'] = 0 # 将产生平仓信号当天的signal设置为0,0代表平仓
6 |; m+ K; E# J! {/ e4 \8 f5 p9 C5 a, r* V
# 找出做空信号
$ z# W9 G1 i$ P! s condition1 = df['close'] < df['lower'] # 当前K线的收盘价 < 下轨
# h) W4 o" ~! w4 v' V condition2 = df['close'].shift(1) < df['lower'].shift(1) # 之前K线的收盘价 >= 下轨
* O- u8 j% c9 K& o0 G* _ condition3 = df['close'].shift(2) >= df['lower'].shift(2) # 之前K线的收盘价 >= 下轨$ S4 z' i1 v: z+ t8 j
df.loc[condition1 & condition2 & condition3, 'signal_short'] = -1 # 将产生做空信号的那根K线的signal设置为-1,-1代表做空5 ~( Z: w) q8 v8 T# M: i
1 V' ?. ]: v# B5 b% @; s
# 找出做空平仓信号! ]8 q$ U2 C5 ]4 ?- Q
condition1 = df['close'] > df['median'] # 当前K线的收盘价 > 中轨8 u1 E5 R: U9 g9 f
condition2 = df['close'].shift(1) <= df['median'].shift(1) # 之前K线的收盘价 <= 中轨
+ K8 i" G# t$ j" L df.loc[condition1 & condition2, 'signal_short'] = 0 # 将产生平仓信号当天的signal设置为0,0代表平仓
0 U! D2 W5 L) s3 u6 A5 L9 y& L7 S
# 合并做多做空信号,去除重复信号5 G: }5 a5 O% s0 \- `2 S. `
df['signal'] = df[['signal_long', 'signal_short']].sum(axis=1, min_count=1,% {% S3 I3 }" c, b9 j/ V! ?
skipna=True) # 若你的pandas版本是最新的,请使用本行代码代替上面一行2 W" q/ Z0 W/ Q ^
temp = df[df['signal'].notnull()][['signal']]
4 r' \, J- t- B h! e temp = temp[temp['signal'] != temp['signal'].shift(1)]1 D% `. Z9 O$ B, \$ z; I+ I
df['signal'] = temp['signal']/ \$ h% n$ w8 R9 J, b, f5 C# q
1 \3 A2 }- D2 X; `% ~* Xreturn df |