-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path2024量化利器之talib.py
More file actions
269 lines (159 loc) · 7.3 KB
/
Copy path2024量化利器之talib.py
File metadata and controls
269 lines (159 loc) · 7.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
###############################################################################
#
# 手写量化交易的利器 1 - talib
#
################################################################################
##学习MA,RSI,ATR等常用市场指标;
##学习如何通过Ta-Lib库计算市场指标;
##学习策略收益率,年化收益率等风险指标;
## 学习如何通过FFn库计算各种风险指标;
## 学习两种经典策略的视线;
import talib
import pandas as pd
import mpl_finance as mpf
import matplotlib.pyplot as plt
# 读取文件
df = pd.read.csv('')
# 计算MA指标
ma_df = talib.MA(df['close'],timeperiod=5)
# 输出结果
print(ma_df)
# 对MA指标进行可视化
ma5_df = talib.MA(df['close'],timeperiod=5)
ma10_df = talib.MA(df['close'],timeperiod=10)
ma20_df = talib.MA(df['close'],timeperiod=20)
#可视化
fig = plt.figure()
ax = fig.add_subplot(111)
# 绘制MA指标
ax.plot(ma5_df,label='MA5')
ax.plot(ma10_df,label='MA10')
ax.plot(ma20_df,label='MA20')
#绘制K线图
mpf.candlestick2_ohlc(ax,df['open'],df['high'],df['low'],df['close'],width=0.6,corlorup='red',colordownn='green')
plt.legend()
plt.show()
## MACD指标
# MACD(Moving Average Convergence and Divergence) 指标被称为异同移动平均线指标,是由查拉尔-阿佩尔于1970年提出来的;
# MACD通过收盘价短期的指数移动平均线与长线的指数移动平均线之间的聚合与分离状况,来表示当前市场是否具有合适的买卖机会;
###计算快速和慢速移动平均值EMA
######EMA(12)= 前一日EMA(12)*11/13+今日收盘价*2/13
######EMA(26)= 前一日EMA(26)*25/27+今日收盘价*2/27
## 计算离差值DIFF
###### DIFF=EMA(12)-EMA(26)
## 计算DIFF的移动平均值DMA
###### DEA(9)=前一日的DEA(9)*8/10 +今日收盘价*2/10
## 计算MACD柱状图
###### MACD=(DIFF-DEA)*2
#计算MACD
diff,dea,macd = talib.MACD(df['close'],fastperiod=12,slowperiod=26,signalperiod=9)
print(diff.dropna())
print(dea.dropna())
print(macd.drop())
import numpy as np
import mpl_finance as mpf
import matplotlib.pyplot as plt
fig=plt.figure()
ax1 = fig.add_subplot(211)
ax2 = fig.add_subplot(212)
##绘制K线
mpf.candlestick2_ohlc(ax1,df['open'],df['high'],df['low'],df['close'],width=0.6,colorup='red',colordown='green')
##绘制DIFF和DEA曲线
ax2.plot(diff,label='DIFF')
ax2.plot(dea,label='DEA')
#分别得到MACD的Bar是正值和负值的数据
macd_red=np.where(macd>0,macd,0)
macd_green=np.where(madc<0,macd,0)
#绘制MACD Bar
ax2.bar(range(len(macd)),macd_red,width=0.6,facecolor='red',label='MACD')
ax2.bar(range(len(macd)),macd_green,width=0.6,facecolor='green',label='MACD')
plt.lengend()
plt.show()
################ RIS指标
## RSI Relative Strength Index 指标被称为是相对强弱指标,威尔斯-维尔德提出的一种表示市场一定时期的景气程度的指标.
##衍生品市场中用来表示多空力量的强弱程度,属于超卖超买指标. 根据N日收盘涨幅与涨跌幅之间的比率得到的0,100
## 10~20之间市场处于超卖,30~70之间超卖;80~90为超买,后市大概率会出现价格回落。
rsi=talib.RSI(df['close'],timeperiod=14)
print(rsi.dropna())
fig = fig.figure()
ax1 = fig.add_subplot(211)
ax2 = fig.add_subplot(212)
#绘制K线图
mpf.candlestick2_ohlc(ax1,df['open'],df['high'],df['low'],df['close'],width=0.6,colorup='red',colordown='green')
#绘制RSI曲线
ax2.plot(0,np.mean(rsi))
ax2.plot(rsi,label='RSI')
plt.legend()
plt.show()
############ KDJ指标
## KDJ 被称为是随机找会标,乔治莱恩发现的,动量指标,短期趋势分析,超卖超卖判断,考虑了最高价,最低价与收盘价之间的关系,结合了
## 动量观念,强弱指标及移动平均的特点,更能全面的对当前的行情进行判断
## KDJ再实际应用中,主要从KDJ三者之间的大小或者三条曲线之间的关系进行行情的判断,一般情况下,如果KDJ的值都大于50,则为多头市场,
## 如果小于50为空头市场,后期看跌,但当KDJ值大于或者小于一定范围时,容易出现钝化的现象,也就是变化不明显。
K,D = talib.STOCH(df['high'],df['low'],df['low'],fastk_period=9,slowk_period=3,slowd_period=3)
J = 3*K-2*D
print(K.dropna())
print(D.dropna())
print(J.dropna())
# 可视化
fig = plt.figure()
ax1 = fig.add_subplot(211)
ax2 = fig.add_subplot(212)
# 绘制K线图
mpf.candlestoick2_ohlc(ax1,df['open'],df['high'],df['low'],df['close'],width=0.6,colorup='red',colordown='green')
#绘制KDJ
ax2.plot(0,np.mean(K))
ax2.plot(K,label='K')
ax2.plot(D,label='D')
ax2.plot(J,label='J')
plt.legend()
plt.show()
####### CCI指标
## 被称为是顺势指标,唐纳德兰伯特20世纪80年代提出的, Commodity Channel Index 指标被称为顺势指标,可以用于判断金融衍生品价格是否超出正态分布的范围,同时也是一种超买和超卖的指标
## 不同于KDJ指标,威廉指标等具有0~100的上下界限,CCI指标波动于正无穷到负无穷之间,因此不会出现指标钝化
## TP= HIGH+CLOSE+LOW/3 收盘价的移动平均 MA = average(Close,N); 价格偏离 MD=average(MA-CLOSE,N);CCI(N)=(TP-MA)/MD/0.015
CCI = talib.CCI(df['high'],df['low'],df['close'],timeperiod=14)
print(CCI.dropna())
fig = plt.figure()
ax1 = fig.subplot(211)
ax2 = fig.subplot(212)
# 绘制K线图
mpf.candlesticks_ohlc(ax1,df['open'],df['high'],df['low'],df['close'],width=0.6,colorup='red',colordown='green')
#
ax2.plot(0,np.mean())
ax2.plot(CCI,label='CCI')
plt.legend()
plt.show()
###############################ATR指标
## ATR average true range指标被称为真实波动幅度指标,也称为均幅指标或真实波动均值指标,是一种表示市场变化率的指标;
## 1978年威尔斯维尔德提出来的,该指标并不能直接反应价格的走势或趋势,只是反应了价格的波动程度
## 在计算平均真实幅度之前需要先计算真实波动幅度TR true range
### 计算当前交易日最高价high T 和最低价Low L 之间的价差;
### 计算前一交易日收盘价和当前交易日最高价之间的价差;
### 计算前一交易日收盘价和当前交易日最低价之间的价差;
### 第四 取上面三个之间振幅最大值;
### 计算N日ATR,ATR=MA(TR,N)
ATR = talib.ATR(df['high'],df['low'],df['close'],timeperiod=14)
print(ATR.dropna())
# 绘制K线图
mpf.candlestick2_ohlc(ax1,df['open'],df['high'],df['low'],df['close'],width=0.5,colorup='red',colordown='green')
# 绘制ATR曲线
ax2.plot(0,np.mean(ATR)) #使上下坐标对应
ax2.plot(ATR,label='ATR')
plt.legend()
plt.show()
###############OBV 指标
##OBV指标被称为能量潮指标,是由美国投资分析师葛兰维创造的,是一种成交量指标,它通过统计成交量变动的趋势来推测股票价格的走势;
## 一般是以N字形进行波动,对于逐渐推进上升的N字走势称为是上升潮;OBV与价格指标同时缓慢上升意味着买方的力量不断得到加强.
OBV = talib.OBV(df['close'],df['vol'])
print(OBV)
fig = plt.figure()
ax1 = fig.add_subplot(211)
ax2 = fig.add_subplot(212)
# 绘制K线图
mpf.candlestick2_ohlc(ax1,df['open'],df['high'],df['low'],df['close'],width=0.6,colorup='red',colordown='green')
# 绘制OBV曲线
ax2.plot(OBV,label='OBV')
ax2.plot(talib.MA(OBV,timeperiod=14),label='OBV_MA')
plt.legend()
plt.show()