开发平台

Anaconda Navigator (Anaconda3)

Jupyter

所用到库

import mplfinance as mpf
import tushare as ts
import pandas as pd
import numpy as np
import datetime
import talib as tb

Tushare获取股票数据

token='您的token'
ts.set_token(token)
pro=ts.pro_api()
  • Tushare大数据社区注册用户获得token来获取tushare权限。
  • 通过ts.pro_api()来调用tushare数据接口。
def get_stock(num):
    stock=num
    #设置查询时间————一个月
    today = datetime.datetime.today()
    startday=today+datetime.timedelta(days=-365)
    today = today.strftime('%Y%m%d')
    startday =startday.strftime('%Y%m%d')
    #获取股票数据
    stock_df = pro.daily(ts_code=stock, start_date=startday,end_date=today)
    #将trade_date转换为时间格式
    stock_df['trade_date'] = pd.to_datetime(stock_df['trade_date'])
    #倒序排列 iloc[::-1]
    stock_df=stock_df.iloc[::-1]
    #将列vol改为volume
    stock_df=stock_df.rename(columns={'vol':'volume'})
    #保存为csv文件,不保存索引
    stock_df.to_csv('%s.csv'%stock,index=False)
    #读取csv文件,将trade_date作为行索引
    stock_df=pd.read_csv('%s.csv'%stock,index_col=1)
    #将索引转为时间格式
    stock_df.index = pd.to_datetime(stock_df.index)
    return stock_df
  • stock=num 获取股票代码,这里num输入的形式必须是 股票代码.SZ/SH。SZ:深交所;SH:上交所
  • 设置查询时间节点,这里是查看今天起过去一年的数据。
  • 通过datetime.datetime.today()获取今天的时间,过去一年以today+datetime.timedelta(days=-365)方式获取。
  • 设置today和starday 日期以年月日显示形式——如20211201。
  • 获取股票数据,pro.daily(ts_code=stock, start_date=startday,end_date=today) 输入stock股票代码、start_date查询起始日期、end_date查询结束日期,获取日线行情,返回是一个DataFrame数据。
  • 对stock_df日线行情数据进行清洗与优化,这里操作分别是将列trade_date时转换为时间格式、让收据倒序排列、将列vol改名为volume(因为mplfinance.plot需要的一个参数列名为volume)。
  • 保存为csv文件后再重新读取文件(可以不操作这步,我这边是为了留存线下数据)。
  • 封装成函数get_stock(num),返回stock数据。
stock_df = get_stock('000543.SZ')
stock_df.head()
  • 获取股票代码信息,下图为返回数据

 用Talib计算相关技术指标

MACD

#MACD
macd, macdsignal, macdhist = tb.MACD(stock_df['close'], fastperiod=12, slowperiod=26, signalperiod=9)
macd=pd.DataFrame(macd,columns=['0'])
macdsignal=pd.DataFrame(macdsignal,columns=['0'])
macdhist=pd.DataFrame(macdhist,columns=['0'])
  • 调用Talib的MACD函数,以股票每天收盘价 列close 为计算依据,设置的参数是12、26、9,返回三个数据分别是macd、macdsignal、macdhist。
  • 把macd、macdsignal、macdhist转为DataFrame。
  • 在此解析一下MACD的理论:

MACD在应用上应先行计算出快速(一般选12日)移动平均值与慢速(一般选26日)移动平均值。以这两个数值作为测量两者(快速与慢速线)间的“差离值”依据。所谓“差离值”(DIF),即12日EMA数值减去26日EMA数值。因此,在持续的涨势中,12日EMA在26日EMA之上。其间的正差离值(+DIF)会愈来愈大。反之在跌势中,差离值可能变负(-DIF),此时是绝对值愈来愈大。至于行情开始回转,正或负差离值要缩小到一定的程度,才真正是行情反转的信号。MACD的反转信号界定为“差离值”的9日移动平均值(9日DIF)。

KDJ

#KDJ

slowk, slowd =tb.STOCH(stock_df['high'], stock_df['low'],stock_df['close'], fastk_period=9, slowk_period=3, slowk_matype=0, slowd_period=3, slowd_matype=0)
slowk=pd.DataFrame(slowk,columns=['0'])
slowd=pd.DataFrame(slowd,columns=['0'])
slowj=3*slowk['0'] -2*slowd['0']
slowj=pd.DataFrame(slowj,columns=['0'])

  • 调用Talib的STOCH函数,以股票每天最高价(列high)、最低价(列low)、收盘价(列close)  为计算依据,设置的参数是9、3、0、3、0,返回两个数据分别是slowk、slowd
  • 把slowk、slowdt转为DataFrame。
  • 计算slowj(即J线)公式是3K-2D,所得结果转为DataFrame。
  • 在此解析一下KDJ的理论:

