繁簡切換您正在訪問的是FX168財經網,本網站所提供的內容及信息均遵守中華人民共和國香港特別行政區當地法律法規。

FX168财经网>人物频道>帖子

matplotlib图形化之MACD、MA趋势交叉研究

作者/fjsdjfs 2019-05-10 02:14 0 来源: FX168财经网人物频道

计划研究一下各种信号的择时情况,结合回测

import talib as tl
from datetime import datetime
import jqdata
import pandas as pd
import matplotlib.finance as mpf
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
#公用函数
def get_data(stock,end_date,count):

    # 上一个交易日
    date = list(jqdata.get_trade_days(end_date=end_date,count=2))[0]
    
    # 股票行情数据, 要计算60日均线,取62日
    df = get_price(stock, end_date=date, frequency='daily', \
                   fields=['open','high','low','close','volume'], \
                   skip_paused=True, count= count + 62 )
    

    # 计算均线
    df['ma5'] = pd.Series(tl.MA(df['close'].values,5),index=df.index.values)
    df['ma10'] = pd.Series(tl.MA(df['close'].values,10),index=df.index.values)
    df['ma20'] = pd.Series(tl.MA(df['close'].values,20),index=df.index.values)
    df['ma60'] = pd.Series(tl.MA(df['close'].values,60),index=df.index.values)

    # MACD指标
    diff,dea,macd = tl.MACD(df['close'].values)

    df['diff'] = pd.Series(diff,index=df.index.values)
    df['dea'] = pd.Series(dea,index=df.index.values)
    df['macd'] = pd.Series(macd*2.0,index=df.index.values)
    
    
    # 截取最近 count 天的数据
    df = df.iloc[0-count:]
    t = range(count)

    df['t'] = pd.Series(t,index=df.index)
    df = df.set_index('t')
    
    return df


# 显示K线和均线
def show_k_ma( ax, df ):
    
    ##################################################################
    # 绘制K线 & 绘制均线
    ##################################################################

    ax.set_xlim(0,days)
    #ax1.set_axis_off()
    ax.xaxis.set_major_locator(plt.NullLocator())
    ax.yaxis.set_major_locator(plt.NullLocator())

    # 计算 quotes
    t = range( len( df ) )
    
    o = list(df['open'].values)
    h = list(df['high'].values)
    l = list(df['low'].values)
    c = list(df['close'].values)
    quotes = zip(t, o, h, l, c)
    
    # 画K线
    mpf.candlestick_ohlc(ax,quotes, width=0.5, colorup='r', colordown='g')

    # 画均线
    df[['ma5', 'ma10', 'ma20', 'ma60']].plot(ax=ax, legend=True)


# 显示卡线图上均线交叉
def show_k_ma_cross_ma( ax, df ):
    ma5 = df['ma5'].values
    ma10 = df['ma10'].values
    ma20 = df['ma20'].values

    # 均线交叉
    for i in range(4, len(ma5)):
        if ma10[i-1] < ma20[i-1] and ma10[i] > ma20[i]:
            # 10日线金叉20日线,用红圈标出金叉
            ax.scatter(i-1, ma10[i-1], color='', marker='o', edgecolors='r', s=300, linewidths=3)

        elif ma5[i-1] > ma10[i-1] and ma5[i] < ma10[i]:
            # 5日线死叉10日线,用绿圈标出死叉
            ax.scatter(i-1, ma5[i-1], color='', marker='o', edgecolors='g', s=300, linewidths=3)

# 显示K线图上MACD交叉(买入卖出标记)
def show_k_ma_cross_macd( ax, df ):
    # MACD柱状图
    macd =     df['macd'].values
    macdDIFF = df['diff'].values
    macdDEA =  df['dea'].values

    # MACD交叉标记
    for i in range(4, len(macd)):
        if macdDIFF[i-1] < macdDEA[i-1] and macdDIFF[i] > macdDEA[i]:
            # 用红圈标出金叉
            ax.scatter(i, df['low'].values[i]*0.99, color='', marker='^', edgecolors='r', s=500, linewidths=5)

        elif macdDIFF[i-1] > macdDEA[i-1] and macdDIFF[i] < macdDEA[i]:
            # 用绿圈标出死叉
            ax.scatter(i, df['high'].values[i]*1.01, color='', marker='v', edgecolors='g', s=500, linewidths=5)

