import matplotlib.pyplot as plt
import pandas as pd
from scipy import stats
import numpy as np
离散型随机变量样本的频数分布:
pd.Series(xxx).value_counts() # 生成频数
pd.Series(xxx).value_counts()/size # 生成频率
stats模块中的 gaussian_kde() 可以估计序列的概率密度,使用 cumsum() 得出序列的累积分布概率密度。
# example 1
hs300 = pd.read_csv('return300.csv')
density = stats.kde.gaussian_kde(hs300.iloc[:, 1])
bins = np.arange(-5, 5, 0.02)
plt.subplot(211)
plt.plot(bins, density(bins))
plt.title('概率密度曲线图')
plt.subplot(212)
plt.plot(bins, density(bins).cumsum())
plt.title('累计分布函数图')
plt.show()
# example 2
wage = pd.read_csv('Bwages.csv')
plt.subplot(311)
plt.hist(wage.wage, density=True) # 频率直方图
plt.subplot(312)
plt.hist(wage.wage, density=True, cumulative=True) # 累积分布直方图
kde = stats.gaussian_kde(wage.wage)
bins = np.linspace(0, 50, num=200)
plt.subplot(313)
plt.plot(bins, kde(bins).cumsum()) # 累积分布函数图
plt.show()
生成二项分布随机数 binomial(n, p, size=None)
num = np.random.binomial(100, 0.5, 20)
二项分布概率质量函数:
N次试验中有n次 A现象(出现概率为p)出现的概率 stats.binom.pmf(n, N, p)
bino = stats.binom.pmf(50,100,0.5) # 100次试验中50次硬币正面朝上的概率值
二项分布累积分布函数:
N次试验中有不大于n次 A现象(出现概率为p)出现的概率 stats.binom.cdf(n, N, p)
history = pd.read_csv('history.csv', index_col='date')
revenue = len(history[history.Emerging_Markets > 0])
loss = len(history[history.Emerging_Markets < 0])
p = revenue / (revenue + loss)
p_revenue = 1 - stats.binom.cdf(6, 12, p) # 12个月中6个月以上月份盈利的概率
print(revenue, loss, p, p_revenue)
生成正态分布随机数 normal(loc=0.0, scale=1.0, size=None)
Norm = np.random.normal(size = 5)
生成正态分布随机数的密度值 pdf()
norm_pdf = stats.norm.pdf(Norm)
生成正态分布随机数的累计密度值 cdf()
norm_cdf = stats.norm.cdf(Norm)
获取累计密度值为0.05的分位数 ppf(0.05, 均值,标准差)
(正态分布应用——VaR)
q = stats.norm.ppf(0.05, r_mean(), r_var()**0.5) # -1.817673%;即95%的概率损失不会超过1.817673%
# 绘制不同均值和方差的正态分布的概率密度函数
norm_bins = np.linspace(-5, 5, num=200)
plt.plot(norm_bins, stats.norm.pdf(norm_bins, 0, 1), label='N(0,1)', color='r')
plt.plot(norm_bins, stats.norm.pdf(norm_bins, 0, 0.5 ** 0.5), label='N(0,0.5)', color='yellow')
plt.plot(norm_bins, stats.norm.pdf(norm_bins, 0, 2 ** 0.5), label='N(0,2)', color='blue')
plt.plot(norm_bins, stats.norm.pdf(norm_bins, 2, 1), label='N(2,1)', color='green')
plt.legend()
plt.show()
ξ₁、ξ₂、……、ξn 均独立同标准正态分布,则其平方和为服从自由度为n的卡方分布。
卡方分布以0为起点,分布是非对称的,服从卡方分布的随机变量值不可能取负值。自由度为n的卡方分布,其期望值为n,方差为2n。
# 自由度为3的卡方分布图
plt.plot(np.arange(0, 5, 0.002),stats.chi.pdf(np.arange(0, 5, 0.002), 3))
plt.show()
t分布概率密度曲线是以0为中心、左右对称的单峰分布(“尖峰厚尾”);其形态变化与自由度n的大小有关——自由度越小,分布越分散;自由度越大,变量在其均值周围的聚集程度越高,也越接近标准正态分布曲线(当自由度为30时,t分布已经接近标准正态分布曲线)。
x = np.arange(-4, 4, 0.004)
plt.plot(x, stats.norm.pdf(x), label='Normal', ls='-')
plt.plot(x, stats.t.pdf(x, 5), label='df=5', color='r')
plt.plot(x, stats.t.pdf(x, 30), label='df=30', color='b')
plt.legend()
plt.show()
两个独立的随机变量Z,Y,且一个为服从自由度为m的卡方分布,一个为服从自由度为n的卡方分布,则变量(Z / m) / (Y / n)为服从第一自由度为m、第二自由度为n的F分布,即F~(m,n)。
取值范围为非负,其期望和方差存在与否依赖于第二自由度n:n>2,存在期望;n>4,存在方差。
也为非对称分布。
plt.plot(np.arange(0, 5, 0.002), stats.f.pdf(np.arange(0, 5, 0.002), 4, 40))
plt.show()
X~Exp(λ)
bins = np.linspace(0, 1000000, 100000)
plt.plot(bins, stats.expon.pdf(bins, scale=50000))
plt.show()
X~Lognormnal(μ, σ2)
[Y=lnX 服从正态分布]
log_bins = np.linspace(0, 10, num=200)
plt.plot(log_bins, stats.lognorm.pdf(log_bins, 1, 0, 1))
plt.show()
plt.scatter(A, B)
plt.xlabel('A')
plt.ylabel('B')
plt.show()
corr_A_B = A.corr(B)