比较Python、R读取Tushare、Opendatatools和Akshare数据

本次选取的数据为古井贡酒在2000.01~2020.01的月度数据,股票代码为000596.sz。(ID:446541)

(1)基于Python获取Tushare数据

数据清洗过程:

获取数据时,选择性下载了股票的交易日期、成交量和收盘价。交易日期为字符串类型,收盘价和成交量为浮点数类型,无空值和缺失值。由于Tushare下载的数据时间从2020.01到2000.01,故分别对各列进行逆序处理,并重新命名为gujing_date、gujing_close、gujing_vol。

图 1: 收盘价和成交量的时间序列图

图 2: 收益率分布图

如上图,股票收盘价和交易量曾两度走高,但出现峰值的部分并不重叠,交易量的高峰均出现在收盘价上涨之前,当收盘价处于高峰时,成交量处于低位。从直方图来看,收益率近似正态分布。

表 1: 描述性统计结果

mean

var

std

skewness

kurtosis

close

34.8666

877.3698

29.6839

1.2759

0.9066

return

-0.0026

0.0248

0.1578

-1.2595

7.1778

T检验时,原假设为均值趋近于0,计算得t=-1.5723,P=1.8841>0.05,故接受原假设,样本的均值显著趋近于0。偏度检验时,原假设为偏度趋近于0,计算得t=-7.8658,P=2>0.05,故接受原假设,样本的偏度趋近于0。峰度检验时,原假设为样本峰度减3后趋近于0,计算得t=13.0450,P=0<0.05,故拒绝原假设,样本的超额峰度并不显著趋于0。在使用stats.skew()和stats.kurtosis()计算时,收益率的偏度和超额峰度均为nan,导致无法继续进行偏度和峰度检验,所以在撰写代码时,最好使用gujing_r.skew()和gujing_r.kurt()函数进行计算。

在正态性检验中,首先进行了JB检验,输出的结果均为nan,此时无法进行判定,之后,进行了W检验,原假设为样本服从正态分布,P=1>0.05,接受原假设,样本服从正态分布。查阅资料可知,由于stats.jarque_bera中应用到了stats.skew()和stats.kurtosis()函数,导致结果为nan。

import tushare as ts
import pandas as pd
import numpy as np
pro = ts.pro_api('23ddb2e6cc09200a7263537acb5a532dd76f443966c0b078ee53278d')

#数据清洗
gujing = pro.monthly(**{"ts_code": "000596.sz", "start_date": 20000101,"end_date": 20200101,}, fields=["trade_date","close","vol"])
gujing_date=gujing["trade_date"][::-1]
gujing_close=gujing["close"][::-1]
gujing_vol=gujing["vol"][::-1]
print(gujing.isnull().sum())
# print(any(gujing.isna()))
print(gujing.isna().sum())
# print(any(gujing.isna()))
print(gujing.info())

#绘制收盘价和成交量的时间序列图
import matplotlib.pyplot as plt
"""需修改x的数据"""
x =gujing_date
"""需修改y的数据"""
y1 =gujing_close
y2 =gujing_vol
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.plot(x, y1,label="close")
ax1.set_ylabel("close price")
ax1.legend(loc=(1.2,0.8))

ax2 = ax1.twinx() # this is the important function
ax2.plot(x, y2, "r",label="vol")
ax2.set_ylabel("volume")
ax2.set_xlabel("time")
ax2.legend(loc=(1.2,0.9))
ax2.set_xticks(np.arange(0, len(x),35))
ax2.set_xticklabels(x[::30], rotation=90, fontdict={'fontsize':10})
plt.grid(which='major', axis='x', linewidth=0.75, linestyle='-', color='0.75',dashes=(15, 10))
plt.grid(which='major', axis='y', linewidth=0.75, linestyle='-', color='0.75',dashes=(15, 10))
plt.show()

#绘制收益率分布图
gujing_close_diff=gujing_close.diff()
gujing_r=gujing_close_diff/gujing_close

fig2 = plt.figure()
plt.rcParams['axes.unicode_minus']=False#显示负号
n, bins, patches = plt.hist(x=gujing_r, bins='auto', color='#0504aa',alpha=0.7, rwidth=0.85)
plt.grid(axis='y', alpha=0.75)
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.title('gujing return')
maxfreq = n.max()
plt.ylim(2)
plt.show()