# 显示 MACD图
def show_macd( ax, df ):
    macd =     df['macd'].values
    macdDIFF = df['diff'].values
    macdDEA =  df['dea'].values

    ##################################################################
    # 绘制MACD
    ##################################################################
    #ax.set_axis_off()
    ax.xaxis.set_major_locator(plt.NullLocator())
    ax.yaxis.set_major_locator(plt.NullLocator())

    ax.plot(df['diff'],'b')
    ax.plot(df['dea'],'y')
    

    t = range( len( df ) )
    for i in t:
        ax.bar(i, macd[i], color='r' if macd[i] > 0 else 'g')


def show_macd_cross( ax, df ):
    macd =     df['macd'].values
    macdDIFF = df['diff'].values
    macdDEA =  df['dea'].values
    
    for i in range(4, len(macd)):
        if macdDIFF[i-1] < macdDEA[i-1] and macdDIFF[i] > macdDEA[i]:
            # 用红圈标出金叉
            ax.scatter(i, macdDEA[i], color='', marker='^', edgecolors='r', s=300, linewidths=3)

        elif macdDIFF[i-1] > macdDEA[i-1] and macdDIFF[i] < macdDEA[i]:
            # 用绿圈标出死叉
            ax.scatter(i, macdDEA[i], color='', marker='v', edgecolors='g', s=300, linewidths=3)


# 显示成交量
def show_volume( ax, df ):
    #ax.set_axis_off()
    ax.xaxis.set_major_locator(plt.NullLocator())
    ax.yaxis.set_major_locator(plt.NullLocator())

    vv = df['volume'].values
    v = list(df['volume'].values)

    t = range( len( df ) )
    
    o = list(df['open'].values)
    h = list(df['high'].values)
    l = list(df['low'].values)
    c = list(df['close'].values)
    
    barlist = ax.bar(t,v, width=0.5)

    color = 'r'
    for i in t:
        if o[i]<c[i]:
            color = 'r'
        else:
            color = 'g'

        barlist[i].set_color(color)
# 初始化

stock='600276.XSHG'
days = 150
end_date = datetime.now().date()


#获取数据,包含了MA和MACD数据
df = get_data( stock=stock ,end_date=end_date,count=days)


# 准备画图
plt.close()
fig = plt.figure(figsize=(20, 20), dpi=80, frameon=False)

# K线画板
ax1 = plt.subplot2grid((6,1), (0,0), rowspan=3, colspan=1)
ax1.set_xlim(0,days+1)


#画 K 线和均线
show_k_ma( ax = ax1, df = df )

# MACD画板
ax2 = plt.subplot2grid((6,1), (3,0), rowspan=1, colspan=1, sharex=ax1) 
#ax2.set_xlim(0,days+1)


#画 MACD
show_macd( ax = ax2, df = df )

# 成交量画板
ax3 = plt.subplot2grid((6,1), (4,0), rowspan=1, colspan=1, sharex=ax1) 
#ax3.set_xlim(0,days+1)

#画 成交量
show_volume( ax = ax3, df = df )

#显示 MACD交叉
show_macd_cross( ax = ax2, df = df )
show_k_ma_cross_macd( ax = ax1, df = df )
show_k_ma_cross_ma( ax = ax1, df = df )
 
分享到:
举报财经168客户端下载

全部回复

0/140

投稿 您想发表你的观点和看法?

更多人气分析师

  • 张亦巧

    人气2144文章4145粉丝45

    暂无个人简介信息

  • 梁孟梵

    人气2152文章3177粉丝39

    qq:2294906466 了解群指导添加微信mfmacd

  • 指导老师

    人气1856文章4423粉丝52

    暂无个人简介信息

  • 李冉晴

    人气2296文章3821粉丝34

    李冉晴,专业现贷实盘分析师。

  • 刘钥钥1

    人气2016文章3119粉丝34

    专业从事现货黄金、现货白银模似实盘操作分析指导

  • 张迎妤

    人气1896文章3305粉丝34

    个人专注于行情技术分析,消息面解读剖析,给予您第一时间方向...

  • 金泰铬J

    人气2320文章3925粉丝51

    投资问答解咨询金泰铬V/信tgtg67即可获取每日的实时资讯、行情...

  • 金算盘

    人气2696文章7761粉丝125

    高级分析师,混过名校,厮杀于股市和期货、证券市场多年,专注...

  • 金帝财神

    人气4728文章8329粉丝118

    本文由资深分析师金帝财神微信:934295330,指导黄金,白银,...