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

[复制链接]
查看9446 | 回复0 | 2023-8-1 08:52:19 | 显示全部楼层 |阅读模式
之前好几次布林都开空开在地板上,后来群里讲了二次确认突破的思路,就尝试到布林上。类似通道类的都可以加上二次突破,才当做突破生效,可以当做布林策略的补充策略。
( 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[&#39;close&#39;].shift(1) > df[&#39;upper&#39;].shift(1)  # 之前K线的收盘价 <= 上轨/ G; Z3 e$ L9 s- z2 g  y, X' j) y
    condition3 = df[&#39;close&#39;].shift(2) <= df[&#39;upper&#39;].shift(2)  # 之前K线的收盘价 <= 上轨
1 o9 k8 A9 _) G! {$ @% d9 _3 z3 H    df.loc[condition1 & condition2 & condition3, &#39;signal_long&#39;] = 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[&#39;close&#39;] < df[&#39;median&#39;]  # 当前K线的收盘价 < 中轨6 T5 m. L8 m& X
    condition2 = df[&#39;close&#39;].shift(1) >= df[&#39;median&#39;].shift(1)  # 之前K线的收盘价 >= 中轨
, y) W. E6 I- s! O* U    df.loc[condition1 & condition2, &#39;signal_long&#39;] = 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[&#39;close&#39;] < df[&#39;lower&#39;]  # 当前K线的收盘价 < 下轨
# h) W4 o" ~! w4 v' V    condition2 = df[&#39;close&#39;].shift(1) < df[&#39;lower&#39;].shift(1)  # 之前K线的收盘价 >= 下轨
* O- u8 j% c9 K& o0 G* _    condition3 = df[&#39;close&#39;].shift(2) >= df[&#39;lower&#39;].shift(2)  # 之前K线的收盘价 >= 下轨$ S4 z' i1 v: z+ t8 j
    df.loc[condition1 & condition2 & condition3, &#39;signal_short&#39;] = -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[&#39;close&#39;] > df[&#39;median&#39;]  # 当前K线的收盘价 > 中轨8 u1 E5 R: U9 g9 f
    condition2 = df[&#39;close&#39;].shift(1) <= df[&#39;median&#39;].shift(1)  # 之前K线的收盘价 <= 中轨
+ K8 i" G# t$ j" L    df.loc[condition1 & condition2, &#39;signal_short&#39;] = 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[&#39;signal&#39;] = df[[&#39;signal_long&#39;, &#39;signal_short&#39;]].sum(axis=1, min_count=1,% {% S3 I3 }" c, b9 j/ V! ?
                                                           skipna=True)  # 若你的pandas版本是最新的,请使用本行代码代替上面一行2 W" q/ Z0 W/ Q  ^
    temp = df[df[&#39;signal&#39;].notnull()][[&#39;signal&#39;]]
4 r' \, J- t- B  h! e    temp = temp[temp[&#39;signal&#39;] != temp[&#39;signal&#39;].shift(1)]1 D% `. Z9 O$ B, \$ z; I+ I
    df[&#39;signal&#39;] = temp[&#39;signal&#39;]/ \$ h% n$ w8 R9 J, b, f5 C# q

1 \3 A2 }- D2 X; `% ~* Xreturn df
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

236

金钱

0

收听

0

听众
性别

新手上路

金钱
236 元