看 Python 量化金融投资,摘录的一些统计函数。为了以后更好的查找。
import numpy as np
import numpy.linalg as nlg
import scipy.stats as stats
import scipy.optimize as opt
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['font.sans-serif'] = ['FangSong'] # 设置中文
plt.rcParams['axes.unicode_minus'] = False # 设置中文负号
plt.style.use('bmh')
生成 n 个随机数 random variables rvs
连续型的随机数
rv_continuous.rvs(size=n)
uniform
norm
beta
离散型的随机数
rv.discrete.rvs(size=n)
bernoulli
geom
poisson
例:
stats.uniform.rvs(size=10)
array([0.90782979, 0.08204289, 0.82901539, 0.19884267, 0.50562515,
0.82687688, 0.1920613 , 0.23374013, 0.45629651, 0.32507933])
np.random.seed(seed=2020)
stats.beta.rvs(size=10,a=4,b=2)
array([0.40765989, 0.81432442, 0.81389925, 0.925416 , 0.77791256,
0.71965217, 0.76665344, 0.80133481, 0.72746346, 0.82444686])
np.random.seed(seed=2020)
beta = stats.beta(a=4,b=2)
beta.rvs(size=10)
array([0.40765989, 0.81432442, 0.81389925, 0.925416 , 0.77791256,
0.71965217, 0.76665344, 0.80133481, 0.72746346, 0.82444686])
kstest
# 创建模拟正态分布数据
data = stats.norm.rvs(size=200,loc=0.5,scale=2)
mu = np.mean(data)
sigma = np.std(data)
print(f'Mean: {mu:.2f}\n\
Median: {np.median(data):.2f}\n\
Standard Deviation: {sigma:.2f}')
plt.figure(figsize=(8,5))
sns.distplot(data)
plt.show()
Mean: 0.39
Median: 0.29
Standard Deviation: 1.99
# 使用 KS-test
stat_val, p_val = stats.kstest(data,'norm',(mu,sigma))
print(f'KS-statistic D = {stat_val:.4f}\n\
p-value = {p_val:.4f}')
KS-statistic D = 0.0502
p-value = 0.7065
ttest_1samp
单样本的 t 检验函数stat_val, p_val = stats.ttest_1samp(data, 0)
print(f'1-sample T_test -statistic D = {stat_val:.4f}\n\
p-value = {p_val:.4f}')
1-sample T_test -statistic D = 2.7951
p-value = 0.0057
P_value < 0.05
在给定显著性水平 0.05 的前提下,应拒绝原假设:数据的均值为 0。
其他 T test:
ttest_ind
: 独立样本的T检验,检验两个样本的均值差异,该检验方法假定了样本的通过了F检验,即两个独立样本的方差相同ttest_ind_from_stats
: 检验两个样本的均值差异(同上),输出的参数两个样本的统计量,包括均值,标准差,和样本大小ttest_rel
: 配对T检验,检测两个样本的均值差异,输入的参数是样本的向量再生成一组数据,尝试一下双样本 t 检验
data2 = stats.norm.rvs(size=100,loc=-.2,scale=1.2)
plt.figure(figsize=(8,5))
sns.distplot(data2)
plt.show()
stat_val, p_val = stats.ttest_ind(data,data2,equal_var=False)
print(f'2-sample T_test -statistic D = {stat_val:.4f}\n\
p-value = {p_val:.4f}')
2-sample T_test -statistic D = 3.5436
p-value = 0.0005
equal_var = False
。cdf
g_dist = stats.gamma(a=2)
print('分位数:[2,4,5] ')
g_dist.cdf([2,4,5])
分位数:[2,4,5]
array([0.59399415, 0.90842181, 0.95957232])
pdf
print('概率:[25%,50%,95%] ')
g_dist.cdf([0.25,0.5,0.95])
概率:[25%,50%,95%]
array([0.02649902, 0.09020401, 0.245855 ])
moment
stats.norm.moment(6,loc=0,scale=1)
15.000000000895332
describe
info = stats.describe(data)
print(f'总描述: {info}')
print(f'数据大小: {info[0]}')
print(f'最小值: {info[1][0]:.4f}')
print(f'最大值: {info[1][1]:.4f}')
print(f'平均值: {info[2]:.4f}')
print(f'方差: {info[3]:.4f}')
print(f'偏度: {info[4]:.4f}')
print(f'峰度: {info[5]:.4f}')
总描述: DescribeResult(nobs=200, minmax=(-4.522642873211459, 5.541935059612814), mean=0.3935187131823762, variance=3.964408344885493, skewness=0.1567664342974578, kurtosis=0.2158753158144524)
数据大小: 200
最小值: -4.5226
最大值: 5.5419
平均值: 0.3935
方差: 3.9644
偏度: 0.1568
峰度: 0.2159
fit
可以得到对应分布参数的极大似然估计。norm_dist_data = stats.norm.rvs(size=100,loc=0,scale=1.8)
'均值:{:.4f}, 方差:{:.4f}'.format(*stats.norm.fit(norm_dist_data))
'均值:0.0516, 方差:1.7697'
pearsonr
Pearson correlation coefficientspearmanr
Spearman correlation coefficientexp_dist_data = stats.expon.rvs(size=100)
print('Pearson -相关性:{:.4f}, P-value:{:.4f}'.format(*stats.pearsonr(norm_dist_data,exp_dist_data)))
print('Spearman-相关性:{:.4f}, P-value:{:.4f}'.format(*stats.spearmanr(norm_dist_data,exp_dist_data)))
Pearson -相关性:0.0643, P-value:0.5248
Spearman-相关性:-0.0026, P-value:0.9796
x = stats.chi2.rvs(3,size=50) # chi-squared
error = stats.norm.rvs(size=50,loc=0,scale=1.5)
y = 2.5 + 1.2*x + error
stats.linregress(x,y)
LinregressResult(slope=1.262568027049048, intercept=2.4399994448207343, rvalue=0.9310325019777308, pvalue=1.1890093549402353e-22, stderr=0.0714309380687254)
plt.figure(figsize=(8,5))
sns.regplot(x,y)
slope_y = x*1.26+2.44
sns.lineplot(x,slope_y)
plt.show()