1
+ # MyTT 麦语言-通达信-同花顺指标实现 https://github.com/mpquant/MyTT
2
+
3
+ import numpy as np ; import pandas as pd
4
+
5
+
6
+ def RD (N ,D = 3 ): return np .round (N ,D ) #四舍五入取3位小数
7
+ def RET (S ,N = 1 ): return np .array (S )[- N ] #返回序列倒数第N个值,默认返回最后一个
8
+ def ABS (S ): return np .abs (S ) #返回N的绝对值
9
+ def MAX (S1 ,S2 ): return np .maximum (S1 ,S2 ) #序列max
10
+ def MIN (S1 ,S2 ): return np .minimum (S1 ,S2 ) #序列min
11
+
12
+ def MA (S ,N ): #求序列的N日平均值,返回序列
13
+ return pd .Series (S ).rolling (N ).mean ().values
14
+
15
+ def REF (S , N = 1 ): # 对序列整体下移动N,返回序列(shift后会产生NAN)
16
+ return pd .Series (S ).shift (N ).values
17
+
18
+ def DIFF (S , N = 1 ): #前一个值减后一个值,前面会产生nan
19
+ return pd .Series (S ).diff (N ) #np.diff(S)直接删除nan,会少一行
20
+
21
+ def STD (S ,N ): #求序列的N日标准差,返回序列
22
+ return pd .Series (S ).rolling (N ).std (ddof = 0 ).values
23
+
24
+ def IF (S_BOOL ,S_TRUE ,S_FALSE ): # res=S_TRUE if S_BOOL==True else S_FALSE
25
+ return np .where (S_BOOL , S_TRUE , S_FALSE )
26
+
27
+ def SUM (S , N ): #对序列求N天累计和,返回序列
28
+ return pd .Series (S ).rolling (N ).sum ().values
29
+
30
+ def HHV (S ,N ): # HHV(C, 5) # 最近5天收盘最高价
31
+ return pd .Series (S ).rolling (N ).max ().values
32
+
33
+ def LLV (S ,N ): # LLV(C, 5) # 最近5天收盘最低价
34
+ return pd .Series (S ).rolling (N ).min ().values
35
+
36
+ def EMA (S ,N ): #为了精度 S>4*N EMA至少需要120周期
37
+ return pd .Series (S ).ewm (span = N , adjust = False ).mean ().values
38
+
39
+ def SMA (S , N , M = 1 ): #中国式的SMA,至少需要120周期才精确
40
+ K = pd .Series (S ).rolling (N ).mean () #先求出平均值
41
+ for i in range (N + 1 , len (S )): K [i ] = (M * S [i ] + (N - M ) * K [i - 1 ]) / N # 因为要取K[i-1],所以 range(N+1, len(S))
42
+ return K
43
+
44
+ def AVEDEV (S ,N ): # 平均绝对偏差 (序列与其平均值的绝对差的平均值)
45
+ avedev = pd .Series (S ).rolling (N ).apply (lambda x : (np .abs (x - x .mean ())).mean ())
46
+ return avedev .values
47
+ #--------------------------------------------------------------------
48
+
49
+ def COUNT (S_BOOL , N ): # COUNT(C>O, N): 最近N天满足S_BOO的天数 True的天数
50
+ return SUM (S_BOOL ,N )
51
+
52
+ def EVERY (S_BOOL , N ): # EVERY(C>O, 5) 最近N天是否都是True
53
+ R = SUM (S_BOOL , N )
54
+ return IF (R == N , True , False )
55
+
56
+ def EXIST (S_BOOL , N = 5 ): # EXIST(CLOSE>3010, N=5) n日内是否存在一天大于3000点
57
+ R = SUM (S_BOOL ,N )
58
+ return IF (R > 0 , True ,False )
59
+
60
+ def CROSS (S1 ,S2 ): # 判断穿越 CROSS(MA(C,5),MA(C,10))
61
+ CROSS_BOOL = IF (S1 > S2 , True ,False ) #;print(CROSS_BOOL)
62
+ return COUNT (CROSS_BOOL > 0 ,2 )== 1 # 上穿:昨天0 今天1 下穿:昨天1 今天0
63
+
64
+ #-----------------------------------下面是具体指标-------------------------------------
65
+ def MACD (CLOSE ,SHORT = 12 ,LONG = 26 ,M = 9 ): # EMA的关系,S取120日,和雪球小数点2位相同
66
+ DIF = EMA (CLOSE ,SHORT )- EMA (CLOSE ,LONG );
67
+ DEA = EMA (DIF ,M ); MACD = (DIF - DEA )* 2
68
+ return RD (DIF ),RD (DEA ),RD (MACD )
69
+
70
+ def KDJ (CLOSE ,HIGH ,LOW , N = 9 ,M1 = 3 ,M2 = 3 ):
71
+ RSV = (CLOSE - LLV (LOW , N )) / (HHV (HIGH , N ) - LLV (LOW , N )) * 100
72
+ K = EMA (RSV , (M1 * 2 - 1 )); D = EMA (K ,(M2 * 2 - 1 )); J = K * 3 - D * 2
73
+ return K , D , J
74
+
75
+ def RSI (CLOSE , N = 24 ):
76
+ DIF = CLOSE - REF (CLOSE ,1 )
77
+ return RD (SMA (MAX (DIF ,0 ), N ) / SMA (ABS (DIF ), N ) * 100 )
78
+
79
+ def WR (CLOSE , N = 10 , N1 = 6 ): #W&R 威廉指标
80
+ WR = (HHV (HIGH , N ) - CLOSE ) / (HHV (HIGH , N ) - LLV (LOW , N )) * 100
81
+ WR1 = (HHV (HIGH , N1 ) - CLOSE ) / (HHV (HIGH , N1 ) - LLV (LOW , N1 )) * 100
82
+ return RD (WR ), RD (WR1 )
83
+
84
+ def BIAS (CLOSE ,L1 = 6 , L2 = 12 , L3 = 24 ): # BIAS乖离率
85
+ BIAS1 = (CLOSE - MA (CLOSE , L1 )) / MA (CLOSE , L1 ) * 100
86
+ BIAS2 = (CLOSE - MA (CLOSE , L2 )) / MA (CLOSE , L2 ) * 100
87
+ BIAS3 = (CLOSE - MA (CLOSE , L3 )) / MA (CLOSE , L3 ) * 100
88
+ return RD (BIAS1 ), RD (BIAS2 ), RD (BIAS3 )
89
+
90
+ def BOLL (CLOSE ,N = 20 , P = 2 ): #BOLL布林带
91
+ MID = MA (CLOSE , N );
92
+ UPPER = MID + STD (CLOSE , N ) * P
93
+ LOWER = MID - STD (CLOSE , N ) * P
94
+ return RD (UPPER ), RD (MID ), RD (LOWER )
95
+
96
+ def PSY (CLOSE ,N = 12 , M = 6 ):
97
+ PSY = COUNT (CLOSE > REF (CLOSE ,1 ),N )/ N * 100
98
+ PSYMA = MA (PSY ,M )
99
+ return RD (PSY ),RD (PSYMA )
100
+
101
+
102
+ def CCI (CLOSE ,HIGH ,LOW ,N = 14 ):
103
+ TP = (HIGH + LOW + CLOSE )/ 3
104
+ return (TP - MA (TP ,N ))/ (0.015 * AVEDEV (TP ,N ))
105
+
106
+ def ATR (CLOSE ,HIGH ,LOW , N = 20 ): #真实波动N日平均值
107
+ TR = MAX (MAX ((HIGH - LOW ), ABS (REF (CLOSE , 1 ) - HIGH )), ABS (REF (CLOSE , 1 ) - LOW ))
108
+ return MA (TR , N )
109
+
110
+
111
+
0 commit comments