我的新书《基于股票大数据分析的Python入门实战》于近日上架,在这篇博文向大家介绍我的新书:《基于股票大数据分析的Python入门实战》里,介绍了这本书的内容。这里将摘录出部分内容,用以推广本书,请大家多多支持。

1 MACD指标的计算方式

从数学角度来分析,MACD指标是根据均线的构造原理,对股票收盘价进行平滑处理,计算出算术平均值以后再进行二次计算,它是属于趋向类指标。

MACD指标是由三部分构成的,分别是:DIF(离差值,也叫差离值)、DEA(离差值平均)和BAR(柱状线)。

具体的计算过程是,首先算出快速移动平均线(EMA1)和慢速移动平均线(EMA2),用这两个数值来测量两者间的差离值(DIF),在此基础上再计算差离值(DIF)N周期的平滑移动平均线DEA(也叫MACD、DEM)线。

如前文所述,EMA1周期参数一般取12日,EMA2一般取26日,而DIF一般取9日,在此基础上,MACD指标的计算步骤如下所示。

    第一步:计算移动平均值(即EMA)。

12日EMA1的计算方式是:EMA(12)= 前一日EMA(12)× 11/13 + 今日收盘价 × 2/13

26日EMA2的计算方式是:EMA(26)= 前一日EMA(26)× 25/27 + 今日收盘价 ×2 /27

    第二步:计算MACD指标中的差离值(即DIF)。

DIF = 今日EMA(12)- 今日EMA(26)

    第三步:计算差离值的9日EMA(即MACD指标中的DEA)。用差离值计算它的9日EMA,这个值就是差离平均值(DEA)。

今日DEA(MACD)= 前一日DEA × 8/10 + 今日DIF × 2/10

    第四步:计算BAR柱状线。

BAR = 2 × (DIF - DEA)

这里乘以2的原因是,在不影响趋势的情况下,从数值上扩大DIF和DEA差值,这样观察效果就更加明显。

最后,把各点(即每个交易日)的DIF值和DEA值连接起来,就能得到在x轴上下移动的两条线,分别表示短期(即快速,EMA1,周期是12天)和长期(即慢速,EMA2,周期是26天)。而且,DIF和DEA的离差值能构成红、绿两种颜色的柱状线,在x轴之上是红色,而x轴之下是绿色。

2 遍历数据表数据,绘制MACD指标

同K线指标一样,根据不同的计算周期, MACD指标也可以分为日指标、周指标、月指标乃至年指标。在下面的DrawMACD.py范例程序中将绘制日MACD指标,在这个范例程序中可以看到关于数据结构、图形绘制和数据库相关的操作,由于程序代码比较长,下面分段讲解。

1    # !/usr/bin/env python
2    # coding=utf-8
3    import pandas as pd
4    import matplotlib.pyplot as plt
5    import pymysql
6    import sys
7    # 第一个参数是数据,第二个参数是周期
8    def calEMA(df, term):
9        for i in range(len(df)):
10           if i==0: # 第一天
11               df.ix[i,'EMA']=df.ix[i,'close']
12           if i>0:
13              df.ix[i,'EMA']=(term-1)/(term+1)*df.ix[i-1,'EMA']+2/(term+1) * df.ix[i,'close']
14       EMAList=list(df['EMA'])
15       return EMAList

在第8行到第15行的calEMA方法中,根据第二个参数term,计算快速(周期是12天)和慢速(周期是26天)的EMA值。

具体步骤是,通过第9行的for循环,遍历由第一个参数指定的DataFrame类型的df对象,根据第10行的if条件中,如果是第一天,则EMA值用当天的收盘价,如果满足第12行的条件,即不是第一天,则在第13行中根据8.3.1节的算法,计算当天的EMA值。

请注意,在第11行和第13行中是通过df.ix的形式访问索引行(比如第i行)和指定标签列(比如EMA列)的数值,ix方法与之前loc以及iloc方法不同的是,ix方法可以通过索引值和标签值访问,而loc以及iloc方法只能通过索引值来访问。计算完成后,在第14行把df的EMA列转换成列表类型的对象并在第15行返回。

