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

[复制链接]
查看9419 | 回复0 | 2023-8-1 08:52:19 | 显示全部楼层 |阅读模式
之前好几次布林都开空开在地板上,后来群里讲了二次确认突破的思路,就尝试到布林上。类似通道类的都可以加上二次突破,才当做突破生效,可以当做布林策略的补充策略。' 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[&#39;close&#39;].shift(1) > df[&#39;upper&#39;].shift(1)  # 之前K线的收盘价 <= 上轨0 T8 e; x) S8 f2 E2 E7 e! U
    condition3 = df[&#39;close&#39;].shift(2) <= df[&#39;upper&#39;].shift(2)  # 之前K线的收盘价 <= 上轨
' ]% o; `- s' j7 @, c& F- M    df.loc[condition1 & condition2 & condition3, &#39;signal_long&#39;] = 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[&#39;close&#39;] < df[&#39;median&#39;]  # 当前K线的收盘价 < 中轨4 Y1 d( z$ q; }+ c
    condition2 = df[&#39;close&#39;].shift(1) >= df[&#39;median&#39;].shift(1)  # 之前K线的收盘价 >= 中轨
; `0 x& h: u/ T& l7 {& J9 }    df.loc[condition1 & condition2, &#39;signal_long&#39;] = 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[&#39;close&#39;] < df[&#39;lower&#39;]  # 当前K线的收盘价 < 下轨& @$ F9 W! Y; M- ?- h3 l
    condition2 = df[&#39;close&#39;].shift(1) < df[&#39;lower&#39;].shift(1)  # 之前K线的收盘价 >= 下轨
" X9 @# Q" @0 @' P$ E1 B2 O$ {. ^    condition3 = df[&#39;close&#39;].shift(2) >= df[&#39;lower&#39;].shift(2)  # 之前K线的收盘价 >= 下轨9 Y$ S( y: p& y  A. J
    df.loc[condition1 & condition2 & condition3, &#39;signal_short&#39;] = -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[&#39;close&#39;] > df[&#39;median&#39;]  # 当前K线的收盘价 > 中轨* _: T! C1 s* N4 ^
    condition2 = df[&#39;close&#39;].shift(1) <= df[&#39;median&#39;].shift(1)  # 之前K线的收盘价 <= 中轨9 f" {2 W, N" O( H3 @: Y
    df.loc[condition1 & condition2, &#39;signal_short&#39;] = 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[&#39;signal&#39;] = df[[&#39;signal_long&#39;, &#39;signal_short&#39;]].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[&#39;signal&#39;].notnull()][[&#39;signal&#39;]]. N4 b2 I  e( M: ^
    temp = temp[temp[&#39;signal&#39;] != temp[&#39;signal&#39;].shift(1)]5 R1 O0 Y. b: @' |* |. j4 Q" h
    df[&#39;signal&#39;] = temp[&#39;signal&#39;]9 Y1 Z0 }' A: a8 W
  I. q* ^" r# y6 {5 q+ O- M
return df
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

236

金钱

0

收听

0

听众
性别

新手上路

金钱
236 元