分分pk10平台网址 _用matplotlib和pandas绘制股票MACD指标图,并验证化交易策略

  • 时间:
  • 浏览:1

    我的新书《基于股票大数据分析的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    # 第一另一另另一个参数是数据,第3个参数是周期
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方式中,根据第3个参数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:
80       # 打开数据库连接
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_800895")
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_800895表中的所有数据,如8.2节所述,两种数据表中的数据源自雅虎网站。

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

    执行到这里,已经 上加第45行打印一段话的注解,就能看到第一列输出的是字段名列表,已经 会按天输出与MACD有关的股票指标数据。

    在第46行调用了calMACD方式,并把结果赋值给stockDataFrame对象,已经 就都都要根据stockDataFrame对象中的值开始英语 英语 英文绘图。

47   # 开始英语

英语

英文绘图
48   plt.figure()
49   stockDataFrame['DEA'].plot(color="red",label='DEA')
80   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]
80   major_xtics=stockDataFrame['date'][stockDataFrame.index%10==0]
61   plt.xticks(major_index,major_xtics)
62   plt.setp(plt.gca().get_xticklabels(), rotation=80)
63   # 带网格线,且设置了网格样式
64   plt.grid(line)
65   plt.title("800895张江高科的MACD图")
66   plt.rcParams['axes.unicode_minus'] = False
67   plt.rcParams['font.sans-serif']=['SimHei']
68   plt.show()

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

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

    从第59行到第61行的程序一段话设置了x轴的标签,已经 显示每天的日期,只有x轴上的文字会过于密集,什么都在第59行和第80行进行相应的处理,只显示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的方式,第一另一另另一个参数是数据,第3个参数是周期
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_800895")
24   cols = cursor.description        # 返回列名
25   heads = []
26   # 依次把每个cols元素中的第一另一另另一个值放上去col数组
27   for index in cols:
28       heads.append(index[0])
29   result = cursor.fetchall()
80   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("800895张江高科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(line)     # 带网格线

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

45   # 开始英语

英语

英文绘制第3个子图
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   # 设置第3个子图中的MACD柱状图
80   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("800895张江高科MACD")   # 设置子图的标题
56   axMACD.grid(line)                # 带网格线
57   # xmajorLocator = MultipleLocator(10)    # 将x轴的主刻度设置为10的倍数
58   # axMACD.xaxis.set_major_locator(xmajorLocator)
59   major_xtics=stockDataFrame['date'][stockDataFrame.index%10==0]
80   axMACD.set_xticks(major_xtics)
61   # 旋转x轴显示文字的层厚
62   for xtick in axMACD.get_xticklabels():
63       xtick.set_rotation(80)
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行和第80行中设置了axMACD子图中的x轴标签,已经 在第35行中设置了axPrice和axMACD两子图是共享x轴,已经 K线和均线所在子图的x轴刻度会和MACD子图中的一样。已经 是在子图中,什么都都要通过第62行和第63行的for循环依次旋转x轴坐标的标签文字。

    在这段代码中嘴笨 给出了两种设置x轴标签的方式。已经 注释掉第59行和第80行的代码,并上加第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轴中间(即当前是红柱具体情况)。

    在两种范例程序中,用的是股票“金石资源(代码为803805)从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    # 第一另一另另一个参数是数据,第3个参数是周期
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
80	    stockDataFrame = calMACD(df, 12, 26, 9)
31	    return stockDataFrame

    第13行开始英语 英语 英文的getMACDByCode方式中中含了从数据表中获取的股票交易数据并返回MACD指标的代码, 这帕累托图程序代码与已经 DrawKwithMACD.py范例程序中的程序也非常累似 ,只不过在第21行中是根据股票代码来动态地拼接select一段话。该方式在第31行中返回中含MACD指标的stockDataFrame对象。

32	# print(getMACDByCode('803805')) 	# 可去除这条一段话的注解以确认数据
33	stockDf = getMACDByCode('803805')
34	cnt=0
35	while cnt<=len(stockDf)-1:
36	    if(cnt>=80):		# 前几天有误差,从第80天算起
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天的数据,从第80天算起。

    在第39行的if条件一段话中制定了第一另一另另一个规则,前一另一另另一个交易日的DIF小于DEA,已经 当天DIF大于DEA,即经常出现 上穿金叉的问題。在第41行的if条件一段话中制定了第3个规则,即经常出现 金叉的当日,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

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

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

表  基于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(经常出现 死叉),且柱状图向下运动(红柱缩小或绿柱变长)。下面通过股票“士兰微”(代码为800480)从2018年9月到2019年5月的交易数据来验证卖点。

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

    验证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('800480')
15   cnt=0
16   while cnt<=len(stockDf)-1:
17       if(cnt>=80):         # 前几天有误差,从第80天算起
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方式,获取了800480(士兰微)的交易数据,其中中含了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范例程序,把股票代码改为800480,把股票名称改成“士兰微”,运行后即可看到如图所示的结果图。

     图  股票“士兰微”的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。

    

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

    本文可转载,但请标明出处,一起去请全文转载,别根据自身都要在转载时恶意完全本文