16   # 定义计算MACD的方法
17   def calMACD(df, shortTerm=12, longTerm=26, DIFTerm=9):
18       shortEMA = calEMA(df, shortTerm)
19       longEMA = calEMA(df, longTerm)
20       df['DIF'] = pd.Series(shortEMA) - pd.Series(longEMA)
21       for i in range(len(df)):
22           if i==0:         # 第一天
23               df.ix[i,'DEA'] = df.ix[i,'DIF']  # ix可以通过标签名和索引来获取数据
24           if i>0:
25                 df.ix[i,'DEA'] = (DIFTerm-1)/(DIFTerm+1)*df.ix[i-1,'DEA'] + 2/(DIFTerm+1)*df.ix[i,'DIF']
26       df['MACD'] = 2*(df['DIF'] - df['DEA'])
27       return df[['date','DIF','DEA','MACD']]
28       # return df

在第15行到第27行定义的calMACD方法中,将调用第8行定义的calEMA方法来计算MACD的值。具体步骤是,在第18行和第19行通过调用calEMA方法,分别得到了快速和慢速的EMA值,在第20行,用这两个值计算DIF值。请注意,shortEMA和longEMA都是列表类型,所以可以像第20行那样,通过调用pd.Series方法把它们转换成Series类对象后再直接计算差值。

从第21行到第25行的程序语句,也是根据8.3.1节给出的公式计算DEA值,同样要用两条if语句区分“第一天”和“以后几天”这两种情况,在第26行根据计算公式算出MACD的值。

第27行返回指定的列,在后面的代码中还要用到df对象的其他列,此时则可以用如第28行所示的代码返回df的全部列。

29   try:
30       # 打开数据库连接
31       db = pymysql.connect("localhost","root","123456","pythonStock" )
32   except:
33       print('Error when Connecting to DB.')
34       sys.exit()
35   cursor = db.cursor()
36   cursor.execute("select * from stock_600895")
37   cols = cursor.description        # 返回列名
38   heads = []
39   # 依次把每个cols元素中的第一个值放入col数组
40   for index in cols:
41       heads.append(index[0])
42   result = cursor.fetchall()
43   df = pd.DataFrame(list(result))
44   df.columns=heads
45   # print(calMACD(df, 12, 26, 9)) # 输出结果
46   stockDataFrame = calMACD(df, 12, 26, 9)

从第29行到第35行的程序语句,建立了MySQL数据库的连接和获得游标cursor对象,在第36行中,通过select类型的SQL语句,来获取stock_600895表中的所有数据,如8.2节所述,这个数据表中的数据源自雅虎网站。

在第37行中,得到了stock_600895数据表的字段列表。在第40行和第41行的for循环中,把字段列表中的第0行索引元素放入了heads。在第42行和第43行,把从stock_600895数据表中获取的数据放入到df对象。在第44行的程序语句,把包含数据表字段列表的heads对象赋值给df对象的字段。

执行到这里,如果去掉第45行打印语句的注解,就能看到第一列输出的是字段名列表,之后会按天输出与MACD有关的股票指标数据。

在第46行调用了calMACD方法,并把结果赋值给stockDataFrame对象,之后就可以根据stockDataFrame对象中的值开始绘图。

47   # 开始绘图
48   plt.figure()
49   stockDataFrame['DEA'].plot(color="red",label='DEA')
50   stockDataFrame['DIF'].plot(color="blue",label='DIF')
51   plt.legend(loc='best')    # 绘制图例
52   # 设置MACD柱状图
53   for index, row in stockDataFrame.iterrows():
54       if(row['MACD'] >0):   # 大于0则用红色
55           plt.bar(row['date'], row['MACD'],width=0.5, color='red')
56       else:                               # 小于等于0则用绿色
57           plt.bar(row['date'], row['MACD'],width=0.5, color='green')
58   # 设置x轴坐标的标签和旋转角度
59   major_index=stockDataFrame.index[stockDataFrame.index%10==0]
60   major_xtics=stockDataFrame['date'][stockDataFrame.index%10==0]
61   plt.xticks(major_index,major_xtics)
62   plt.setp(plt.gca().get_xticklabels(), rotation=30)
63   # 带网格线,且设置了网格样式
64   plt.grid(linestyle='-.')
65   plt.title("600895张江高科的MACD图")
66   plt.rcParams['axes.unicode_minus'] = False
67   plt.rcParams['font.sans-serif']=['SimHei']
68   plt.show()

在第49和第50行中通过调用plot方法,以折线的形式绘制出DEA和DIF两根线,在第51行中设置了图例。

在第53行到第57行的for循环中,以柱状图的形式依次绘制了每天的MACD值的柱状线,这里用第54行和第56行的if…else语句进行区分,如果row['MACD']大于0,则MACD柱是红色,反之是绿色。