#数据分析
import scipy.stats as stats
print(gujing_close.describe())
print(gujing_vol.describe())
print(gujing_r.describe())
np.var(gujing_close)
stats.skew(gujing_close)
gujing_close.kurt()
np.var(gujing_vol)
stats.skew(gujing_vol)
gujing_vol.kurt()
np.var(gujing_r)
stats.skew(gujing_r)
gujing_r.kurt()

"""t检验"""
mean=np.mean(gujing_r)
var=np.var(gujing_r)
T=len(gujing_r)
t=(np.sqrt(T)*mean)/var
p=2*(1-stats.norm.cdf(t))
"""偏度检验"""
s=gujing_r.skew()
ts=s/np.sqrt(6/T)
p_ts=2*(1-stats.norm.cdf(ts))
"""峰度检验"""
k=gujing_r.kurt()
tk=(k-3)/np.sqrt(24/T)
p_tk=2*(1-stats.norm.cdf(tk))
"""正态性检验"""
stats.jarque_bera(gujing_r)
stats.shapiro(gujing_r)

(2)基于Python获取Akshare数据

数据清洗过程:

获取数据时直接下载了日度数据,首先对日度数据进行处理,日期为时间类型,其余均为浮点数类型,数据时间从1996.09~2022.06不需进行逆序处理,无缺失值、无空值。提取需要得数据并重新命名,将日期、成交量和收盘价分别命名为gujing1_date,gujing1_vol,gujing1_close。之后,为计算方便,运用日度收盘价计算对数日收益率,进而得到对数月收益率转化为百分比收益率,并截取2000.01~2020.01之间的部分。

图 3: 收盘价和成交量的时间序列图(日度数据)

图 4: 收益率时间序列图

图 5: 收益率分布图

如上图,股票收盘价和交易量得峰值的部分同样不重叠,交易量的高峰也均出现在收盘价上涨之前,当收盘价处于高峰时,成交量处于低位,与图1一致。从收益率时间序列图来看,其并不符合随机游走,呈现出小幅波动趋势。从直方图来看,比图2更近似正态分布。

表 2: 描述性统计结果

mean

var

std

skewness

kurtosis

close

49.7800

3438.0343

58.6396

2.13145

3.9069

return

0.0095

0.0234

0.1533

0.04017

3.1721

T检验时,原假设为均值趋近于0,计算得t= 6.2082,P= 5.3607e-10<0.05,故拒绝原假设,样本的均值不显著趋近于0。偏度检验时,原假设为偏度趋近于0,计算得t= 0.2508,P= 0.8019>0.05,故接受原假设,样本的偏度趋近于0。峰度检验时,原假设为样本峰度减3后趋近于0,计算得t= 0.5373,P= 0.5911>0.05,故接受原假设,样本的超额峰度显著趋于0。

在正态性检验中,首先进行了JB检验,原假设为样本服从正态分布,JB= 92.5047,P=0<0.05,拒绝原假设,说明样本不服从正态分布。之后,进行了W检验,W= 0.9603,P= 4.4586e-06<0.05,拒绝原假设,样本不服从正态分布。两者检验结果一致,与偏度检验和峰度检验得结果相吻合。

import akshare as ak
import pandas as pd
import numpy as np
gujing1= ak.stock_zh_a_daily(symbol="sz000596")
print(gujing1.isnull().sum())
print(gujing1.isna().sum())
print(gujing1.info())
gujing1_date=gujing1["date"]
gujing1_vol=gujing1["volume"]
gujing1_close=gujing1["close"]

logr=np.log(gujing1_close/gujing1_close.shift(1))[1:]
logr=pd.DataFrame(list(logr),index=gujing1_date[1:])
month=[]
index=logr.index
for i in range(0,np.size(logr)):
    month.append(''.join([index[i].strftime("%Y"),index[i].strftime("%m")]))
y=pd.DataFrame(logr.values,month,columns=["monthly"])
gujing1_r=y.groupby(y.index).sum()[39:273]

#绘制收益率得时间序列
plt.figure(1)
ax=plt.plot(gujing1_r,"b")

(3)基于Python获取Opendatatools数据

数据清洗过程:

