同花顺Supermind量化交易 数据处理专题1-运用Scipy实现数据统计

130 阅读6分钟

python语言中numpy和pandas模块是处理数据的利器,除此之外,继续向大家介绍Scipy模块,这个模块专门运用于统计和优化技术,本文主要讲述Scipy模块在统计中的运用。

第二篇:运用Scipy模块实现统计技术

导语:python语言中numpy和pandas模块是处理数据的利器,除此之外,继续向大家介绍Scipy模块,这个模块专门运用于统计和优化技术,本文主要讲述Scipy模块在统计中的运用。

统计学基础知识

  开始之前,我们先导入Scipy模块

In [1]:

import numpy as np
import pandas as pd
import scipy.stats as stats

1.理解平均数和变异性

  平均数也叫做集中趋势量数,一般有三种形式:均值、中位数和众数。

平均数公式
均值(mean)数据组中所有数值的总和除以该组数值的个数
中位数(median)数据组中数据的中点。中位数对极值不敏感,均值对极值敏感。
众数(mode)数据组中出现数据最多的数值

  python实现:

In [2]:

#获取平安银行过去20个交易日的收盘价数据,形成一个列表。
x_list=list(get_price('000001.SZ', None, '20180125', '1d', ['close'], True, None, 20, is_panel=1)['close'].values)

print('平安银行过去20日收盘价均值:{}'.format(np.mean(x_list)))
print('平安银行过去20日收盘价中位数:{}'.format(np.median(x_list)))
print('平安银行过去20日收盘价众数:{}'.format(np.argmax(np.bincount(x_list))))
平安银行过去20日收盘价均值:13.8315
平安银行过去20日收盘价中位数:13.625
平安银行过去20日收盘价众数:13

  变异性反映数值之间的不同。平均数和变异性可共同描述数据分布的特征,并说明数据分布之间的差异。变异性的三种量数:极差、标准差、方差。用于反映一组数据的变异性、散布或者离散度。

  python实现

In [3]:

print('平安银行过去20日收盘价极差:{}'.format(np.max(x_list)-np.min(x_list)))
print('平安银行过去20日收盘价标准差:{}'.format(np.std(x_list)))
print('平安银行过去20日收盘价方差:{}'.format(np.var((x_list))))
平安银行过去20日收盘价极差:1.8399999999999999
平安银行过去20日收盘价标准差:0.602746007867327
平安银行过去20日收盘价方差:0.36330274999999984

2.检验数据是否服从假设的分布。最为常见的解决方案是采用K-S检验。

  单样本K-S检验的原假设是给定的数据来自和原假设分布相同的分布,在SciPy中提供了kstest函数,参数分别是数据、拟检验的分布名称和对应的参数。我们以上述平安银行数据为例。

In [4]:

stats.kstest(x_list, 'norm', (np.mean(x_list), np.std(x_list)))

Out[4]:

KstestResult(statistic=0.17976051493694484, pvalue=0.48934819583934308)

  从K-S检验结果看,数据符合正态分布。

  K-S检验结果查看技巧:一般pvalue > 0.05即为符合正态分布

3.在正态性的前提下,我们可进一步检验这组数据的均值是不是0。典型的方法是t检验,其中单样本的t检验函数为ttest_1samp。

In [5]:

stats.ttest_1samp(x_list, 0)

Out[5]:

Ttest_1sampResult(statistic=100.02573215027174, pvalue=2.4856090267508661e-27)

  从t检验看,数据的并均值不是0。

4.计算简单相关系数

  相关系数是反映两个变量之间关系的量化指标。这个统计值得值域范围是-1到1。含义是某一个变量发生变化时,另一个变量如何变化。如果变量变化方向相同,相关是正相关,反之,相关是负相关。ps:了解python实现过程即可。

  python实现:我们获取万科A的数据与平安银行的数据进行相关系数计算

In [28]:

#我们再获取万科的过去20日的收盘价数据
y_list=list(get_price('000002.SZ', None, '20180125', '1d', ['close'], True, None, 20, is_panel=1)['close'].values)

#计算相关系数
stats.pearsonr(x_list,y_list)[0]

Out[28]:

0.8276759436667197

5.方差分析(F检验)

  投资者总是希望通过自己明智的选股逻辑,来获取超额收益,那么如何证明选股对获取更高收益率是显著影响的呢?我们需要通过方差分析来检验。

  假设我们有4个策略,其中一个就是不选股,直接买指数,另外三个分别选择一只股票长期持有。

  第一步:计算出4个策略的每天净值变化。

  第二步:对4个策略的净值变化做方差分析。

  第三步:得到分析结果的p值,如果p<0.05,则选股对获取更高收益率有显著影响,反之,无显著影响。

In [30]:

from scipy.stats import f_oneway  

x1_list=get_price('000300.SH', None, '20180125', '1d', ['close'], False, 'pre', 252, is_panel=1)['close']
x1_list=(x1_list-x1_list.iloc[0])/x1_list
x2_list=get_price('002601.SZ', None, '20180125', '1d', ['close'], False, 'pre', 252, is_panel=1)['close']
x2_list=(x2_list-x2_list.iloc[0])/x2_list
x3_list=get_price('601006.SH', None, '20180125', '1d', ['close'], False, 'pre', 252, is_panel=1)['close']
x3_list=(x3_list-x3_list.iloc[0])/x3_list
x4_list=get_price('600216.SH', None, '20180125', '1d', ['close'], False, 'pre', 252, is_panel=1)['close']
x4_list=(x4_list-x4_list.iloc[0])/x4_list
args=[x1_list,x2_list,x3_list,x4_list]
f_oneway(*args) 

Out[30]:

F_onewayResult(statistic=390.98877592011445, pvalue=3.4512917737493422e-168)

  通过最后的p值结果,我们可以看到,选股对获取更高收益率有显著影响。

6.pearsonr相关系数检验

  大部分投资者都非常认可一个观点:“A股市场有明显的大小盘轮动现象”,那么我们是否可以通过pearsonr相关系数来检验呢?以沪深300指数和创业板指数为例。

  第一步:获取两者的收盘价,并计算成净值变化。

  第二步:进行pearsonr相关系数检验,首先判断P值,p值小于0.05,则说明两者呈线性关系;反之,不存在线性关系。其次如果R>0,则代表正相关;反之,负相关,且相关强度参照下表。

r值相关强度
0.8-1.0极强相关
0.6-0.8强相关
0.4-0.6中等相关
0.2-0.4弱相关
0.0-0.2极弱相关或者无相关

  python实现:

In [31]:

x1_list=get_price('000300.SH', None, '20180125', '1d', ['close'], False, 'pre', 252, is_panel=1)['close']
x1_list=list((x1_list-x1_list.iloc[0])/x1_list)
x2_list=get_price('399006.SZ', None, '20180125', '1d', ['close'], False, 'pre', 252, is_panel=1)['close']
x2_list=list((x2_list-x2_list.iloc[0])/x2_list)
stats.pearsonr(x1_list,x2_list) 

Out[31]:

(-0.29113778573749477, 2.5899115476937018e-06)

  从结果看,沪深300指数与创业板指数存在线性关系,呈负弱相关。

查看以上策略详情请到supermind量化交易官网查看:同花顺Supermind量化交易 数据处理专题1-运用Scipy实现数据统计