从第59行到第61行的程序语句设置了x轴的标签,如果显示每天的日期,那么x轴上的文字会过于密集,所以在第59行和第60行进行相应的处理,只显示stockDataFrame.index%10==0(即索引值是10的倍数)的日期。

在第62行设置了x轴文字的旋转角度,在第64行设置了网格的式样,在第65行设置了标题文字,最后在第68行通过调用show方法绘制了整个图形。

请注意,如果不编写第66行的程序语句,那么y轴标签值里的负号就不会显示,这样显示结果就不正确了。读者可以把这条语句注释掉后,再运行一下,看看结果如何。

至此,我们实现了计算并绘制MACD指标线的功能,读者应该掌握了如何获得指定股票在指定时间段内的交易数据,而后可以稍微改写上述的范例程序,绘制出其他股票在指定时间范围内的MACD走势图。

3 MACD与K线均线的整合效果图

MACD是趋势类指标,如果把它与K线和均线整合到一起的话,就能更好地看出股票走势的“趋势性”。在下面的DrawKwithMACD.py范例程序中示范了整合它们的效果,由于程序代码比较长,因而在下面的分析中略去了一些之前分析过的重复代码,读者可以从本书提供下载的范例程序中看到完整的代码。

1    # !/usr/bin/env python
2    # coding=utf-8
3    import pandas as pd
4    import matplotlib.pyplot as plt
5    import pymysql
6    import sys
7    from mpl_finance import candlestick2_ochl
8    from matplotlib.ticker import MultipleLocator
9    # 计算EMA的方法,第一个参数是数据,第二个参数是周期
10   def calEMA(df, term):
11       # 省略具体实现,请参考本书提供下载的完整范例程序
12   # 定义计算MACD的方法
13   def calMACD(df, shortTerm=12, longTerm=26, DIFTerm=9):
14       # 省略中间的计算过程,请参考本书提供下载的完整范例程序
15       return df

从第3行到第8行的程序语句通过import语句导入了必要的依赖包,第10行定义的calEMA方法和DrawMACD.py范例程序中的完全一致,所以就省略了该方法内部的代码。第13行定义计算MACD的calMACD方法和DrawMACD.py范例程序中的同名方法也完全一致,但在最后的第15行,是通过return语句返回整个df对象,而不是返回仅仅包含MACD指标的相关列,这是因为,在后文中需要股票的开盘价等数值来绘制K线图。

16   try:
17       # 打开数据库连接
18       db = pymysql.connect("localhost","root","123456","pythonStock" )
19   except:
20       print('Error when Connecting to DB.')
21       sys.exit()
22   cursor = db.cursor()
23   cursor.execute("select * from stock_600895")
24   cols = cursor.description        # 返回列名
25   heads = []
26   # 依次把每个cols元素中的第一个值放入col数组
27   for index in cols:
28       heads.append(index[0])
29   result = cursor.fetchall()
30   df = pd.DataFrame(list(result))
31   df.columns=heads
32   # print(calMACD(df, 12, 26, 9)) # 输出结果
33   stockDataFrame = calMACD(df, 12, 26, 9)

从第16行到第33行的程序语句把需要的数据放入了stockDataFrame这个DataFrame类型的对象中,之后就可以根据其中的数据画图了,这段程序代码之前分析过,就不再重复讲述了。

34   # 开始绘图,设置大小,共享x坐标轴
35   figure,(axPrice, axMACD) = plt.subplots(2, sharex=True, figsize=(15,8))
36   # 调用方法绘制K线图
37   candlestick2_ochl(ax = axPrice, opens=stockDataFrame["open"].values, closes = stockDataFrame["close"].values, highs=stockDataFrame["high"].values,  lows = stockDataFrame["low"].values, width=0.75, colorup='red', colordown='green')
38   axPrice.set_title("600895张江高科K线图和均线图")   # 设置子图的标题
39   stockDataFrame['close'].rolling(window=3).mean().plot(ax=axPrice,color="red",label='3日均线')
40   stockDataFrame['close'].rolling(window=5).mean().plot(ax=axPrice,color="blue",label='5日均线')
41   stockDataFrame['close'].rolling(window=10).mean().plot(ax=axPrice,color="green",label='10日均线')
42   axPrice.legend(loc='best')       # 绘制图例
43   axPrice.set_ylabel("价格(单位:元)")
44   axPrice.grid(linestyle='-.')     # 带网格线

从第34行到第44行的程序语句绘制了指定时间范围内“张江高科”股票的K线图和均线,这部分代码和第7章drawKMAAndVol.py范例程序中实现同类功能的代码很相似,有差别的是在第35行,第二个子图的名字设置为“axMACD”,在第44行中通过linestyle设置了网格线的样式。

