基于python的量化投资(二) ---- 获取量化数据

进行量化投资最基础的工作,就是获取量化的基础数据。有了基础数据,才能对数据进行加工处理,构建量化策略,进行量化分析,回测和回溯。

基于python进行量化投资的开发,获取数据的方式比较丰富,主要介绍以下三种,并给出相应代码:

1、从财经网站获取数据。pandas提供了从财经网站获取数据的接口,该接口目前在pandas的pandas_datareader模块中,独立于pandas模块,需要单独安装。用pip install pandas_datareader安装该模块。由于从专业财经网站(万德,东方财富)获取数据都需要付费,这里我们主要说明从免费财经网站获取数据的方法。下面是从yahoo财经网站获取002214股票,指定日期每天开盘价、收盘价、最高价、最低价数据的代码。程序中DataReader()和get_data_yahoo()都可以获取数据。返回数据格式为DataFrame,可以利用DataFrame的相关操作函数进行数据处理。

import numpy as np
import pandas as pd
import pandas_datareader as  pdr 
import pandas_datareader.data as  pdr_data 

start_date = '2020/03/16'
end_date =  '2020/04/08'
quotes=pdr.DataReader('002214.sz','yahoo',start_date,end_date)

#quotes=pdr.get_data_yahoo('002214.sz',start_date,end_date)

quotes.head()
print(quotes)
quotes.info()

由于国内对yahoo网站限制的原因,该接口获取数据不太稳定,有时候无法获取需要的数据。无法获取数据时,程序就会被挂起不能自动退出,需要在console中手工终止程序,并重启spyder内核。

此问题,通过安装yfinance模块来解决,不要再用fix-yahoo-finance模块。安装方式为pip install yfinance。修改后的代码如下:

import numpy as np
import pandas as pd
import datetime
import pandas_datareader as  pdr 
import pandas_datareader.data as  pdr_data 
import yfinance as yf

start_date = datetime.datetime(2020,4,1)
end_date =  datetime.datetime(2020,4,11)

yf.pdr_override()

quotes=pdr_data.get_data_yahoo('002214.sz',start_date,end_date)

quotes.head()
print(quotes)

个人感觉这个接口还是不太好用,速度比较慢,不稳定,有时候数据根本获取不了,在实际使用中无法满足应用需求。

 

2、从tushare获取数据。tushare是免费的金融大数据开放社区,网址https://tushare.pro/。用户在tushare网站上注册,并修改个人信息后,获取120积分,从网站获取tocken后即可免费使用网站的金融数据。tushare用户级别按积分区分,120积分的免费用户能访问的权限有限,只能访问日线级别的数据,用户可以通过增加积分来升级访问权限。使用tushare数据,需要安装tushare软件包,安装方法pip install tushare -i https://pypi.tuna.tsinghua.edu.cn/simple。使用pip install tushar会产生超时出错,指定国内的数据源,可以顺利安装完成。如果安装有问题,也可以下载安装。从tushare获取股票002214日线数据的代码如下,返回值为DataFrame类型。

import numpy as np
import pandas as pd
import tushare as ts

#设置tushare网站申请的tocken
ts.set_token("your tocken here")
pro = ts.pro_api()  

#利用tushare获取股票日线行情数据
df = pro.daily(ts_code='002214.SZ', start_date='20200316', end_date='20200408')
df.info()
print(df)
 

3、从量化平台获取数据。量化平台,是量化新手入门的有力工具,不仅可以获取数据,也可以进行策略的编辑,回测验证。

在此以业内应用最广泛的聚宽量化平台(https://www.joinquant.com/)为例说明获取股票数据的方法。聚宽量化平台提供的python量化包为JQDataSDK(在聚宽量化平台内部使用为JQData),在使用聚宽量化平台的数据前,要先在聚宽量化平台注册申请试用JQData的账号,试用期限为一年。然后安装JQDataSdk,安装命令为pip install --user  jqdatasdk。安装完成后,就可以用注册的用户名和密码使用聚宽数据了。从聚宽量化平台获取002214日线数据代码如下。

import numpy as np
import pandas as pd
from jqdatasdk import *

auth('###########','******')     #身份认证
start_date = '2020-3-16'
end_date =  '2020-4-8'
quotes = get_price('002214.XSHE',start_date,end_date,frequency='daily',skip_paused='true',fq='pre')
print(quotes)

 

4、数据展示。上面总结了常用的进行数据获取的三种常用方法,顺带说一下获取数据的图形化展示,只有把数据图形化展示出来,我们才能看到直观的效果。对于DataFrame类型数据,可以使用print语句,直接将结果打印出来,这在上面三种数据获取方法中已经使用过。进行图形化展示,要使用python的matplotlib模块,matplotlib库中有单独的finance模块进行金融数据的展示,该模块现在已经独立出来,名称为mpl_finance模块。可以在anaconda中使用pip install mpl_finance进行安装,安装后用import mpl_finance使用。从聚宽平台获取数据,并绘制日K线图的代码如下:

import datetime
import numpy as np
import pandas as pd

import matplotlib as mpl
import matplotlib.pyplot as plt       ## 导入画图模块
from matplotlib.pylab import date2num ## 导入日期到数值一一对应的转换工具
from dateutil.parser import parse     ## 导入转换到指定格式日期的工具
import mpl_finance as mpf             ## 导入 mpl_finance 模块
from jqdatasdk import *               ## 导入jqdata数据库


plt.rcParams['font.family'] = 'SimHei' ## 设置字体
fig, ax = plt.subplots()               ## 创建图片和座标轴
fig.subplots_adjust(bottom=0.2)        ## 调整底部距离

auth('###########','******')           ##聚宽平台进行身份认证

start_date = datetime.datetime(2020,3,16)
end_date =  datetime.datetime(2020,4,11)

quotes = get_price('002214.XSHE',start_date,end_date,frequency='daily',skip_paused='true',fq='pre')
print(quotes)

#绘制K线图
mpf.candlestick2_ochl(ax,quotes['open'],quotes['close'],quotes['high'],quotes['low'],width=1.0,colorup='r',colordown='green',alpha=1.0)
plt.show()

注意返回值得列名是大小写敏感的,quotes['open']写成quotes['Open']会报错。

从tushare获取数据后,数据是按照从最近日期到最早日期倒序排列的,所以如果要绘制K线图,需要将数据顺序颠倒后再绘制K线图,要不然绘制出来的K线图是反的。将数据顺序颠倒过来可以采用下面的两种方式之一:

df = pro.daily(ts_code='002214.SZ', start_date='20200316', end_date='20200409')
#将数据按照日期从前往后排列
df=df.reindex(index=df.index[::-1])  #使用reindex方法
print(df)

或者

df = pro.daily(ts_code='002214.SZ', start_date='20200316', end_date='20200409')
#将数据按照日期从前往后排列
df=df.iloc[::-1]                    #使用iloc方法
print(df)

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章