随机指标KDJ一般是用于股票分析的统计体系,根据统计学原理,通过一个特定的周期(常为9日、9周等)内出现过的最高价、最低价及最后一个计算周期的收盘价及这三者之间的比例关系,来计算最后一个计算周期的未成熟随机值RSV,然后根据平滑移动平均线的方法来计算K值、D值与J值,并绘成曲线图来研判股票走势。

RSI

#RSI
rsi=tb.RSI(stock_df.open, timeperiod=12) 
rsi=pd.DataFrame(rsi_df,columns=['0'])
  • 调用Talib的RSI函数,以股票每天开盘价(列open)为计算依据,设置的参数是12,返回数据分别是rsi。
  • 把rsi转为DataFrame。
  • 在此解析一下RSI的理论:

相对强弱指标RSI是根据一定时期内上涨点数和下跌点数之和的比率制作出的一种技术曲线。能够反映出市场在一定时期内的景气程度。

使用Mplfinance画出图表 

#设置mplfinance的蜡烛颜色
#up为阳线颜色
#down为阴线颜色
my_color = mpf.make_marketcolors(
    up='darkslateblue',
    down='limegreen',
    edge='inherit',
    wick='inherit',
    volume='inherit'
)

# 设置图形风格
# figcolor:设置图表的背景色
# y_on_right:设置y轴位置是否在右
# gridaxis:设置网格线位置
# gridstyle:设置网格线线型
# gridcolor:设置网格线颜色
my_style = mpf.make_mpf_style(
    marketcolors=my_color,
    figcolor='#EEEEEE',
    y_on_right=False,
    gridaxis='both', 
    gridstyle='-.',
    gridcolor='#E1E1E1'
)

# 设置基本参数
# type:绘制图形的类型,有candle, renko, ohlc, line等
# 此处选择candle,即K线图
# mav(moving average):均线类型,此处设置5,10,30日线
# volume:布尔类型,设置是否显示成交量,默认False
# title:设置标题
# y_label:设置纵轴主标题
# y_label_lower:设置成交量图一栏的标题
# figratio:设置图形纵横比
# figscale:设置图形尺寸(数值越大图像质量越高)
#datetime_format:设置日期显示格式
#xrotation:设置x坐标的转角度
kwargs = dict(
    type='candle', 
    mav=(5,10,30), 
    volume=True, 
    title='%s'%(stock_df.iloc[0,0]),    
    ylabel='Price', 
    ylabel_lower='Volume', 
    figratio=(1200/72,480/60), 
    figscale=3,
    datetime_format='%Y-%m-%d',
    xrotation=0
)
  • 初始化图表样式,建议使用kwargs字典传参。
#设置配图
add_plot = [
    mpf.make_addplot(macdhist.tail(60),type='bar',panel=2,ylabel='MACD',color='darkslateblue'),
    mpf.make_addplot(macd.tail(60),panel=2,color='orangered'),
    mpf.make_addplot(macdsignal.tail(60),panel=2,color='limegreen'),
    mpf.make_addplot(rsi.tail(60),panel=3,ylabel='RSI'),
    mpf.make_addplot(slowk.tail(60),panel=4,color='darkslateblue',ylabel='KDJ'),
    mpf.make_addplot(slowd.tail(60),panel=4,color='limegreen'),
    mpf.make_addplot(slowj.tail(60),panel=4,color='orangered')
]
  • mplfinance需要添加曲线需要调用函数make_addplot设置附加图表数据,通过panel分配曲线所在不同的区域,默认K线条是panel0、成交量图是panel1,紧接MACD是panel2,RSI是panel3,KDJ是panel4。 

mpf.plot(stock_df.tail(60),**kwargs,addplot=add_plot,style=my_style)
  • 画出主图,效果如下。

 

  •  这里使用的配色是EVA初号机的配色,各位也可以根据自己喜好设置配色。
  • Jupyter默认是显示静态图,如果想显示动态图,可以加 %matplotlib qt5 这句代码。

完整代码

import mplfinance as mpf
import tushare as ts
import pandas as pd
import numpy as np
import datetime
import talib as tb

%matplotlib qt5

token='您的token'
ts.set_token(token)
pro=ts.pro_api()