45   # 开始绘制第二个子图
46   stockDataFrame['DEA'].plot(ax=axMACD,color="red",label='DEA')
47   stockDataFrame['DIF'].plot(ax=axMACD,color="blue",label='DIF')
48   plt.legend(loc='best')    # 绘制图例
49   # 设置第二个子图中的MACD柱状图
50   for index, row in stockDataFrame.iterrows():
51       if(row['MACD'] >0):   # 大于0则用红色
52           axMACD.bar(row['date'], row['MACD'],width=0.5, color='red')
53       else:                               # 小于等于0则用绿色
54           axMACD.bar(row['date'], row['MACD'],width=0.5, color='green')
55   axMACD.set_title("600895张江高科MACD")   # 设置子图的标题
56   axMACD.grid(linestyle='-.')                # 带网格线
57   # xmajorLocator = MultipleLocator(10)    # 将x轴的主刻度设置为10的倍数
58   # axMACD.xaxis.set_major_locator(xmajorLocator)
59   major_xtics=stockDataFrame['date'][stockDataFrame.index%10==0]
60   axMACD.set_xticks(major_xtics)
61   # 旋转x轴显示文字的角度
62   for xtick in axMACD.get_xticklabels():
63       xtick.set_rotation(30)
64   plt.rcParams['font.sans-serif']=['SimHei']
65   plt.rcParams['axes.unicode_minus'] = False
66   plt.show()

在上述程序代码中,在axMACD子图内绘制了MACD线,由于是在子图内绘制,因此在第46行和第47行绘制DEA和DIF折线的时候,需要在参数里通过“ax=axMACD”的形式指定所在的子图。

在第59行和第60行中设置了axMACD子图中的x轴标签,由于在第35行中设置了axPrice和axMACD两子图是共享x轴,因此K线和均线所在子图的x轴刻度会和MACD子图中的一样。因为是在子图中,所以需要通过第62行和第63行的for循环依次旋转x轴坐标的标签文字。

在这段代码中其实给出了两种设置x轴标签的方式。如果注释掉第59行和第60行的代码,并去掉第57行和第58行的注释,会发现效果是相同的。

需要说明的是,虽然在第57行和第59行的代码中并没有指定标签文字,但在第37行调用candlestick2_ochl方法绘制K线图时,会设置x轴的标签文字,所以依然能看到x轴上日期的标签。运行这个范例程序后,结果如图所示。

4 MACD指标的指导意义

根据MACD各项指标的含义,可以通过DIF和DEA两者的值、DIF和DEA指标的交叉情况(比如金叉或死叉)以及BAR柱状图的长短与收缩的情况来判断当前股票的趋势。

如下两点是根据DIF和DEA的数值情况以及它们在x轴上下的位置来确定股票的买卖策略。

第一,当DIF和DEA两者的值均大于0(在x轴之上)并向上移动时,一般表示当前处于多头行情中,建议可以买入。反之,当两者的值均小于0且向下移动时,一般表示处于空头行情中,建议卖出或观望。

第二,当DIF和DEA的值均大于0但都在向下移动时,一般表示为上涨趋势即将结束,建议可以卖出股票或观望。同理,当两者的值均小于0,但在向上移动时,一般表示股票将上涨,建议可以持续关注或买进。

如下四点是根据DIF和DEA的交叉情况来决定买卖策略。

第一,DIF与DEA都大于0而且DIF向上突破DEA时,说明当前处于强势阶段,股价再次上涨的可能性比较大,建议可以买进,这就是所谓MACD指标黄金交叉,也叫金叉。

第二,DIF与DEA都小于0,但此时DIF向上突破DEA时,表明股市虽然当前可能仍然处于跌势,但即将转强,建议可以开始买进股票或者重点关注,这也是MACD金叉的一种形式。

第三,DIF与DEA虽然都大于0,但而DIF却向下突破DEA时,这说明当前有可能从强势转变成弱势,股价有可能会跌,此时建议看机会就卖出,这就是所谓MACD指标的死亡交叉,也叫死叉。

第四,DIF和DEA都小于0,在这种情况下又发生了DIF向下突破DEA的情况,这说明可能进入下一阶段的弱势中,股价有可能继续下跌,此时建议卖出股票或观望,这也是MACD死叉的一种形式。

如下两点是根据MACD中BAR柱状图的情况来决定买卖策略。