获取数据时下载了日度数据,首先对日度数据进行处理,股票代码为字符串类型,日期为时间类型,成交量为整数类型,其余均为浮点数类型,数据时间从2000.01~2020.01不需进行逆序处理,无缺失值、无空值。提取需要得数据并重新命名,将日期、成交量和收盘价分别命名为gujing2_date,gujing2_vol,gujing2_close。之后,为计算方便,运用日度收盘价计算对数日收益率,进而得到月收益率,并转化为百分比收益率。

图 6: 收盘价和成交量的时间序列图(日度数据)

图 7: 收益率时间序列图

图 8: 收益率分布图

如上图,股票收盘价和交易量得峰值的部分并不重叠,与图1、图3一致。从收益率时间序列图来看,与图4一致也不符合随机游走,呈现出小幅波动趋势。从直方图来看,与图2相似,与图5不同,近似正态分布。

表 3: 描述性统计结果

mean

var

std

skewness

kurtosis

close

25.2744

722.8774

26.8893

1.6094

2.5032

return

0.0144

0.02054

0.1436

0.5663

2.0863

T检验时,原假设为均值趋近于0,计算得t=10.7620,P=0<0.05,故拒绝原假设,样本的均值不显著趋近于0。偏度检验时,原假设为偏度趋近于0,计算得t=3.5368,P=0.0004<0.05,故拒绝原假设,样本的偏度不趋近于0。峰度检验时,原假设为样本峰度减3后趋近于0,计算得t=-2.8532,P=1.9957>0.05,故接受原假设,样本的超额峰度显著趋于0。

在正态性检验中,首先进行了JB检验,原假设为样本服从正态分布,JB=51.9919,P=5.1298e-12<0.05,拒绝原假设,说明样本不服从正态分布。之后,进行了W检验,W= 0.9700,P=7.5192e-05<0.05,拒绝原假设,样本不服从正态分布。与上一数据的检验结果一致。

from opendatatools import stock
import pandas as pd
import numpy as np
gujing2=stock.get_daily("000596.SZ",start_date="2000-01-01",end_date="2020-01-01")
gujing2=pd.DataFrame(list(gujing2)[0])
print(gujing2.isnull().sum())
print(gujing2.isna().sum())
print(gujing2.info())
gujing2_date=gujing2["time"]
gujing2_vol=gujing2["volume"]
gujing2_close=gujing2["last"]

logr=np.log(gujing2_close/gujing2_close.shift(1))[1:]
logr=pd.DataFrame(list(logr),index=gujing2_date[1:])
month=[]
index=logr.index
for i in range(0,np.size(logr)):
    month.append(''.join([index[i].strftime("%Y"),index[i].strftime("%m")]))
y=pd.DataFrame(logr.values,month,columns=["monthly"])
gujing2_r=y.groupby(y.index).sum()

(4)R语言获取Tushare上的数据

数据清洗过程:

该数据共有11列、234行,其中2列数据为字符串类型(character),9列数据为数值类型(numeric),character类型每列数据n_missing=0,complete_rate=1,即无缺失值,完整度为1,empty=0,即无空值。Numeric类型每列数据n_missing=0,complete_rate=1,无缺失值。Tushare下载的数据列名可读性较高,清洗后几乎没有变化。Tushare下载的数据为2020.01~2000.01,需要逆序处理。

 图 9: 古井贡酒收盘价时间序列图

图 10: 古井贡酒收益率分布图

如上图,收盘价两次上涨,收益率分布近似正态分布。

收益率的描述性统计如下:

表 4: 收益率数据描述性统计

mean

var

std

skewness

kurtosis

-0.0025

0.0249

0.1578

-1.2433

6.9134

图 11: 收益率数据t检验结果

t检验时,原假设为均值趋于0,备择假设为均值不趋于0,P=0.8054>0.05,故接受原假设,均值显著趋于0。置信区间为[-0.0229,0.0178]。

偏度检验时,原假设为偏度趋于0,P=2>0.05,故接受原假设,偏度并显著趋于0。峰度检验时,原假设为峰度减3后趋于0,P=0<0.05,故拒绝原假设,峰度不趋近于3。

图 12: 收益率数据正态性检验结果(Shapiro检验)