def get_stock(num):
    stock=num
    #设置查询时间————一个月
    today = datetime.datetime.today()
    startday=today+datetime.timedelta(days=-365)
    today = today.strftime('%Y%m%d')
    startday =startday.strftime('%Y%m%d')
    #获取股票数据
    stock_df = pro.daily(ts_code=stock, start_date=startday,end_date=today)
    #将trade_date转换为时间格式
    stock_df['trade_date'] = pd.to_datetime(stock_df['trade_date'])
    #倒序排列 iloc[::-1]
    stock_df=stock_df.iloc[::-1]
    #将列vol改为volume
    stock_df=stock_df.rename(columns={'vol':'volume'})
    #保存为csv文件,不保存索引
    stock_df.to_csv('%s.csv'%stock,index=False)
    #读取csv文件,将trade_date作为行索引
    stock_df=pd.read_csv('%s.csv'%stock,index_col=1)
    #将索引转为时间格式
    stock_df.index = pd.to_datetime(stock_df.index)
    return stock_df

stock_df = get_stock('000543.SZ')

#设置mplfinance的蜡烛颜色
#up为阳线颜色
#down为阴线颜色
my_color = mpf.make_marketcolors(
    up='darkslateblue',
    down='limegreen',
    edge='inherit',
    wick='inherit',
    volume='inherit'
)

# 设置图形风格
# figcolor:设置图表的背景色
# y_on_right:设置y轴位置是否在右
# gridaxis:设置网格线位置
# gridstyle:设置网格线线型
# gridcolor:设置网格线颜色
my_style = mpf.make_mpf_style(
    marketcolors=my_color,
    figcolor='#EEEEEE',
    y_on_right=False,
    gridaxis='both', 
    gridstyle='-.',
    gridcolor='#E1E1E1'
)

# 设置基本参数
# type:绘制图形的类型,有candle, renko, ohlc, line等
# 此处选择candle,即K线图
# mav(moving average):均线类型,此处设置5,10,30日线
# volume:布尔类型,设置是否显示成交量,默认False
# title:设置标题
# y_label:设置纵轴主标题
# y_label_lower:设置成交量图一栏的标题
# figratio:设置图形纵横比
# figscale:设置图形尺寸(数值越大图像质量越高)
#datetime_format:设置日期显示格式
#xrotation:设置x坐标的转角度
kwargs = dict(
    type='candle', 
    mav=(5,10,30), 
    volume=True, 
    title='%s'%(stock_df.iloc[0,0]),    
    ylabel='Price', 
    ylabel_lower='Volume', 
    figratio=(1200/72,480/60), 
    figscale=3,
    datetime_format='%Y-%m-%d',
    xrotation=0
)


#RSI
rsi=tb.RSI(stock_df.open, timeperiod=12) 
rsi=pd.DataFrame(rsi_df,columns=['0'])

#MACD
macd, macdsignal, macdhist = tb.MACD(stock_df['close'], fastperiod=12, slowperiod=26, signalperiod=9)
macd=pd.DataFrame(macd,columns=['0'])
macdsignal=pd.DataFrame(macdsignal,columns=['0'])
macdhist=pd.DataFrame(macdhist,columns=['0'])

#KDJ

slowk, slowd =tb.STOCH(stock_df['high'], stock_df['low'],stock_df['close'], fastk_period=9, slowk_period=3, slowk_matype=0, slowd_period=3, slowd_matype=0)
slowk=pd.DataFrame(slowk,columns=['0'])
slowd=pd.DataFrame(slowd,columns=['0'])
slowj=3*slowk['0'] -2*slowd['0']
slowj=pd.DataFrame(slowj,columns=['0'])

#设置配图
add_plot = [
    mpf.make_addplot(macdhist.tail(60),type='bar',panel=2,ylabel='MACD',color='darkslateblue'),
    mpf.make_addplot(macd.tail(60),panel=2,color='orangered'),
    mpf.make_addplot(macdsignal.tail(60),panel=2,color='limegreen'),
    mpf.make_addplot(rsi.tail(60),panel=3,ylabel='RSI'),
    mpf.make_addplot(slowk.tail(60),panel=4,color='darkslateblue',ylabel='KDJ'),
    mpf.make_addplot(slowd.tail(60),panel=4,color='limegreen'),
    mpf.make_addplot(slowj.tail(60),panel=4,color='orangered')
]


mpf.plot(stock_df.tail(60),**kwargs,addplot=add_plot,style=my_style)

附matplotlib配色表matplotlib颜色表 - FINTHON

创作不易,码代码也不易,感谢鼓励!!

Logo

加入社区!打开量化的大门,首批课程上线啦!

更多推荐