第一,红柱持续放大,这说明当前处于多头行情中,此时建议买入股票,直到红柱无法再进一步放大时才考虑卖出。相反,如果绿柱持续放大,这说明当前处于空头行情中,股价有可能继续下跌,此时观望或卖出,直到绿柱开始缩小时才能考虑买入。

第二,当红柱逐渐消失而绿柱逐渐出现时,这表明当前的上涨趋势即将结束,有可能开始加速下跌,这时建议可以卖出股票或者观望。反之,当绿柱逐渐消失而红柱开始出现时,这说明下跌行情即将或已经结束,有可能开始加速上涨,此时可以开始买入。

虽然说MACD指标对趋势的分析有一定的指导意义,但它同时也存在一定的盲点。

比如,当没有形成明显的上涨或下跌趋势时(即在盘整阶段),DIF和DEA这两个指标会频繁地出现金叉和死叉的情况,这时由于没有形成趋势,因此金叉和死叉的指导意义并不明显。

又如,MACD指标是对趋势而言的,从中无法看出未来时间段内价格上涨和下跌的幅度。比如在图8-11中,股票“张江高科”在价格高位时,DIF的指标在2左右,但有些股票在高位时,DIF的指标甚至会超过5。

也就是说,无法根据DIF和DEA数值的大小来判断股价会不会进一步涨或进一步跌。有时看似DIF和DEA到达一个高位,但如果当前上涨趋势强劲,股价会继续上涨,同时这两个指标会进一步上升,反之亦然。

因此,在实际使用中,投资者可以用MACD指标结合其他技术指标,比如之前提到的均线,从而能对买卖信号进行多重确认。

5 验证基于柱状图和金叉的买点

在CalBuyPointByMACD.py范例程序中将根据如下原则来验证买点:DIF向上突破DEA(出现金叉),且柱状图在x轴上方(即当前是红柱状态)。

在这个范例程序中,用的是股票“金石资源(代码为603505)从2018年9月到2019年5月的交易数据,程序代码如下。

1    # !/usr/bin/env python
2    # coding=utf-8
3    import pandas as pd
4    import pymysql
5    import sys
6    # 第一个参数是数据,第二个参数是周期
7    def calEMA(df, term):
8      # 省略方法内的代码,请参考本书提供下载的完整范例程序
9    # 定义计算MACD的方法
10   def calMACD(df, shortTerm=12, longTerm=26, DIFTerm=9):
11       # 省略中间计算过程的代码,最后返回的是df,请参考本书提供下载的完整范例程序
12       return df

上述代码的calEMA和calMACD方法和8.3.4节的范例程序中的代码完全一致,所以就不再重复讲述了。

13 def getMACDByCode(code):
14      try:
15          # 打开数据库连接
16          db = pymysql.connect("localhost","root","123456","pythonStock" )
17      except:
18          print('Error when Connecting to DB.')
19          sys.exit()
20      cursor = db.cursor()
21      cursor.execute('select * from stock_'+code)
22      cols = cursor.description      # 返回列名
23      heads = []
24      # 依次把每个cols元素中的第一个值放入col数组
25      for index in cols:
26          heads.append(index[0])
27      result = cursor.fetchall()
28      df = pd.DataFrame(list(result))
29      df.columns=heads
30      stockDataFrame = calMACD(df, 12, 26, 9)
31      return stockDataFrame

第13行开始的getMACDByCode方法中包含了从数据表中获取的股票交易数据并返回MACD指标的代码, 这部分程序代码与之前DrawKwithMACD.py范例程序中的程序也非常相似,只不过在第21行中是根据股票代码来动态地拼接select语句。该方法在第31行中返回包含MACD指标的stockDataFrame对象。

32 # print(getMACDByCode('603505'))  # 可去除这条语句的注解以确认数据
33  stockDf = getMACDByCode('603505')
34  cnt=0
35  while cnt<=len(stockDf)-1:
36      if(cnt>=30):        # 前几天有误差,从第30天算起
37          try:
38              # 规则1:这天DIF值上穿DEA
39              if stockDf.iloc[cnt]['DIF']>stockDf.iloc[cnt]['DEA'] and stockDf.iloc[cnt-1]['DIF']<stockDf.iloc[cnt-1]['DEA']:
40                  #规则2:出现红柱,即MACD值大于0
41                  if stockDf.iloc[cnt]['MACD']>0:
42                      print("Buy Point by MACD on:" + stockDf.iloc[cnt]['date'])
43          except:
44              pass
45      cnt=cnt+1

