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

  • 时间:
  • 浏览:4

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

1 MACD指标的计算法律法律办法

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

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

    具体的计算过程是,首先算出快速移动平均线(EMA1)和慢速移动平均线(EMA2),用这有一2个 数值来测量两者间的差离值(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    # 第一有一2个

参数是数据,第2个参数是周期
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法律法律办法中,根据第2个参数term,计算快速(周期是12天)和慢速(周期是26天)的EMA值。

    具体步骤是,通过第9行的for循环,遍历由第一有一2个 参数指定的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行,用这有一2个 值计算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元素中的第一有一2个

值上放去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的法律法律办法,第一有一2个

参数是数据,第2个参数是周期
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元素中的第一有一2个

值上放去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行,第2个子图的名字设置为“axMACD”,在第44行中通过linestyle设置了网格线的样式。

45   # 就说

就说

就说

刚开始

绘制第2个子图
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   # 设置第2个子图中的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这有一2个 指标会频繁地出現金叉和死叉的情况报告,这时肯能那末形成趋势,因此金叉和死叉的指导意义从不明显。

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

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

    因此,在实际使用中,投资者才能用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    # 第一有一2个

参数是数据,第2个参数是周期
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元素中的第一有一2个

值上放去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条件搞笑的话中制定了第一有一2个 规则,前一有一2个 交易日的DIF小于DEA,因此当天DIF大于DEA,即出現上穿金叉的大问题。在第41行的if条件搞笑的话中制定了第2个规则,即出現金叉的当日,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有一2个 法律法律办法和CalBuyPointByMACD.py范例系统线程池池中的代码完整篇 一致,什么都有本节仅仅是给出了哪些地方地法律办法律法律办法的定义,不再重复讲述了。

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

    具体的步骤是,通过第17行的if条件搞笑的话排除了误差比较大的数据,就说 通过第20行的if搞笑的话判断当天与非 出現了DIF死叉的情况报告,即前一有一2个 交易日的DIF比DEA大,但当前交易日DIF比DEA小。

    当满足这种条件时,再通过第22行的if搞笑的话判断当天的Bar柱数值与非 小于就说 的,即判断Bar柱与非 在向下运动。当满足这有一2个 条件时,通过第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。

    

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

    本文可转载,但请标明出处,一并请全文转载,别根据自身才能 在转载时恶意完整篇 本文