图 13: 收益率数据正态性检验结果(JB检验)

正态性检验时,首先进行了W检验,原假设为数据服从正态分布,P=1.171e-9,拒绝原假设,样本并不符合正态分布,与偏度检验未通过相吻合。之后,进行了JB检验,P=2.2e-16,拒绝原假设,样本不符合正态分布。

library(Tushare)
library(skimr)
library(janitor)
library(xts)
library(fBasics)

api<-pro_api(token="23ddb2e6cc09200a7263537acb5a532dd76f443966c0b078ee53278d")
gujing<-api(api_name='monthly',ts_code='000596.sz',start_date='20000101',end_date='20200101')
gujing<-gujing[order(gujing[,2],decreasing=F),]
skim(gujing)
clean_names(gujing)

gujing_close<-gujing$close
gujing_close<-ts(gujing_close,frequency=12,start=c(2000,01))
jpeg("D:\\Financial data analysis\\gujing_close.jpeg", width=200*4, height=200*3)
plot(gujing_close,type="o",pch=16)
dev.off()
gujing_diff<-diff(gujing_close)
gujing_r<-gujing_diff/gujing_close
jpeg("D:\\Financial data analysis\\gujing_r_hist.jpeg", width=200*4, height=200*3)
hist(gujing_r,nclass=20)
dev.off()

mean<-mean(gujing_r)
var<-var(gujing_r)
std<-stdev(gujing_r)
s<-skewness(gujing_r)
k<-kurtosis(gujing_r)
t.test(gujing_r)
T<-length(gujing_r)
ts<-s/sqrt(6/T)
p_ts<-2*(1-pnorm(ts))
tk<-k/sqrt(24/T)
p_tk<-2*(1-pnorm(tk))
normalTest(gujing_r)
jarqueberaTest(gujing_r)

(5)R语言获取Akshare上的数据

数据清洗过程:

该数据共有11列、234行,其中2列数据为字符串类型(character),9列数据为数值类型(numeric),character类型每列数据n_missing=0,complete_rate=1,即无缺失值,完整度为1,empty=0,即无空值。Numeric类型每列数据n_missing=0,complete_rate=1,无缺失值。数据列名可读性较高,清洗后几乎没有变化。Akshare下载的数据1996.01~2022.06的日度数据,不需逆序处理,直接用R语言的monthlyReturn转换成月度收益率。

图 14: 古井贡酒收盘价时间序列图

图 15: 古井贡酒收益率分布图

如上图,收益率同样两次上涨,收益率分布图与图9不同,在0附近有两个峰值。

收益率的描述性统计如下:

表 5: 收益率数据描述性统计

mean

var

std

skewness

kurtosis

0.0214

0.0260

0.1612

1.1982

5.2046

 图 16: 收益率数据t检验结果

t检验时,原假设为均值趋于0,备择假设为均值不趋于0,P=0.04327<0.05,故拒绝原假设,均值不显著趋于0。置信区间为[0.0007,0.0422]。

偏度检验时,原假设为偏度趋于0,P=7.283063e-14<0.05,故拒绝原假设,偏度并不显著趋于0。峰度检验时,原假设为峰度减3后趋于0,P=0<0.05,故拒绝原假设,峰度不趋近于3。

图 17: 收益率数据正态性检验结果(Shapiro检验)

图 18: 收益率数据正态性检验结果(JB检验)

正态性检验时,首先进行了W检验,原假设为数据服从正态分布,P= 1.311e-09,拒绝原假设,样本并不符合正态分布,与偏度检验未通过相吻合。之后,进行了JB检验,P=2.2e-16,拒绝原假设,样本不符合正态分布。

library(lubridate)
library(skimr)
library(janitor)
library(quantmod)
library(fBasics)

gujing<-read.csv("D:\\Financial data analysis\\a.csv")
gujing_close<-xts(gujing[790:5427,6],order.by=as.Date(ymd(gujing[790:5427,2])))
gujing_r<-monthlyReturn(gujing_close)
skim(gujing)
clean_names(gujing)

表 6: 各种方式下收益率数据描述性统计

mean

var

std

skewness

kurtosis

Python+Tushare

-0.0026

0.0248

0.1578

-1.2595

7.1778

Python+Opendatatools

0.0095

0.0234

0.1533