如果去掉第32行打印语句的注释,执行后就能确认数据。在第35行到第45行的while循环中,依次遍历了每个交易日的数据。有数据计算的误差,所以在这个范例程序中通过第36行的if语句排除了刚开始29天的数据,从第30天算起。

在第39行的if条件语句中制定了第一个规则,前一个交易日的DIF小于DEA,而且当天DIF大于DEA,即出现上穿金叉的现象。在第41行的if条件语句中制定了第二个规则,即出现金叉的当日,MACD指标需要大于0,即当前BAR柱是红柱状态。运行这个范例程序之后,就能看到如下输出的买点。

Buy Point by MACD on:2018-10-31

Buy Point by MACD on:2019-01-09

Buy Point by MACD on:2019-03-18

Buy Point by MACD on:2019-04-04

Buy Point by MACD on:2019-04-19

下面改写一下之前的范例程序,把股票代码改成603505,把股票名称改为“金石资源”,运行后即可看到如图所示的结果图。

根据图中的价格走势,在表中列出了各买点的确认情况。

表  基于MACD得到的买点情况确认表

买点

对买点的分析

正确性

2018-10-31

该日出现DIF金叉,且Bar已经在红柱状态,后市有涨。

正确

2019-01-09

该日出现DIF金叉,且Bar柱开始逐渐变红,后市有涨。

正确

2019-03-18

该日虽然出现金叉,Bar柱也开始变红,但之后几天Bar交替出现红柱和绿柱情况,后市在下跌后,出现上涨情况。

不明确

2019-04-04

该日在出现金叉的同时,Bar柱由绿转红。但之后若干交易日后出现死叉,且Bar柱又转绿,后市下跌。

不正确

2019-04-19

出现金叉,且Bar柱由绿柱一下子变很长,后市有涨。

正确

根据这个范例程序的运行结果,可以得到的结论是:通过MACD指标的确能算出买点,但之前也说过,MACD有盲点,在盘整阶段,趋势没有形成时,此时金叉的指导意义就不是很明显,甚至是错误的。

6 验证基于柱状图和死叉的卖点

参考MACD指标,与8.4.2节描述的情况相反,如果出现如下情况,则可以卖出股票:DIF向下突破DEA(出现死叉),且柱状图向下运动(红柱缩小或绿柱变长)。下面通过股票“士兰微”(代码为600460)从2018年9月到2019年5月的交易数据来验证卖点。

先来做如下的准备工作:在MySQL的pythonStock数据库中创建stock_600460数据表,在之前介绍的InsertDataFromYahoo.py范例程序中,把股票代码改为600460,运行后即可在stock_600460数据表中看到指定时间范围内的交易数据。

验证MACD指标卖点的CalSellPointByMACD.py范例程序与之前CalBuyPointByMACD.py范例程序很相似,下面只分析不同的程序代码部分。

1    # !/usr/bin/env python
2    # coding=utf-8
3    import pandas as pd
4    import pymysql
5    import sys
6    # calEMA方法中的代码没有变
7    def calEMA(df, term):
8        # 省略方法内的程序代码,请参考本书提供下载的完整范例程序
9    # 定义计算MACD的方法内的程序代码也没有变
10   def calMACD(df, shortTerm=12, longTerm=26, DIFTerm=9):
11       # 省略方法内的程序代码,请参考本书提供下载的完整范例程序
12   def getMACDByCode(code):
13       # 和CalBuyPointByMACD.py范例程序中的程序代码一致
14   stockDf = getMACDByCode('600460')
15   cnt=0
16   while cnt<=len(stockDf)-1:
17       if(cnt>=30):         # 前几天有误差,从第30天算起
18           try:
19               # 规则1:这天DIF值下穿DEA
20               if stockDf.iloc[cnt]['DIF']<stockDf.iloc[cnt]['DEA'] and stockDf.iloc[cnt-1]['DIF']>stockDf.iloc[cnt-1]['DEA']:
21                   # 规则2:Bar柱是否向下运动
22                   if stockDf.iloc[cnt]['MACD']<stockDf.iloc[cnt-1]['MACD']:
23                       print("Sell Point by MACD on:" + stockDf.iloc[cnt]['date'])
24           except:
25               pass
26       cnt=cnt+1

上述代码中的calEMA、calMACD和getMACDByCode三个方法和CalBuyPointByMACD.py范例程序中的代码完全一致,所以本节仅仅是给出了这些方法的定义,不再重复讲述了。

