本次选取的数据为古井贡酒在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数据
数据清洗过程:


本文对比了使用Python的Tushare、Opendatatools和Akshare库,以及R语言的Tushare和Akshare包获取古井贡酒股票数据的过程。数据清洗后,对收盘价、成交量及收益率进行了时间序列分析和描述性统计。结果显示,不同来源的数据在收盘价和成交量峰值匹配、收益率分布和趋势上存在一致性,但统计特性有所差异。Tushare和R语言处理Tushare数据的结果较为接近,而Opendatatools和Akshare数据在Python处理时需转化为月收益率,导致结果略有偏差。所有数据的收益率分布均偏离正态分布,且在正态性检验中未能通过。
1530

被折叠的 条评论
为什么被折叠?