0.04017

3.1721

Python+Akshare

0.0144

0.02054

0.1436

0.5663

2.0863

R+Tushare

-0.0025

0.0249

0.1578

-1.2433

6.9134

R+Akshare

0.0214

0.0260

0.1612

1.1982

5.2046

Tushare可以直接获取月度数据,但数据为逆序,需要调正。Opendatatools和Akshare只能获取日度数据,之后转化为月度数据,不同的转化方式会导致数据出现差异。如上图,Tushare上获取的数据无论用R还是Python处理结果比较接近。Opendatatools和Akshare在Python的处理中使用先计算对数日收益率,再转化为对数月收益率,进而计算百分比收益率,但两者的结果也存在一定偏差,不过相对于Tushare上获取的数据两者更加接近。Opendatatools和Akshare在R的处理中,直接用monthlyReturn进行处理,由于计算方法的不同,导致结果与Python中有较大差异。

表 7: 各种方式下检验结果

是否接受原假设

T检验

偏度检验

峰度检验

JB检验

W检验

Python+Tushare

接受

接受

不接受

\

\

Python+Opendatatools

不接受

接受

接受

不接受

不接受

Python+Akshare

不接受

不接受

接受

不接受

不接受

R+Tushare

接受

接受

不接受

不接受

不接受

R+Akshare

不接受

不接受

不接受

不接受

不接受

Tushare上获取的数据在Python和R的处理中结果比较一致,但在Python中出现输出值为nan的情况,无法准确判断正态性,Opendatatools和Akshare在Python和R的处理中,T检验和正态性结果比较一致,但偏度峰度结果不尽相同。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Python是一种功能强大的编程语言,可以用于多种用途,其中之一是web爬虫。tushare是一个专业的股票数据接口,可以提供各种市场数据,如股票、指数、基金、期货等等。 使用Pythontushare进行股票数据爬取非常简便。首先需要在Python中安装tushare库,然后import该库到Python环境中。 通过tushare库,可以调用它提供的不同方法,如get_h_data()获取历史股票数据,get_today_ticks()获取今天的交易明细信息,get_tick_data()获取分笔数据等等。 例如,如果要获取某股票的历史数据,可以使用如下代码: ```python import tushare as ts import pandas as pd # 设置股票代码和时间范围 code = '601318' start_date = '20210101' end_date = '20210630' # 调用tushare函数 df = ts.get_hist_data(code, start=start_date, end=end_date) # 查看数据 print(df.head()) ``` 这里获取的是中国平安(股票代码为601318)2021年1月1日至2021年6月30日的历史数据。获取的数据是一个pandas dataframe对象,可以使用各种数据处理和分析工具来操作和分析这些数据。例如,可以计算某个时间段内某个股票的均价、最大值、最小值等等,或者画出趋势图以及其他图表等等。 综上所述,通过tushare可以非常方便地获取股票数据,使用Python数据处理和分析工具,处理和分析这些数据,是进行量化投资和金融数据分析的重要工具。 ### 回答2: Python是一种广泛使用的编程语言,可用于各种项目和应用。其中,爬虫是Python的一项重要应用技能之一,它可以帮助我们收集和分析网络上的信息。Tushare是一种Python的股票数据API,可以帮助我们从股票市场上获取数据。 借助PythonTushare,我们可以编写一个简单的股票爬虫程序,获取股票市场上各种类型的数据。例如,我们可以获取股票实时信息、历史价格、股票基本面数据等等。具体来说,我们可以用Tushare获取股票历史价格数据,然后用Python进行分析和可视化,帮助我们更好地了解股票市场的趋势和变化。 使用PythonTushare进行股票数据爬取有很多优势。首先,Python是一种易于学习和使用的编程语言,具有很高的编程效率和灵活性。其次,Tushare是一个非常丰富和完整的股票数据API,可以帮助我们快速获取各种类型的数据。此外,PythonTushare的开源性和免费地使用,使得股票数据爬取成本极低。 总之,PythonTushare结合可以提供一个灵活、高效、低成本的解决方案,帮助爬虫程序员获取股票市场上各种类型的数据。这些数据可以是有助于投资决策的行业趋势和股票基本面数据,也可以是有助于交易行为的实时价格和历史价格数据

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值