在第14行中通过调用getMACDByCode方法,获取了600460(士兰微)的交易数据,其中包含了MACD指标数据。在第16行到第26行的while循环中通过遍历stockDf对象,计算卖点。

具体的步骤是,通过第17行的if条件语句排除了误差比较大的数据,随后通过第20行的if语句判断当天是否出现了DIF死叉的情况,即前一个交易日的DIF比DEA大,但当前交易日DIF比DEA小。

当满足这个条件时,再通过第22行的if语句判断当天的Bar柱数值是否小于前一天的,即判断Bar柱是否在向下运动。当满足这两个条件时,通过第23行的代码输出建议卖出股票的日期。运行这个范例程序代码后,可看到如下输出的卖点。

Sell Point by MACD on:2018-10-11

Sell Point by MACD on:2018-11-29

Sell Point by MACD on:2018-12-06

Sell Point by MACD on:2019-02-28

Sell Point by MACD on:2019-04-04

再修改前文提到的DrawKwithMACD.py范例程序,把股票代码改为600460,把股票名称改成“士兰微”,运行后即可看到如图所示的结果图。

图  股票“士兰微”的K线、均线整合MACD的走势图

再根据价格走势,在表中列出了各卖点的确认情况。

表  基于MACD得到的卖点情况确认表

卖点

对卖点的分析

正确性

2018-10-11

1. 该日出现DIF死叉,且DIF和DEA均在x轴下方,Bar由红转绿,且绿柱持续扩大。

2. 虽然能验证该点附近处于弱势,但由于此点已经处于弱势,所以后市价位跌幅不大。

不明确

2018-11-29

1. 在DIF和DEA上行过程中出现死叉。

2. Bar柱从红转绿,后市股价有一定幅度的下跌。

正确

2018-12-06

在11月29日的卖点基础上,再次出现死叉,且Bar柱没有向上运动的趋势,所以进一步确认了弱势行情,果然后市股价有一定幅度的下跌。

正确

2019-02-28

1. 虽然出现死叉,但前后几天DIF和DEA均在向上运动。这说明强势并没有结束。

2. Bar柱虽然变绿,但变绿的幅度非常小。

3. 后市价格不是下跌,而是上涨了。

不正确

2019-04-04

1. DIF和DEA在x轴上方出现死叉,说明强势行情有可能即将结束。

2. Bar柱由红开始转绿。

3. 后市价位出现一波短暂反弹,这可以理解成强势的结束,之后出现下跌,且下跌幅度不小。

正确

从上述的验证结果可知,从MACD指标中能看出股价发展的趋势,当从强势开始转弱时,如果没有其他利好消息,可以考虑观望或适当卖出股票。

在通过MACD指标确认趋势时,应当从DIF和DEA的数值、运动趋势(即金叉或死叉的情况)和Bar柱的运动趋势等方面综合评判,而不能简单割裂地通过单个因素来考虑。

并且,影响股价的因素非常多,在选股时,应当从资金面、消息面和指标的技术面等因素综合考虑,哪怕在指标的技术面,也应当结合多项技术指标综合考虑。如前文所述,单个指标难免出现盲点,当遇到盲点时就有可能出现风险而误判。

7 总结和版权说明

上述内容是摘自我的书,《基于股票大数据分析的Python入门实战 视频教学版》,京东链接:https://item.jd.com/69241653952.html。

在我的博客里,也有其它相关介绍本书的文章,链接如下。

向大家介绍我的新书:《基于股票大数据分析的Python入门实战》

通过机器学习的线性回归算法预测股票走势(用Python实现)

在我的新书里,尝试着用股票案例讲述Python爬虫大数据可视化等知识

以股票RSI指标为例,学习Python发送邮件功能(含RSI指标确定卖点策略)

以预测股票涨跌案例入门基于SVM的机器学习

用python的matplotlib和numpy库绘制股票K线均线和成交量的整合效果(含量化验证交易策略代码)

用python的matplotlib和numpy库绘制股票K线均线的整合效果(含从网络接口爬取数据和验证交易策略代码)

 本文可转载,但请标明出处,同时请全文转载,别根据自身需要在转载时恶意删改本文

