股票量化交易学习第一篇之基础库搭建
1、写在前面
从本文开始准备写写关于股票量化交易的连载博客,重点记录自己对于量化交易平台实现的学习路径,针对一些重点第三方库以及重点知识做个备忘录。
我要实现的量化交易框架只是一个针对金融数据获取、清洗、整合及一些量化策略的实现、回测等功能,并不会实现股票真实的程序化交易功能,所有在实现量化交易框架必须先掌握一些第三方库的知识,这里给出涉及到的相关库,需要提前安装并对库的使用知识提前储备.
1.1、Numpy库的安装
NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
可以通过安装Anaconda3来实现NumPy、Pandas等基础库的安装,也可以使用下面命令安装Numpy:
pip3 install numpy scipy matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple
默认情况使用国外线路,国外太慢,我们使用清华的镜像。
关于Numpy的教程可以单击《Numpy教程》链接进行学习。
1.2、Pandas库的安装
Pandas 是 Python 的核心数据分析支持库,提供了快速、灵活、明确的数据结构,旨在简单、直观地处理关系型、标记型数据。Pandas 的目标是成为 Python 数据分析实践与实战的必备高级工具,其长远目标是成为最强大、最灵活、可以支持任何语言的开源数据分析工具。
同样Pandas可以通过安装Anaconda3来实现统一安装,如果需要单独安装可以使用下面的命令:
- 使用conda安装
conda install Pandas
如果要安装指定版本的pandas使用下面命令
conda install Pandas=0.20.3
- 使用pip安装
pip3 install Pandas
1.3、金融数据获取
股市金融数据获取我主要通过两个平台,一个是tushare,一个是聚宽,两个平台都可以注册后免费使用,国泰君安的量化交易库也是使用的聚宽平台的jqdata库,有兴趣可以搜索了解一下,如果有交易账号的话可以自己直接实现程序化交易的部分。
pip3 install tushare
注意该平台现有新旧两个接口文档,新接口将一些功能从旧接口中迁移了,使用时要注意看文档。
新接口文档链接
导入包方式
import tushare as ts
pip3 install jqdatasdk
或者下面的,速度能快点:
pip3 install jqdatasdk -i https://mirrors.aliyun.com/pypi/simple/
升级:
pip3 install -U jqdatasdk
导入jqdatasdk包方式
import jqdatasdk as jq
1.4、talib金融库的安装及文档链接
TA-Lib,全称“Technical Analysis Library”, 即技术分析库,是Python金融量化的高级库,涵盖了150多种股票、期货交易软件中常用的技术分析指标,如MACD、RSI、KDJ、动量指标、布林带等等。TA-Lib可分为10个子板块:Overlap Studies(重叠指标),Momentum Indicators(动量指标),Volume Indicators(交易量指标),Cycle Indicators(周期指标),Price Transform(价格变换),Volatility Indicators(波动率指标),Pattern Recognition(模式识别),Statistic Functions(统计函数),Math Transform(数学变换)和Math Operators(数学运算),见下图。
安装与使用
安装:在cmd上使用“pip install talib”命令一般会报错,正确安装方法是,进入https://www.lfd.uci.edu/~gohlke/pythonlibs/,下拉选择TA_Lib-0.4.19-cp38-cp38-win_amd64.whl(win系统64位,python3.8版本,根据自己系统和python版本选择相应的安装包),将下载包放在某一路径中,然后在Anaconda Prompt(或windows的cmd)里面输入命令:
pip install [文件全路径名]
安装效果(TA_Lib-0.4.19-cp38-cp38-win_amd64.whl文件放在C:\Users\ml\Desktop\Python路径下)
安装后登录Python测试:
由于talib库没有中文文档,此处给出两个参考链接,深入学习还请自行搜索吧。链接一、链接二。
连接二是比较全的翻译文档。
1.5、Matplotlib 库安装及文档链接
Matplotlib 是 Python 的绘图库。 它可与 NumPy 一起使用,提供了一种有效的 MatLab 开源替代方案。
可以通过anaconda3进行安装也可以用下面方式:
pip3 install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple
使用镜像地址安装速度块。
学习文档链接。
2、股票技术指标分析
2.1、均线分析
均线是指股价在一定交易时间内的算术平均数的连线,反映了一段时间内持股者的平均成本价。例如5日均线,就是将最近的5个交易日的收盘价相加,再除以5,就是5日的算术平均数。
在talib中,移动平均线系列指标包括:SMA简单移动平均线、EMA指数移动平均线、WMA加权移动平均线、DEMA双移动平均线、TEMA三重指数移动平均线、TRIMA三角移动平均线、KAMA考夫曼自适应移动平均线、MAMA为MESA自适应移动平均线、T3三重指数移动平均线。
通用函数名:MA
调用代码:ta.MA(close,timeperiod=30,matype=0)
参数说明:
- close为收盘价numpy.ndarray类型或pandas.Series类型
- timeperiod平均数计算时间间隔,默认是30天,输入5,为5日平均数,以此类推。
-
matype平均线指标类型,默认值为SMA,如果输入数字则:0=SMA, 1=EMA, 2=WMA, 3=DEMA, 4=TEMA, 5=TRIMA, 6=KAMA, 7=MAMA, 8=T3;也可以使用talib中的MA_Type,导入后直接按MA_Type.SMA方式输入。
不同类型的移动均线也有各自相应的调用函数:
代码例子一:
import numpy as np
import talib as ta
from talib import MA_Type
import pandas as pd
close = np.array([1, 2, 3, 4, 5, 6], dtype='f8')
se = pd.Series(close, dtype='f8')
# 方法一使用通用函数MA计算5日算术均线,传入matype参数调用简单移动平均线
# 如果调用指数移动平均线则参数matype=MA_Type.EMA
# 第一个参数可以传入close,也可以传入se
output = ta.MA(se, timeperiod=5, matype=MA_Type.SMA)
print(output)
# 方法二 直接调用SMA函数,传入计算时间间隔计算5日均线
output = ta.SMA(se, timeperiod=5)
print(output)
输出结果:
移动平均线是技术分析理论中应用最普遍的指标之一,主要用于确认、跟踪和判断趋势,提示买入和卖出信号,在单边市场行情中可以较好的把握市场机会和规避风险。但是,移动平均线一般要与其他的技术指标或基本面相结合来使用,特别是当市场处于盘整行情时,其买入卖出信号会频繁出现,容易失真。
代码例子二:
计算跨境通2021-01-01至2021-01-20日之间股价的5日算术均线(简单易懂平均线)
使用聚宽平台获取股票数据。
import numpy as np
import talib as ta
from talib import MA_Type
import pandas as pd
import jqdatasdk as jq
# 聚宽平台权限验证
jq.auth('*******', '********')
# 聚宽平台获取股价
close = jq.get_price('002640.XSHE',
start_date='2021-01-01',
end_date='2021-01-20',
frequency='1d',
fq='pre')
# 方法一使用通用函数MA计算5日算术均线,传入matype参数0等同于MA_Type.SMA
close['5MA'] = ta.MA(close['close'], timeperiod=5, matype=0)
close['10MA'] = ta.MA(close['close'], timeperiod=10, matype=MA_Type.SMA)
# 由于日期间隔短,无法计算20日、30日、60日的均线
'''close['20MA'] = ta.MA(close['close'], timeperiod=20, matype=MA_Type.SMA)
close['30MA'] = ta.MA(close['close'], timeperiod=30, matype=MA_Type.SMA)
close['60MA'] = ta.MA(close['close'], timeperiod=60, matype=MA_Type.SMA)'''
print(close)
输出结果:
代码例子三:
将上个例子改进一下实现图形化输出
import numpy as np
import talib as ta
from talib import MA_Type
import pandas as pd
import jqdatasdk as jq
from matplotlib import pyplot as plt
from pylab import mpl
# 聚宽平台权限验证
jq.auth('******', '*******')
# 聚宽平台获取股价
close = jq.get_price('002640.XSHE',
start_date='2020-11-01',
end_date='2021-01-20',
frequency='1d',
fq='pre')
mpl.rcParams['font.sans-serif'] = [
'SimHei'
] # 使图形中的中文正常编码显示,其中,sans-serif 表示字体中的无衬线体,SimHe是黑体
mpl.rcParams['axes.unicode_minus'] = False # 使坐标轴刻度表签不显示正负号
types = ['SMA', 'EMA', 'WMA', 'DEMA', 'TEMA', 'TRIMA', 'KAMA', 'MAMA', 'T3']
for i in range(len(types)):
close[types[i]] = ta.MA(close['close'], timeperiod=5, matype=i)
#close.tail()
# 使用loc[]获取局部行和列的切片
'''
iloc:即index locate 用index索引进行定位,所以参数是整型,如:df.iloc[10:20,3:5]
loc:则可以使用column名和index名进行定位,如:df.loc['image1':'image10','age':'score']
df['col1']取得第一列或df[['col1','col2','col3']]获取三列
'''
# 使用DataFrame的plot方法绘制图像会按照数据的每一列绘制一条曲线
# figsize=(16, 6)图片尺寸大小16*6
close.loc['2020-12-16':,'SMA':].plot(figsize=(16, 6))
# 获取当前坐标轴
ax = plt.gca()
# 设置右侧框线无颜色(隐藏)
ax.spines['right'].set_color('none')
# 设置顶部框线无颜色(隐藏)
ax.spines['top'].set_color('none')
# 设置图形标题
plt.title('上证指数各种类型移动平均线',fontsize=15)
# 设置X轴标签文字为空
plt.xlabel('')
# plt.ylabel('y轴') # y轴标签文字设置
plt.show()
输出结果:
从输出结果来看,坐标轴不是从原点开始画的,进行代码修改一下
2.1.1、获取当前坐标轴
ax = plt.gca()
# spines是指坐标图四周的框
# 获取你想要挪动的坐标轴,这里只有顶部、底部、左、右四个方向参数
ax.xaxis.set_ticks_position('bottom') # 要挪动底部的X轴,所以先目光锁定底部!
# 在这里,position位置参数有三种,这里用到了“按Y轴刻度位置挪动”
# 'data'表示按数值挪动,其后数字代表挪动到Y轴的刻度值
ax.spines['bottom'].set_position(('data', 0))
默认情况下坐标系四周有边框,这个边框叫做spines,下图中红框选定的黑色线就叫做边框
这四个边框时可以使用颜色隐藏的,将颜色设置成无色就隐藏了
ax.spines['right'].set_color('none')
代码中没有使用matplotlib的 pyplot进行画图,而是用了pandas.DataFrame.plot( )方法进行了画图
plt画图方式
plt.figure(figsize = (5,5))
plt.plot() # 画个只有坐标系的图(因为没有传参数,所以显示空白)
pandas.DataFrame.plot( )简介
使用DataFrame的plot方法绘制图像会按照数据的每一列绘制一条曲线,默认按照列columns的名称在适当的位置展示图例,比matplotlib绘制节省时间,且DataFrame格式的数据更规范,方便向量化及计算。
DataFrame.plot( )函数:
DataFrame.plot(x=None, y=None, kind='line', ax=None, subplots=False,
sharex=None, sharey=False, layout=None, figsize=None,
use_index=True, title=None, grid=None, legend=True,
style=None, logx=False, logy=False, loglog=False,
xticks=None, yticks=None, xlim=None, ylim=None, rot=None,
fontsize=None, colormap=None, position=0.5, table=False, yerr=None,
xerr=None, stacked=True/False, sort_columns=False,
secondary_y=False, mark_right=True, **kwds)
注意:每种绘图类型都有相对应的方法
df.plot(kind=‘line’)与df.plot.line()等价
参数介绍
-
x : label or position, default None#指数据列的标签或位置参数
-
y : label, position or list of label, positions, default None
-
kind : str#绘图类型
‘line’ : line plot (default)#折线图
‘bar’ : vertical bar plot#条形图。stacked为True时为堆叠的柱状图
‘barh’ : horizontal bar plot#横向条形图
‘hist’ : histogram#直方图(数值频率分布)
‘box’ : boxplot#箱型图
‘kde’ : Kernel Density Estimation plot#密度图,主要对柱状图添加Kernel 概率密度线
‘density’ : same as ‘kde’
‘area’ : area plot#与x轴所围区域图(面积图)。Stacked=True时,每列必须全部为正或负值,stacked=False时,对数据没有要求
‘pie’ : pie plot#饼图。数值必须为正值,需指定Y轴或者subplots=True
‘scatter’ : scatter plot#散点图。需指定X轴Y轴
‘hexbin’ : hexbin plot#蜂巢图。需指定X轴Y轴
ax : matplotlib axes object, default None#子图(axes, 也可以理解成坐标轴) 要在其上进行绘制的matplotlib subplot对象。如果没有设置,则使用当前matplotlib subplot其中,变量和函数通过改变figure和axes中的元素(例如:title,label,点和线等等)一起描述figure和axes,也就是在画布上绘图。 -
subplots : boolean, default False#是否对列分别作子图
-
sharex : boolean, default True if ax is None else False#如果ax为None,则默认为True,否则为False
-
sharey : boolean, default False#如果有子图,子图共y轴刻度,标签
-
figsize : a tuple (width, height) in inches#图片尺寸大小
-
use_index : boolean, default True#默认用索引做x轴
-
title : string#图片的标题用字符串
以上是摘录的一些参数介绍,具体关于函数的内容可以点击链接参考一下别人的总结。
2.2、MACD平滑异同移动平均线
函数名:MACD
名称:平滑异同移动平均线
简介:利用收盘价的短期(常用为12日)指数移动平均线与长期(常用为26日)指数移动平均线之间的聚合与分离状况,对买进、卖出时机作出研判的技术指标
函数调用方式:
macd, macdsignal, macdhist = MACD(close, fastperiod=12, slowperiod=26, signalperiod=9)
MACD是DIFF线,它的反应会比较快。
MACDsinal是DEA线,它的反应会比较慢。
而MACDhist是x坐标轴上的柱子。
例子一
import numpy as np
import talib as ta
from talib import MA_Type
import pandas as pd
import jqdatasdk as jq
from matplotlib import pyplot as plt
from pylab import mpl
# 聚宽平台权限验证
jq.auth('19935162681', 'ByKy19935162681')
# 聚宽平台获取股价
close = jq.get_price('601899.XSHG',
start_date='2020-10-14',
end_date='2021-01-20',
frequency='1d',
fq='pre')
# macd为DIFF线,macdsignal为DEA线,macdhist为MACD柱状线
macd, macdsignal, macdhist = ta.MACD(close["close"],
fastperiod=12,
slowperiod=26,
signalperiod=9)
close['DIFF'] = macd
close['DEA'] = macdsignal
close['hists'] = macdhist
# 画线,由于三条线是两种类型,需要单画
df=close.loc['2020-11-30':'2021-01-21', 'DIFF':]
with pd.plotting.plot_params.use('x_compat', True): #方法一
df.DIFF.plot(figsize=(16, 6))
df.DEA.plot()
#df.hists.plot.bar(width=0.1)
df.hists.plot()
print(df)
mpl.rcParams['font.sans-serif'] = [
'SimHei'
] # 使图形中的中文正常编码显示,其中,sans-serif 表示字体中的无衬线体,SimHe 是 黑体
ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
plt.title('MACD平滑异同移动平均线', fontsize=15)
plt.xlabel('')
plt.show()
输出结果: