Python实现股票量化交易学习进阶(一)之基础库(知识准备)搭建

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/

升级:

扫描二维码关注公众号,回复: 12212200 查看本文章
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()

输出结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/u011930054/article/details/112944314
今日推荐