用matplotlib和pandas绘制股票MACD指标图,并验证化交易策略相关推荐

  1. 用Python的Pandas和Matplotlib绘制股票KDJ指标线

    我最近出了一本书,<基于股票大数据分析的Python入门实战 视频教学版>,京东链接:https://item.jd.com/69241653952.html,在其中给出了MACD,KDJ ...

  2. 使用Pandas绘制股票均线

    使用pandas绘制股票均线,这里以5日均线和20日均线为例. 1. 首先导入pandas模块. import pandas as pd # 设置最大列数,避免只显示部分列 pd.set_option ...

  3. 【转】用Python的Pandas和Matplotlib绘制股票KDJ指标线

    我最近出了一本书,<基于股票大数据分析的Python入门实战 视频教学版>,京东链接:https://item.jd.com/69241653952.html,在其中给出了MACD,KDJ ...

  4. Python绘制MACD指标图

    写在前面 MACD简介 用到的主要Python库 MACD详细介绍 Python代码 总结 参考文献 推荐阅读 2020.8.1更新 写在前面 最近正在研究算法交易,看了几本英文原版书.本文总结自Pa ...

  5. 平均股价的时间序列图形_数据可视化——pandas绘制股票走势图

    python数据可视化工具除了matplotlib底层绘图包,还有在matplotlib基础上分装的seaborn绘图包,此外,数据分析报pandas也在matplotlib基础上分装内置了绘图功能. ...

  6. Python使用matplotlib设置pandas绘制的饼状图扇形标签

    2021年全国高校Python课程高级研修班(线上) 中国大学MOOC"Python程序设计基础"第4次开课 推荐图书: <Python程序设计(第3版)>,(ISBN ...

  7. 用Python的Pandas绘制股票唐奇安通道!

    1  计算并绘制唐奇安通道 唐奇安通道是由上阻力线.下支撑线和中心线这三条线组成. 上阻力线 = 过去N天的最高价 下支撑线 = 过去N天的最低价 中心线 =(上线 + 下线)除以 2 在实际的分析场 ...

  8. 用python的matplotlib和numpy库绘制股票K线均线和成交量的整合效果(含量化验证交易策略代码)...

    在用python的matplotlib和numpy库绘制股票K线均线的整合效果(含从网络接口爬取数据和验证交易策略代码)一文里,我讲述了通过爬虫接口得到股票数据并绘制出K线均线图形的方式,在本文里,将 ...

  9. 用python画股票分时图 github_用python的matplotlib和numpy库绘制股票K线均线和成交量的整合效果(含量化验证交易策略代码)...

    在用python的matplotlib和numpy库绘制股票K线均线的整合效果(含从网络接口爬取数据和验证交易策略代码)一文里,我讲述了通过爬虫接口得到股票数据并绘制出K线均线图形的方式,在本文里,将 ...

最新文章

  1. 仙剑4按键取钱的东东。
  2. python完成‘21点游戏’
  3. Linux无root权限安装opencv3.4.0以及一些问题
  4. 数据库表的基本操作——创建一个表,索引和查询
  5. Redis集群(二)Sentinel哨兵模式
  6. 1400 序列分解(dfs)
  7. php bi系统,bi系统是什么系统
  8. 天超级计算机,2、天啦,古老的超级计算机!
  9. 画出清明上河图的代码_怎样用一串代码画出《清明上河图》?
  10. 基于swiper的移动端H5页面,丰富的动画效果
  11. PHP 递归算法操作文件编程
  12. 域名转入Godaddy教程
  13. mac忘了密码怎么办_如果忘记Mac密码该怎么办
  14. 和平精英服务器维护怎么办,和平精英登陆不了怎么办 和平精英无法登陆解决方法...
  15. wms仓库管理系统带来的效益
  16. 【前端CSS】offsetLeft,Left,clientLeft的区别
  17. 2021恒生电子面经(校招实习)
  18. TPESD0502S4SOT-143工作电压5V用于高速线路保护的2线ESD保护二极管阵列管TPESD0502S4 USB端口和以太网端口保护TVS二极管阵列,低泄漏电流和箝位电压25V结电容1PF
  19. 一篇文章构建你的 NodeJS 知识体系
  20. CSS入门(人物简历案例)

热门文章

  1. 【三】-硬件木马的分类
  2. ROCKEY4 Emulator 最後修改版
  3. lpv4的地址格式由多少个字节组成_2020年智慧树艺术品拍卖第八单元章节测试答案...
  4. php 操作word模板,phpword替换模板内容和解决中文乱码
  5. 跟我学XML (02)全网最简洁XML教程
  6. 培训day02(修改xml)
  7. 富士施乐Fuji Xerox Document Centre C450 驱动
  8. 没有契合的数据库迁移工具,用pymysql实现一个
  9. VB、WIN32API函数在串口操作模块的运用
  10. c语言大作业酒店管理系统,用C语言编写的酒店管理系统